X
تبلیغات
برنامه نویسی به زبان سی شارپ - آموزش زبان سی شارپ
به نام خدا

برخی از بازدید کنندگان محترم خواستار روشی اصولی برای یادگیری سی شارپ هستند که به نظر من از

آنجایی که زبان های مختلف دارای Syntax های تقریبا یکسان هستند ، پس یادگیری Syntax فقط می تواند

پایه ای برای دیگر آموزش ها باشد  و  مهم تر از Syntax ، یادگیری توابع کاربردی آن زبان است :

1- یادگیری توابع کار با فایل

2- یادگیری توابع کار با پایگاه داده و مدل های پایگاه های داده ای

3- یادگیری توابع کاربردی مانند توابع ریاضیاتی

4- یادگیری توابع رسم و گرافیک

5- یادگیری توابع API مربوط به سیستم عامل

6- یادگیری در هنگام انجام پروژه یعنی  هرجا که  به مشکل برخوردید به سایت MSDN رفته و آنجا تابع را

با توضیحاتش ببینید یا به فرومی نظیر اینجا بروید .

7- دیدن سورس کدهای دیگر از سایت هایی نظیر اینجا

8- نوشتن برنامه های ساده که به چشم نمی آیند.(باعث کسب تجربه میشود.)

9- پیاده سازی الگوریتم های مختلف  برای مسائل مختلف ( جستجو ، مرتب سازی ، ضرب اعداد صحیح و ...)

10- یاد گیری موتور XNA جهت تولید بازی های سه بعدی بر پایه DirectX

-----------------------------------------------------------------------------

در حقیقت چوب جادویی موجود نیست که با آن چوب جادویی ، شما یک سی شارپ دان کامل شوید .

و اگر کسی این چوب جادو را داشت ،  این چوب بدردش نمیخورد چون در حقیقت هنر تولید یک برنامه عبارت

 است از  حل مساله مد نظر برنامه با کارایی بالا . که این شامل طراحی ساختار برنامه نیز میشود.

فراموش نکنیم که زبان برنامه نویسی خود ابزاری است که بوسیله آن شما فکر خود را به کامپیوتر می فهمانید.

به نظر من اجرای روش های 6 و 7 و 8 بالای برای کسانیکه کمی با سی شارپ آشنایی دارند ، باعث پیشرفت

میشود.

مورد 10 نیز خیلی باعث پیشرفت میشود چون برنامه نویس سریعا خروجی عجیب ( سه بعدی )کارش را می بینید.

در کل کتاب خواندن خوب است اما اینطور که من متوجه شده ام ، دیدن خروجی ها (حتی اندک) اما به سرعت

خیلی باعث دلگرمی و پیشرفت میشود. برای کتاب هم ، یک کتاب سبک و بدرد بخور در زیر آمده است که

دانلود نمایید :

دانلود کتاب Illustrated CSharp از Daniel Solis

----



برچسب‌ها: اطلاعیه, آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در یکشنبه سی ام تیر 1392 و ساعت 20:39 |
به نام خدا

در سایت زیر آموزش برنامه نویسی موازی برای سی شارپ گذاشته شده است :

سایت البحاری

نسخه فارسی مطالب سایت فوق که در خود سایت قرار داده شده است را می توانید از لینک زیر دانلود نمایید :

دانلود آموزش فارسی مطالب البحاری

--

درباره جوزف البحاری : 

وی نویسنده کتب سی شارپ برای انتشارات O'Reilly می باشد . کتاب های وی عبارتند از :

LINQ Pocket Reference

C# 3.0 Pocket Reference

C# 3.0 In Nutshell

C# 4.0 Pocket Reference

C# 4.0 In Nutshell

C# 5.0 Pocket Reference

C# 5.0 In Nutshell

وی همچنین یک برنامه کاربردی برای دیتابیس بنام Linqpad نوشته است .


برچسب‌ها: آموزش زبان سی شارپ, برنامه نویسی موازی
+ نوشته شده توسط سید احمد پرخید در سه شنبه هفتم خرداد 1392 و ساعت 0:30 |

به نام خدا

در سورس کد زیر خواهید دید که چگونه میشود فایل ها را از سیستم خود کشیده و در لیست باکس فرم خود

رها کنید و فایل ها به آن اضافه شوند :

کد برنامه :

private void listBox1_DragDrop(object sender, DragEventArgs e)
{
	string [] allfiles = (string[])e.Data.GetData(DataFormats.FileDrop,
 false); int n = allfiles.Length; for (int i = 0; i < n; i++) listBox1.Items.Add(allfiles[i]); } private void listBox1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.All; else e.Effect = DragDropEffects.None; }

در کد فوق ، در تابع اول ، آدرس یا Filename فایل ها درون یک آرایه String ذخیره میشوند به لیست باکس

اضافه میشوند. اما قبل از آن تابع دوم باید ست شود . این تابع میگوید که هر نوع فایل از اکسپلورر ویندوز را

قبول کن.

در تابع دوم پارامتر DataFormat نوع فایل را برمیگرداند که FileDrop منظور نوع فایل ویندوزی است .


نکته : فقط خاصیت AllowDrop لیست باکس را باید True نمایید.

دانلود سورس کد + فایل اجرایی


برچسب‌ها: سورس کد و برنامه سی شارپ, آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در پنجشنبه دوم خرداد 1392 و ساعت 8:7 |
به نام خدا

یکی از دوستان سوال پرسیده بودند که چگونه میشود از توابع API ویندوز در سی شارپ استفاده کرد . برنامه زیر

4 تابع API را مورد بررسی قرار داده است . دوستان لطفا توجه نمایند در این وبلاگ پروژه انجام نمیشود.

using System.Runtime.InteropServices;
namespace CSharpWin32APICall
{
    public partial class Form1 : Form
    {
        [DllImport("User32.dll")]
        public static extern IntPtr CloseWindow(IntPtr hWnd);
        [DllImport("User32.dll")]
        public static extern IntPtr BringWindowToTop(IntPtr hWnd);
        [DllImport("User32.dll")]
        public static extern IntPtr DestroyWindow(IntPtr hWnd);
        [DllImport("User32.dll")]
        public static extern IntPtr AnimateWindow(IntPtr hWnd, 
int
time, AnimateWindowFlags flags);

در بخش بالا 4 عدد از توابع API را از کتابخانه هایشان فراخوانی کرده ایم . همانطور که واضح است نام کتابخانه

چیزی نیست جز User32.dll .

بعضی از توابع یکسری Flag دارند . ( یک عددی که به عنوان پارامتر به تابع پاس داده میشود و رفتار تابع را مشخص

می کند.)برای مثال در بالا پارامتر سوم تابع AnimateWindow یک فلگ می باشد که نوع انمیشن پنجره را مشخص

میکند. ( مثلا میگوید Fade شو یا به راست برو یا به چپ حرکت کن و ....) برای فراخوانی فلگ ها در زبان های

شی گرا ، از نوع های شمارشی استفاده میشود. یک نوع شمارشی یا enum مانند یک مجموعه است که هر

عضو آن می تواند یک عدد داشته باشد . ( می توانید آن را مجموعه ای از زوج مرتب ها تلقی کنید که یک بخش

آنها نام صفت ، و بخش دیگر مقدار آن است.) برای AnimateWindow خواهیم داشت :

public enum AnimateWindowFlags
        {
            AW_SLIDE = 0x00040000,
            AW_VER_POSITIVE = 0x00000004,
            AW_VER_NEGATIVE = 0x00000008,
            AW_HIDE = 0X40000,
            AW_BLEND = 0X80000,
            AW_ACTIVATE = 0x00020000
        }

برای مثال موقعی که فرم لود میشود ، تابع Animate Window را فراخوانی می کنیم تا فرم به صورت Fade لود

شود :

AnimateWindow(this.Handle, 1000,AnimateWindowFlags.AW_ACTIVATE
                | AnimateWindowFlags.AW_BLEND);

که در کد بالا ، آنجایی که پر رنگ شده است ، دارد از نوع شمارشی بالا استفاده میکند و جای آنها اعداد معادل آنها

قرار میگیرد و به تابع پاس داده میشوند. پارامتر دوم نیز زمان به میلی ثانیه است که در اینجا 1000 برابر یا یک ثانیه

است.

بقیه توابع یک پارامتر عدد صحیح دارند که ID فرم است که باز شده است . این ID نامش HWND یا به عبارتی

Window Handle می باشد. برای دسترسی به این شماره در سی شارپ از عبارت this.Handle استفاده میکنیم.


دانلود سورس کد + فایل اجرایی



برچسب‌ها: سورس کد و برنامه سی شارپ, آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در پنجشنبه نوزدهم اردیبهشت 1392 و ساعت 22:51 |
به نام خدا

در بعضی از موارد لازم است که یک متغیر از جنس object را به متغیری متداول مانند int تبدیل نماییم.

برای مثال در property زیر ما می خواهیم به هنگام ست کردن ، مقدار value را که از جنس object است را

به int و سپس string تبدیل نماییم ، به همین دلیل می نویسیم :

public string ID
{
  get
  {
    return id;
  }
  set
  {
    idval = Convert.ToInt32(value).ToString();
  }
}

پس برای اینکار ها ما باید از کلاس Convert استفاده نماییم. این کلاس حاوی متدهایی است که انواع Type ها

را به یکدیگر تبدیل می نماید.

نکته : برای تبدیل کردن string ها می توان از shortcut زیر استفاده کرده :

int.parse(string s)

اما برای دیگر type ها باید از کلاس Convert استفاده کرد.


برچسب‌ها: آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در چهارشنبه چهارم اردیبهشت 1392 و ساعت 14:11 |
به نام خدا

بعضی مواقع لازم است که ، زمان الگوریتم را محاسبه نماییم. در سی شارپ به صورت زیر از

کلاسی به نام کلاس StopWatch استفاده می کنیم :

public static void Main(string[] args)
 {
     System.Diagnostics.Stopwatch sw = 
              new System.Diagnostics.Stopwatch(); 
     sw.Start();
     for (int i = 0; i < 5000000; i++)
     {
         //ول بگرد
     }
     sw.Stop();
     Console.WriteLine(sw.ElapsedMilliseconds);
     Console.ReadLine();
 }

همانطور که در بالا مشهود است ، با دو تابع start و stop در قبل و بعد از کار حجیم ، تایمر را On و Off می کنیم

و سپس با Property ها یعنی ،Elapsed یا ElapsedMilliseconds می توانیم زمان سپری شده را بدست بیارویم.


نکته ها :

الف - اگر از ElapsedMilliseconds استفاده نماییم ، آنگاه آن را باید 1000 تقسیم کرد تا به ثانیه تبدیل شود. 

ب - این کلاس در فضا نام ( namespace ) کاربردی و سیستمی System.Diagnostics قرار دارد.


برچسب‌ها: آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در پنجشنبه بیست و هشتم دی 1391 و ساعت 17:36 |
به نام خدا

فرق checked با unchecked در چیست ؟

خوب یک عدد صحیح 4 بایتی بدون علامت چه بازه ای را نشان میدهد :

جواب واضح است : 2 به توان 32 یعنی : 4294967296 منهای یک یعنی 4294967295

پس بازه یک int بدون علامت از صفر تا 4294967295 است.

اما از آنجایی که یک int هم منفی است و هم مثبت ، پس این بازه تقسیم بر دو میگردد :

پس بازه یک int عبارت است از 2147482648- تا 2147483647

اگر از دستور unchecked به صورت زیر استفاده کنیم ، کامپایلر overflow را چک نمیکند و به اول بازه یعنی

2147482648- برمیگردد و آن را نشان میدهد :

int x = 2147483647;
unchecked
{
x++;
}
Console.WriteLine(x);

ولی اگر از checked استفاده کنیم ، کامپایلر ، سرریز یا overflow را چک میکند و چون x+1  از بازه int

بیرون می افتد ، کامپایلر خطا میدهد و OverflowExecption را به طرز جالبی throw می کند.

کد زیر ، خطا میدهد :

int x = 2147483647;
checked
{
x++;
}
Console.WriteLine(x);


به هر حال ما فقط در مواقعی خاص برای بعضی از الگوریتم ها از unchecked یا checked استفاده می کنیم.




برچسب‌ها: آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در سه شنبه هفتم آذر 1391 و ساعت 22:26 |
به نام خدا

اگر شما از کسانی هستید که فکر می کنید میدانید رابط چیست ، اما تا به حال از آن استفاده نکرده اید ، پس

شما را دعوت به خواندن این چند خط می کنم .

رابط چیست ؟ چیز مهمی نیست !

وقتی یک کلاس ، از یک رابط به ارث میبرد ( آن را پیاده سازی می کند) یعنی در واقع دارد ادای آن رابط را 

تقلید میکند و در می آورد.

وقتی یک آدم خود را پولدار نشان میدهد و ادای آدم پولدارها را درمی آورد ، یعنی آن آدم اصلا پولدار نیست

و هیچ خصوصیت یا صفت یا Field از آدم پولدارها ندارد.

مثلا من اگر بخواهم خودم را پولدار نشان دهم ، می گویم مثلا من 10000000 تومان پول دارم.

ولی اگر شما بخواهید خود را پولدار نشان دهید ، می گویید من سوار دودج چالنجر 2012 شده ام....

پس هر کس یک ادا را می تواند هزار جور در آورد.

پس رابط مجموعه ای از ادا ها (Function) ی بدون بدنه است و بدنه آنها را شخصی تعریف میکند که دارد آن را

پیاده سازی میکند.پس چون صرفا یک اداست و چیزی از خود ندارد ، پس هیچ Field در رابط تعریف نمیشود.

توابعی که در رابط هستند ، بدون Modifer های Public یا Private هستند ، چون شاید پیاده کننده بخواهد

بعضی از اداهایش را نشان دهد و شاید بعضی ها را بخواهد مخفی یا Private کند.

در زیر یک مثال از رابط آمده است :

فرض کنید ، یک پسر بچه کوچک داریم که می خواهد ادای پلیس را در آورد : 

interface IPolice
{
  void shot();
}

class boy:IPolice
{
 .
 .
 .
public void shot(){
  this.gun.BironBiadAzGhalaf();
  this.gun.fire(); 
 }
 .
 .
 . 
}

همانطور که میبیند بچه کوجک ، تابع Shot را یک طوری پیاده کرده است ، اما یک پلیس واقعی به صورت زیر

شلیک میکند : 

interface IPolice
{
 void shot();
}

class PoliceMan : IPolice
{
 .
 .
 .
 void shot()
 {
   for(int i=0;i<3;i++){
     DadBezan("Ist");
   }
   if(enemy.stopped)
   {
     return;
   }
   else
   {
     this.gun.hadafBegir(enemy.leg);
     this.gun.fire();
   }
 }
 .
 .
 .
}

همانطور که در کد مشخص است ، پلیس واقعی بعد از سه بار هشدار بعدا به پای دشمن شلیک میکند.

پس پیاده سازی ها متفاوت بود برای دو کلاس متفاوت .

سوال در مورد رابط در بخش نظرات پرسیده شود.


برچسب‌ها: آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در پنجشنبه هجدهم آبان 1391 و ساعت 15:50 |
به نام خدا

در سی شارپ ما می توانیم نوع های Null-able یا هیچ مقدار پذیر داشته باشیم.خوب همه ما می دانیم

که مثلا یک int که 32 بیت باشد ، مقادیر عدد صحیح  حداکثر تا 65536 را می پذیرد.(16 بیت برای اعداد منفی

به کار میرود در روش Two's Complement )

به هر حال هنگامیکه در پایگاه داده با Entity Framework یا Linq To SQL کار میکنیم، به چیزی مانند int? x=null

بر می خوریم.وقتی یک جدولی را در بانک می سازیم ، به گزینه Allow Nulls دقت کنید :

مثلا ستون ID که یک Primary Key است نباید خالی بماند و ستون Title میتواند خالی بماند ، در کد سی شارپ

می توان از کامپایلر کمک گرفت که چک کند که آیا فلان نوع که باید حتما مقدار میگرفته ، گرفته است یا خیر؟

برای تعریف آنها داریم :

int? ID=null;//nullable type
string Title;//non-nullable type
نکته مهم ، namespace این نوع که System.Nullable است باید در بالا Add شود.
به نوع های Nullable مانند ID دو خصوصیت HasValue و GetValueOrDefault اضافه میگردد که از اسمشان ، کارشان پیداست.



برچسب‌ها: آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در سه شنبه یازدهم مهر 1391 و ساعت 19:32 |
به نام خدا

XAML مخفف eXtensible Markup Language می باشد ، و Zamel خوانده میشود. و حالا ،

کاربردش چیست ؟

XAML کاربردش در طراحی UI می باشد و در سه مورد زیر از آن استفاده شده است : 

Windows 8 Merto

Windows Phone

Silverlight

از مزیت آن می توان ، ساختار سلسه مراتبی آن را نام برد که در کد سی شارپ معمولی ،

چنین چیزی نیست.مثلا در این ساختار در یک Panel اگر یک تکست باکس باشد ، و یک دکمه،

کد آن در XAML به صورت زیر است :

<Grid Height="130" HorizontalAlignment="Left"
 Margin="67,44,0,0"
Name="grid1"
 VerticalAlignment="Top" Width="273"> <TextBox
Height
="23"
 HorizontalAlignment="Left"
 Margin="72,21,0,0"
Name
="textBox1"
VerticalAlignment="Top"
Width="120" /> <Button Content="Submit"
Height="27"
HorizontalAlignment="Left"
Margin
="72,58,0,0"
Name
="button1"
VerticalAlignment
="Top"
Width="86" /> </Grid>

نکته : در XAML نام کنترل ها کمی تغییر کرده است ، مثلا به Label می گوییم TextBlock و یا به

Panel می گوییم Grid.

از عیب آن این است که سرعت Parse آن پایین است .


برچسب‌ها: آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در سه شنبه هفتم شهریور 1391 و ساعت 2:33 |
به نام خدا

اگر از SQL Lite 3.5  و Entity Framework استفاده می کنید ، باید خدمتتان عارض شوم که اگر یک ستون با خاصیت Identity دارید و قرار است به صورت اتوماتیک تغییر کند و اضافه شود ، به پیغام خطایی بر خواهید خورد.

برای رفع مشکل باید ، خاصیت AutoKey را حذف نماید و به صورت زیر مشکل را حل کنید :

var luser = (from u in db.Users orderby u.ID descending select u)
.FirstOrDefault();
            if (luser == null)
            {
                user.ID = 0;
            }
            else
            {
                user.ID = luser.ID +1;
            }

در کد فوق منظور از luser همان last_user است ، و چون در SQL Lite 3.5 ما نمی توانیم از تابع Last استفاده کنیم به صورت بالا ، آی دی آخرین یوزر را در می آوریم.

دانلود سورس کد اجرایی


برچسب‌ها: آموزش و کد ASP, آموزش زبان سی شارپ, سورس کد و برنامه سی شارپ
+ نوشته شده توسط سید احمد پرخید در یکشنبه پانزدهم مرداد 1391 و ساعت 12:24 |
به نام خدا

سلام ، در کار با اسکرول بار ها باید همیشه کمینه و بیشنه حرکت را فهمید و آنوقت با یک تناسب بین مقدار

ScrollBar که مثلا بین 0 تا 100 است و این کمینه و بیشینه ، اسکرول را انجام  دهیم.


مثلا در عکس بالا یک Label درون یک Panel است و Height  آن از Panel بیشتر است اما چون درون آن است ، دیگر نمایش داده نمی شود.

به آن قسمتی که دیده میشود Thumb می گویند . خوب خیلی واضح است که مقدار Top کنترل Label بین مقادیر زیر تغییر میکند :

0<LabelTop<-Label.Height+Panel.Height

با مرتب سازی نامساوی  بالا خواهیم داشت : 

0<LabelTop<Panel.Height-Label.Height

و مقدار اسکرول هم بین  Range زیر است :

0<VScroll<100

خوب با یک تناسب ساده داریم :

LabelTopVScroll
Panel.Height -Label.Height100
x50

پس خواهیم داشت :

x=T_Val =ScrollBarValue*(Panel.Height -Label.Height)/100


توجه : خاصیت LargeChange باید مساوی یک شود.


دانلود سورس کد و فایل اجرایی به صورت غیر مستقیم



برچسب‌ها: آموزش زبان سی شارپ, سورس کد و برنامه سی شارپ
+ نوشته شده توسط سید احمد پرخید در یکشنبه پانزدهم مرداد 1391 و ساعت 1:19 |

به نام خدا

سلام فرض کنید ، حالا که ترم تحصیلی تمام شده است ، استاد دانشگاه فیفیستان قصد دارد نمرات بچه هایش را بررسی کند و نام برترین ها را بفهمد و روی گردن آنها یک طوق بیاندازد و با آفتابه آنها را دور حیاط دانشگاه بچرخاند.حال او یک کلاس درست می کند که حاوی نام ، شماره دانشجویی ، نمره است . او باید یک لیست از بچه های  دانشگاه درست کند و مشخصات آنها را ذخیره نماید. پس او اینکار را میکند :

public class Student

{

  public int ID;

  public string Name;
 
  public int score;

}   

IList<Student> stdudents_of_fifi = new List<Student>()

{

  new Student{ID=1,Name="Ahmad",score=11},

  new Student{ID=2,Name="Hosien",score=12},

  new Student{ID=3,Name="Javad",score=15},

  new Student{ID=4,Name="Kazem",score=10},

  new Student{ID=5,Name="Kami",score=18},

  new Student{ID=6,Name="Reza",score=20},

  new Student{ID=7,Name="Ali",score=13},

  new Student{ID=8,Name="Mohsen",score=20},
 
  new Student{ID=9,Name="Soheil",score=15},

  new Student{ID=10,Name="Sadegh",score=14},

  new Student{ID=11,Name="Poria",score=16}

};

 

حال باید یک دستور یا query بنویسد تا لیست بچه های درسخوان و منفور را بیابد و آبرویشان را ببرد.پس او اینکار را به صورت زیر میکند :

var people_top = from std in stdudents_of_fifi

                 where std.score > 15

                 select std;

معنی کد بالا این است ، یعنی ای سی شارپ ، ای LINQ  ، ای خفن ، توی همه بچه های دانشگاه فیفی ، اون نخاله های درسخون رو بیاب و توی people_top ذخیره کن. حال وقت آنست که آبرویشان برود ، پس با یک foreach، حالشنو میگیره، یعنی نام و شماره و نمره و نام پدر و .... میزنه روی برد دانشگاه تا مرحله بعدی برسه به آفتابه :

foreach(var student in people_top)
    Console.WriteLine("\t\t{0}\t\t{1}\t\t{2}",student.ID,
student.Name,student.score);

 


مرحله بعدی دیگه زبان سی شارپ کشش نداره ، باید به زبانی هایی نظیر PL/1 و یا Snobol4 پناه ببریم. از نوشتن کد آفتابه معذوریم.


دانلود سورس کامل برنامه بهمراه فایل اجرایی


برچسب‌ها: سورس کد و برنامه سی شارپ, آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در چهارشنبه چهارم مرداد 1391 و ساعت 23:2 |
به نام خدا

قدرت Lambda Expression ها در دو پست  قبل  ، خوب نشان داده نشده است ، بلکه در این پست کمی بهتر نشان داده شده است.یعنی قدرت وقتی است که lambda Expression ها را با Linq ادغام کنیم و کار زمانی جالب تر میشود که آنرا با چیزی به نام Linq To Sql ترکیب کنیم.

همانطور که می بینید ، در Where با Lambda Expression مشخص کردیم که نمرات بالای 13 را استخراج کن و سپس میانگین آنها را در query ذخیره کن.

static void Main(string[] args)
        {
//یک لیست از نمرات دانشجویان دانشگاه بنگلادش

  IList<float> points = new List<float> { 12, 18,
15
, 19, 13, 15, 11, 10, 20, 19.5f };
//اجرای عملیات با عبارت های لاندا
var query = points.Where(x => x > 13) .Average(); Console.WriteLine("Averge points >13 is {0}.",(float)query); Console.ReadKey(); }

توجه : به روش گرفتن Query در بالا ، Method Syntax می گویند.

دانلود سورس کد + فایل اجرایی


برچسب‌ها: سورس کد و برنامه سی شارپ, آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در جمعه بیست و سوم تیر 1391 و ساعت 18:19 |
به نام خدا

در این بخش سعی شده است که یک اشاره کوچک به عبارت های لاندا یا Lambda Expressions در زبان سی شارپ شود و با این موارد شما را آشنا نماییم.

اول به کد زیر نگاه کنید : (اگر با delegate ها آشنایی ندارید اینجا را کلیک کنید.)

public class Program
    {
        delegate int PowerCalculator(int x);
        public static void Main(string[] args)
        {
            PowerCalculator powerCalculator = z => z * z;
            Console.WriteLine(powerCalculator(5));
            Console.ReadKey();
        }
    }

خب همانطور که در کد بالا دیدید ، Lambda Expression ها مانند توابع inline در ++C هستند ، یعنی عملیات یک تابع را درجا مشخص می کنیم ، و تابع ای که delegate آن یک int  می گیرد و یک int برمیگرداند را به صورت در جا یک body برایش نوشتیم و فراخوانی اش کردیم.(البته حتما لازم نیست بعد از طراحی بدنه تابع، تابع را فرابخوانیم.)

در حقیقت عبارت زیر یک عبارت لاندا است ، که سمت چپ آن ورودی و سمت راست آن محاسبات است :

z => z * z;

دانلود سورس کد + فایل اجرایی


برچسب‌ها: سورس کد و برنامه سی شارپ, آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در جمعه بیست و سوم تیر 1391 و ساعت 0:29 |

به نام خدا

دیدم بازدید کنندگان این وبلاگ محترم و حرفه ای هستند ، گفتم یک آموزش حرفه ای برای حرفه ای ها بگذارم :

رویداد ها

رویداد یک عضو از کلاس است.

یک رویداد یک نوع تابع delegate دارد.

رویداد در خارج از کلاس به یک تابع اشاره میکند.

تابع اشاره شونده توسط  رویداد ، باید منطبق با delegate رویداد باشد.

یعنی در محیط بیرون از کلاس ، رویداد به یک نوع تابع منطبق با delegate آن اشاره می کند و در بیرون از آن کلاس باید حتما برای آن تابع بدنه ایجاد کنیم.

یعنی کد رویداد در بیرون برنامه مشخص می شود که به تابع حاوی کد رویداد در بیرون برنامه EventHandler می گوییم.

هر Event_Handler می تواند هر نامی داشته باشد.

فرم کلی تعریف رویداد در کلاس :

public event DelegateTypeName EventName(Parameters)

مثالی از رویداد

کلاسی با نام ماشین را در نظر بگیرد ، در حالت پیش فرض رنگ ماشین مشکی است. یک رویداد برای آن تعریف می کنیم. این رویداد ، زمانی فراخوانی میشود که رنگ ماشین تغییر کند.وقتی این رویداد فراخوانی شود ، یک پغام روی صفحه چاپ می شود و میگوید که رنگ ماشین تغییر کرده است.

مرحله اول نوشتن کلاس Car :

public class Car

    {

        private string _name;

        private System.Drawing.Color _color;

        public Car(string name)

        {

            _name = name;

            _color = System.Drawing.Color.Black;

        }

        public System.Drawing.Color Color

        {

            get

            {

                return _color;

            }

            set

            {

                ;

            }

           

        }

    }

مرحله دوم اضافه کردن یک رویداد است ، برای اینکار اول یک delegate اضافه میکنیم :

به کلاس فوق ، خط زیر را در جای زیر اضافه می کنیم :


public class Car{
 private delegate void PrintChangedEvent(Car x);


حال خط زیر که حاوی رویداد است را نیز اضافه میکنیم :

public class Car

    {

        private delegate void PrintChangedEvent(Car x);

        private event PrintChangedEvent OnColorChanged;

همانطوری که می بینید ، اول اسم رویداد با On شروع شده است ، این یک نام گذاری معمول است.

نکته :  نمیشود delegate دسترسی آن private باشد ، اما رویداد public باشد یا بر عکس.به همین منظور ، نوع رویداد را public  می کنیم و delegate در فضانام و خارج از کلاس با سطح دسترسی public تعریف می کنیم :

public delegate void PrintChangedEvent(Car x);

   public class Car

    {

        public event PrintChangedEvent OnColorChanged;

حال باید بگوییم که رویداد قرار است ، چه موقع فراخوانی شود ، معلوم است ،جایی که رنگ تغییر میکند ، یعنی در Set کردن Color :

public System.Drawing.Color Color

        {

            get

            {

                return _color;

            }

            set

            {

                if (_color != value)

                {

                    _color = value;

                    OnColorChanged(this);

                   

                }
  _color = value;
} }

یعنی اگر رنگ جدید ، همان رنگ فعلی نبود رویداد را فراخوانی کن ، که برود به تابع که منطبق با delegate خودش است را و به آن اشاره میکند را اجرا کند.

حال در کلاس Progarm چنین عمل می کنیم :


public class Program

    {

        static void Main(string[] args)

        {

          Car car = new Car("BMW");

          car.OnColorChanged += new PrintChangedEvent(
car_ColorChanged); car.Color = System.Drawing.Color.Beige; Console.ReadKey(); } static void car_ColorChanged(Car x) { Console.WriteLine("Car color changed to {0}",x.Color); } }


لینک دانلود سورس و فایل اجرایی

تمام

 


برچسب‌ها: آموزش زبان سی شارپ, آموزش شی گرایی, سورس کد و برنامه سی شارپ
+ نوشته شده توسط سید احمد پرخید در جمعه شانزدهم تیر 1391 و ساعت 23:42 |
به نام خدا

لینک بخش اول (  اگر بخش اول را ندیده اید...)

تعریف دوم delegate : چیزی است که یک متد با signature خاص را بسته بندی ( Encapsulate ) می کند.

در این بخش می خواهم به معرفی anonymous method ها بپردازم. از نامش معلوم است که یکسری متد داریم که این متد ها بی نام و نشان هستند ، یعنی نامی ندارند.این توابع به صورت در جا یا (inline) تعریف میشوند ، مثلا فرض کنید ما می خواهیم یک متد بنوسیم که نام فردی را به عنوان ورودی میگیرد و آن را چاپ میکند ، راهش این است که یک متد به صورت زیر تعریف کنیم و برنامه main آن را فراخوانی کند :

static void Print(string name)
        {
            Console.WriteLine(name);
        }
        static void Main(string[] args)
        {

            Print("Ahmad");
            Console.ReadKey();
        }

خروجی برنامه بالا Ahmad است . حال اگر بخواهیم از anonymous method ها استفاده کنیم ، باید اول یک delegate که به توابعی که یک ورودی string دارند، اشاره می کنند ،تعریف کنیم :

class Program
    {
        delegate void PrinterNameDelegate(string name);

حال ، در برنامه اصلی خواهیم نوشت :

static void Main(string[] args)
        {
            PrinterNameDelegate printFunction = delegate(string name)
            {
                Console.WriteLine(name);
            };
            printFunction("Ahmad");
            Console.ReadKey();
        }

اولین مزیت فعلا این است ، که دیگر از شر متد static خلاص شدیم.دومین مزیت اینست که خوانایی بالا رفته است.سومین مزیت این است ، تابع printFunction  ، ببخشید ،یک delegate به نام printFunction می تواند به همه توابعی که یک ورودی string دارند و خروجی آنها void است اشاره کند.اما کاربرد های اصلی را بعدا خواهیم دید.


برچسب‌ها: آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در سه شنبه سیزدهم تیر 1391 و ساعت 18:12 |
به نام خدا

خیلی واقعا بد است که بعضی ها ، با delegate مانند یک موجودی برخورد می کنند که حتما باید حفظش کنند یا چند سال است که دارند با سی شارپ کار میکنند و هنوز از این امکان زبان بی خبرند یا استفاده نمی کنند.در اصل delegate چیزی جز یک کلاس نیست. یک کلاس است که ممکن است ورودی یا خروجی داشته باشد و می تواند به متد ها یا هر جای دیگر پاس داده شود.

مثال یک : استفاده کاربردی از delegate ها

ما در کلاس اصلی ، به صورت زیر یک delegate تعریف می کنیم :

class Program
    {
        delegate int MathOperation(int x,int y);
همانطور که می بینید ، کلاس MathOperation دو ورودی دارد و یک خروجی عدد صحیح نیز دارد.حال چندتابع با همین ورودی و خروجی  جداگانه تعریف میکنیم در کلاس Program :
        static int Add(int x, int y)
        {
            return x + y;
        }
        static int Sub(int x, int y)
        {
            return x - y;
        }
        static int Mul(int x, int y)
        {
            return x * y;
        }
حال کلاس MathOperation یا همون delegate می تواند چندریختی کند و به هریک از متد های فوق تغییر قیافه دهد :
static void Main(string[] args)
        {
            MathOperation math_operator = new MathOperation(Add);
            Console.WriteLine(math_operator(4, 5));
            math_operator += new MathOperation(Sub);
            Console.WriteLine(math_operator(4, 5));
            Console.ReadKey();
        }
خروجی های روی مانیتور به ترتیب 5+4 و 5-4 خواهد بود.چرا که اول به Add اشاره میکند و بعدا به Sub اشاره می کند . حال شما کد فوق را کاری کنید که به Mul اشاره کند و مقدار 20 را چاپ کند .

مثال 2 : جالب تر وقتی است که delegate به عنوان یک پارمتر به متد ارسال شود  :
static int Calculate(int x,int y,MathOperation m_op_delegate)
        {
            return m_op_delegate(x, y);
        }
در برنامه main از تابع فوق به صورت زیر استفاده میشود و به m_op_delegate در بالا ما تابع عمل کنند یا Handler می گوییم :

static void Main(string[] args)
        {
            MathOperation math_operator = new MathOperation(mul);
            Console.WriteLine(Calculate(5, 4, math_operator));
            Console.ReadKey();
        }
خروجی 20 روی صفحه چاپ می شود.

تمام

برچسب‌ها: آموزش زبان سی شارپ
+ نوشته شده توسط سید احمد پرخید در دوشنبه دوازدهم تیر 1391 و ساعت 19:36 |