Delegate ها در سی شارپ
با سلام همراهان صفر تا قهرمان…
در این قسمت از سری مقالات سی شارپ قصد داریم به مفهوم Delegate ها در سی شارپ بپردازیم. اگر بخواهیم به طور خلاصه این مفهوم را تعریف کنیم باید بگوییم Delegate چیزی نیست به جز اشاره گر به تابع! اگر با مفهوم اشاره گر آشنایی ندارید اینجا را بخوانید. کاربرد اصلی Delegate زمانی است که بخواهیم از یک متد به عنوان ورودی برای متد دیگر استفاده کنیم که در حالت عادی این کار امکان پذیر نیست. پس با صفر تا قهرمان همراه باشید تا با Delegate و کاربردهای آن آشنا شوید.
Delegate های زبان سی شارپ همانند اشاره گر به تابع در زبان های سی و سی پلاس پلاس است. یک Delegate یک نوع داده ارجاعی است که ارجاع به یک متد را در خود نگه میدارد. Delegate ها بیشتر برای پیاده سازی رویدادها و متدهای پرکاربرد استفاده میشود و به نوعی نیاز به کدهای مضاعف را کاهش میدهد. تمام Delegate ها مستقیما از کلاس System.Delegate منشا میشوند.
تعریف یک Delegate
تعریف کردن Delegate باید دقت کرد که نوع متد مورد نظر ما باید با نوع Delegate ما مطابقت داشته باشد. یعنی اگر Signature متد ما از نوع int باشد باید Delegate ما نیز از نوع int تعریف شود. برای مثال، Delegate زیر را در نظر بگیرید :
public delegate int MyDelegate (string s);
Delegate بالا فقط برای متدهایی که یک پارامتر از نوع رشته ای دارند و نوع بازگشتی آن ها از نوع int است کاربرد دارد. سینتکس کلی برای نوشتن Delegate به صورت زیر است :
delegate <return type> <delegate-name> <parameter list>
نمونه سازی Delegate ها
وقتی که یک Delegate تعریف میشود، یک از آن نیز باید توسط کلمه کلیدی new ایجاد شود و نام متد مورد نظر ما به عنوان پارامتر به آن داده شود. توجه داشته باشید که در این قسمت نباید متد را با پرانتز یا آرگومان به Delegate پاس بدهید. مثال زیر را ببینید:
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile);
مثال پایین نمونه ای از تعریف و نمونه سازی و همچنین استفاده از یک Delegate که میتواند برای ارجاع به متدهایی که پارامتر int دریافت میکنند و همین نوع را باز میگردانند (return میکنند) نشان میدهد.
using System; delegate int NumberChanger(int n); namespace DelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { //create delegate instances //Zerotohero.ir NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); //calling the methods using the delegate objects //zerotohero.ir nc1(25); Console.WriteLine("Value of Num: {0}", getNum()); nc2(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
خروجی کد بالا به صورت زیر است :
Value of Num: 35 Value of Num: 175
در ادامه مثال کامل تری از یک Delegate را خواهیم دید. در این مثال printstring یک delegate است که برای ارجاع به متدهایی که پارامتر آن ها رشته ای بوده و چیزی برنمیگردانند استفاده میشود. ما از این delegate برای صدا زند دو متد، که اولی برای چاپ متن روی صفحه و دومی برای ریختن متن در یک فایل بهره میگیریم. همچنین در این مثال از یک متد برای ورودی به متد دیگر استفاده شد.
using System; using System.Text; using System.IO; namespace csharpDelegates { delegate int NumberChanger(int n); class Program { static FileStream fs; static StreamWriter sw; // delegate declaration public delegate void printString(string s); // this method prints to the console public static void WriteToScreen(string str) { Console.WriteLine("The String is: {0}", str); } //this method prints to a file //zerotohero.ir public static void WriteToFile(string s) { fs = new FileStream("E:\\zerotohero.txt", FileMode.Append, FileAccess.Write); sw = new StreamWriter(fs); sw.WriteLine(s); sw.Flush(); sw.Close(); fs.Close(); } // this method takes the delegate as parameter and uses it to // call the methods as required //zerotohero.ir public static void sendString(printString ps) { ps("zerotohero"); } static void Main(string[] args) { printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile); sendString(ps1); sendString(ps2); Console.ReadKey(); } } }
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.