بایگانی

Posts Tagged ‘Anonymous Method’

نحوه کار کردن با Action delegate

در پست قبل در مورد Func<> delegate و نحوه کار کردن با آن صحبت کردم.اما شاید از خودتان بپرسید اگر بخواهیم از این امکان طوری استفاده کنیم که خروجی نداشته باشیم(خروجی ما void) باشد باید چه کار کنیم.جواب استفاده از Action<> delegate است.

توضیحاتی که در مورد این delegate وجود دارد همان توضیحاتی است که در مورد <>Func داده شده است و تنها تفاوت آنها در خروجی آنها می باشد.البته اگر متد شما پارامتر ورودی ندارد باید از Action به جای <>Action استفاده کنید.

مثال با استفاده از delegate و Named Method :

public delegate void Writer(string path, string content);public static void Main(string[] args)

{

Writer writer = WriteToFile;

writer(@»c:\test.txt», «my name is sajjad»);

}

private static void WriteToFile(string path, string content)

{

StreamWriter sw= null;

try

{

sw= new StreamWriter(path);

sw.Write(content);

}

finally

{

if (sw!= null)

sw.Close();

}

}

مثال با استفاده از Action و Named Method:

public static void Main(string[] args){

Action<string, string> writer = WriteToFile;

writer(@»c:\test.txt», «my name is sajjad»);

}

private static void WriteToFile(string path, string content)

{

StreamWriter sw = null;

try

{

sw = new StreamWriter(path);

sw.Write(content);

}

finally

{

if (sw!= null)

sw.Close();

}

}

مثال با استفاده از Action<> و Anonymous Method :

public static void Main(string[] args){

Action<string, string> writer = delegate(string path, string content)

{

StreamWriter sw = null;

try

{

sw = new StreamWriter(path);

sw.Write(content);

}

finally

{

if (sw != null)

sw.Close();

}

};

writer(@»c:\test.txt», «my name is sajjad»);

}

مثال با استفاده از Action<> و Lambda Expression :

public static void Main(string[] args){

Action<string, string> writer = (path, content) =>

{

StreamWriter sw = null;

try

{

sw = new StreamWriter(path);

sw.Write(content);

}

finally

{

if (sw != null)

sw.Close();

}

};

writer(@»c:\test.txt», «my name is sajjad»);

}

موفق باشید/


Vote on iDevCenter

دسته‌ها:C#.Net برچسب‌ها: , , , ,

نحوه کار کردن با Func delegate

مارس 19, 2010 ۱ دیدگاه

Func<> یک delegate است که یک متد Encapsulate را اجرا میکند.این delegate چند پارامتر را به عنوان ورودی گرفته و یکی از پارامترها را که به صورت TResult مشخص می شود را به عنوان خروجی برمیگرداند.

یکی از Prototype های این delegate به صورت زیر میباشد:

public delegate TResult Func<T1, T2, TResult>(

T1 arg1,

T2 arg2

)

که T1 و T2 پارامترهای ورودی و TResult نتیجه اجرای تابع خواهد بود.شما وقتی از این delegate استفاده میکنید دیگر نیازی به تعریف صریح یک delegate و یک متد نخواهید داشت.با این تعاریف شما با به کار بردن Func یک delegate و یک Encapsulated Method خواهید داشت.در اینجا نحوه کاربردهای متعددی از این delegate را توضیح خواهم داد.

تعریف زیر تعریف یک delegate ساده است که یک متد(به اینگونه متدها که به صورت Explicit تعریف می شوند Named Method گفته میشود که نقطه مقابل Anonymous Method می باشند) را اجرا خواهد کرد.

public delegate string[] SplitString(string param);

public static void Main(string[] args)

{

SplitString split = Split;

string str = «my name is sajjad»;

foreach (string s in split(str))

{

Console.WriteLine(s + Environment.NewLine);

}

}

private static string[] Split(string param)

{

return param.Split(‹ ‹);

}

حال اگر خواسته باشیم با استفاده از Func این کار را انجام دهیم و البته به صورتی که یک Named Method را اجرا کند به صورت زیر خواهد شد:

public static void Main(string[] args)

{

Func<string, string[]> split = Split;

string str = «my name is sajjad»;

foreach (string s in split(str))

{

Console.WriteLine(s + Environment.NewLine);

}

}

private static string[] Split(string param)

{

return param.Split(‹ ‹);

}

نحوه کارکرد کاملا مشخص است و همانند مثال قبل می باشد.پارامترهای ورودی و خروجی تعریف شده در Func با امضای (پارامترهای ورودی و خروجی) تابع Split همخوانی دارد، لدا خواهیم توانست این متد را توسط این delegate اجرا کنیم.

مثالی که در بالا مشاهده کردید مثالی از نحوه کارکرد Func بود که البته یک Named Method را اجرا میکرد.اما چطور یک Anonymous Method را با آن اجرا کنیم؟ اگر تعریف Anonymous Method را میدانید پس خواهید توانست این کار را انجام دهید.به مثال زیر دقت کنید:

public static void Main(string[] args)

{

Func<string, string[]> split = delegate(string s)

{

return s.Split(‹ ‹);

};

string str = «my name is sajjad»;

foreach (string s in split(str))

{

Console.WriteLine(s + Environment.NewLine);

}

}

به همین راحتی…

شما از طریق Lambda Expression هم خواهید توانست این کار را هرچه بهتر انجام دهید.

public static void Main(string[] args)

{

Func<string, string[]> split = (s) =>

{

return s.Split(‹ ‹);

};

string str = «my name is sajjad»;

foreach (string s in split(str))

{

Console.WriteLine(s + Environment.NewLine);

}

}

اگر در مورد Lambda Expression میدانید توجه داشته باشید که در اینجا نیازی به تعریف نوع متغیر نمی باشد.کامپایلر نوع ‘s’ را بر اساس نوع تعریف شده در Func تشخیص میدهد و همانگونه با آن رفتار میکند.

اما مزیت Lambda Expression را در مثال زیر با همان کارکرد بالا می توانید متوجه شوید:

public static void Main(string[] args)

{

Func<string, string[]> split = (s => s.Split(‹ ‹));

string str = «my name is sajjad»;

foreach (string s in split(str))

{

Console.WriteLine(s + Environment.NewLine);

}

}

می بینید که به منظور ساده سازی عبارت ما به چه نحو عمل کردیم.

موفق باشید/


Vote on iDevCenter

دسته‌ها:C#.Net برچسب‌ها: , , , ,

Anonymous Methods

مارس 15, 2010 2 دیدگاه

در C# 3.0 مایکروسافت Lambda Expression را اضافه کرده است. Lambda Expression در زبان های ماقبل Lisp هم استفاده میشده است و مفهوم آن توسط Alonzo Church ریاضیدان آمریکایی در سال 1936 کشف شده است.این عبارات مختصر نویسی برای الگوریتم ها را فراهم می آورد.

پیش از C# 2.0، وقتی یک متد یا متغیر طوری تعریف میشد که به یک delegate نیاز بود، برنامه نویس مجبور بود متدی تعریف کند و جایی که delegate نیاز است آن را پاس دهد.برای مثال حالت زیر را در نظر بگیرید.

public class Common

{

public delegate bool IntFilter(int i);

public static int[] FilterArrayOfInts(int[] ints, IntFilter filter)

{

ArrayList aList = new ArrayList();

foreach (int i in ints)

{

if (filter(i))

{

aList.Add(i);

}

}

return ((int[])aList.ToArray(typeof(int)));

}

}

استفاده از Named Methods

توسعه دهندگان دو نوعند.یکی توسعه دهنده کد و دیگری توسعه دهنده Application است.نوع اول کلاس Common (یعنی هم delegate و هم متد FilterArrayOfInts) را تعریف و آن را به صورت Dynamic Link Library (DLL) در اختیار توسعه دهندگان Application (در اینجا برنامه نویس یاد می شود) قرار میدهد.فرض کنید برنامه نویس بخواهد از این کلاس برای یافتن اعداد فرد یک آرایه استفاده کند.در این حالت باید متد زیر را تعریف کرده :

public class Application

{

public static bool IsOdd(int i)

{

return ((i & 1) == 1);

}

}

و به صورت زیر آن را استفاده نماید

int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int[] oddNums = Common.FilterArrayOfInts(nums, Application.IsOdd);

foreach (int i in oddNums)

Console.WriteLine(i);

خروجی بدین صورت خواهد بود:

1
3
5
7
9

استفاده از Anonymous Methods

شاید همه چیز خوب به نظر برسد اما اینکه شما در همه حالات مجبور به تعریف یک متد خواهید شد کمی خسته کننده خواهد بود.بسیاری از این متدها نیز فقط برای یک بار فراخوانی استفاده خواهند شد که در این حالت ایجاد Named Method برای همه آنها دردسر ساز خواهد بود.برای همین شما می توانید از Anonymous Method ها استفاده کنید تا در این صورت کدنویسی شما خلاصه و همچنین از ایجاد تعداد زیادی از Named Method ها جلوگیری خواهید کرد.مثال زیر می تواند یک Anonymous Method را برای تشخیص اعداد فرد در یک آرایه پیاده سازی کند.

int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int[] oddNums = Common.FilterArrayOfInts(nums, delegate(int i)

{

return ((i & 1) == 1);

});

foreach (int i in oddNums)

Console.WriteLine(i);

خروجی در این مورد نیز مانند قبل است.به عنوان یکی دیگر از کاربردهای Anonymous Method می توان تعریف event ها را مثال زد.

private void Form1_Load(object sender, EventArgs e)

{

button1.Click += delegate(object objSender, EventArgs ea)

{

MessageBox.Show(«I’m Sajjadlove»);

};

}


Vote on iDevCenter

دسته‌ها:C#.Net برچسب‌ها: , , , ,