برای ارتقای انعطافپذیری و استفاده مجدد از کد در برنامههای NET خود و پیادهسازی برنامهنویسی رویداد محور به آسانی از مزایای نمایندگان استفاده کنید.
Delegate نوعی است که به روشی ارجاع میدهد که دارای امضای یکسانی با امضای نماینده است. به عبارت دیگر، delegates برای انتقال متدها به عنوان آرگومان به روشهای دیگر استفاده میشود. میتوانید برای پیادهسازی کنترلکنندههای رویداد و روشهای پاسخ به تماس از مزایای نمایندگان در سی شارپ استفاده کنید. نماینده چندپخشی، نماینده ای است که می تواند به یک یا چند روش که دارای امضاهای یکسان هستند اشاره کند.
درک نمایندگان در سی شارپ
نمایندگان در C# مشابه نشانگرهای تابع در C یا C++ هستند، اما نمایندگان از نظر نوع ایمن هستند. به این معنا که نمایندگان، ارجاعاتی از نوع ایمن هستند که به یک یا چند روش اشاره میکنند که دارای امضاهای یکسان با امضای نماینده هستند. در ادامه این مقاله خواهیم دید که چگونه از نمایندگان چندپخشی برای ارجاع به چندین روش استفاده کنیم.
میتوانید نمایندهای را که به تنهایی میایستد یا درون یک کلاس تودرتو است، اعلام کنید. شما می توانید متدها را به عنوان پارامتر به یک نماینده ارسال کنید تا به نماینده اجازه دهید به متد اشاره کند. و می توانید با فراخوانی نمونه نماینده، متد را فراخوانی کنید.
ابتدا باید روشی ایجاد کنید که نماینده به آن اشاره کند. ما از روش زیر در مثال خود استفاده خواهیم کرد.
void ShowText(string str)
{
Console.WriteLine(str);
}
هنگامی که یک متد داشته باشیم، سه مرحله برای استفاده از نمایندگان وجود دارد: اعلان، نمونه سازی، و فراخوانی. امضای یک نماینده در زیر نشان داده شده است.
delegate result-type identifier ([parameters])
می توانید یک نماینده را همانطور که در عبارت زیر نشان داده شده است، اعلام کنید.
public delegate void MyDelegate(string text);
نماینده اعلام شده در بالا، نام MyDelegate را دارد، نوع بازگشتی از void دارد و یک شی رشته را به عنوان آرگومان می پذیرد. نماینده MyDelegate میتواند به هر متدی که دارای امضای یکسان است اشاره کند، به عنوان مثال، هر متدی که فهرست آرگومان و نوع بازگشتی یکسانی دارد. توجه داشته باشید که امضای روش ShowText ما دقیقاً مشابه امضای MyDelegate است.
قبل از اینکه بتوانید از یک نماینده استفاده کنید، باید نمونه سازی کنید. عبارت زیر نشان می دهد که چگونه می توانید نماینده اعلام شده در بالا را نمونه سازی کنید.
MyDelegate d = new MyDelegate(ShowText);
هنگامی که نماینده را اعلام کردید و نمونهسازی کردید، میتوانید با استفاده از نماینده، روش را فراخوانی کنید.
d("Hello World...");
در اینجا، d نمونه نماینده است. همچنین میتوانید متدی را که نمونه delegate به آن اشاره میکند، با استفاده از متد Invoke() در نمونه delegate فراخوانی کنید.
d.Invoke("Hello World...");
مثال نماینده در سی شارپ
در اینجا لیست کد کاملی برای مثال MyDelegate است که در بالا به آن اشاره کردیم.
using System;
namespace Delegates
{
public delegate void MyDelegate(string text);
class Program
{
public static void ShowText(string text)
{
Console.WriteLine(text);
}
static void Main()
{
MyDelegate d = new MyDelegate(ShowText);
d("Hello World...");
Console.ReadLine();
}
}
}
و در اینجا یک مثال دوم است. فرض کنید متدی دارید که دو عدد را می پذیرد، آنها را با هم جمع می کند و مجموع را برمی گرداند. میتوانید از یک نماینده برای ذخیره مقدار برگشتی متد همانطور که در قطعه کد زیر نشان داده شده است استفاده کنید.
int result = d(12, 15);
در اینجا فهرست کامل کد آمده است.
using System;
namespace Delegates
{
public delegate int MyDelegate(int x, int y);
class Program
{
static int Sum(int x, int y)
{
return x + y;
}
static void Main()
{
MyDelegate d = new MyDelegate(Sum);
int result = d.Invoke(12, 15);
Console.WriteLine(result);
Console.ReadLine();
}
}
}
Multicast نمایندگان در C#
توجه داشته باشید که با استفاده از عملگر + میتوانید چندین شیء نماینده را به یک نمونه نماینده اختصاص دهید. همچنین می توانید نمونه های نمایندگی را با استفاده از روش استاتیک Combine ترکیب کنید. نماینده ای که به چندین نماینده اشاره می کند به عنوان نماینده چندپخشی شناخته می شود.
زمان اجرا یک لیست (به نام فهرست فراخوانی) برای اجرای چندین روش نگهداری می کند. هنگامی که یک نماینده چندپخشی فراخوانی می شود، نمایندگان موجود در لیست به ترتیب اجرا می شوند.
لیست کد زیر نشان میدهد که چگونه میتوانید از متد Combine() برای ترکیب چند نمونه نماینده استفاده کنید.
myDelegate d1 = new myDelegate(Method1);
myDelegate d2 = new myDelegate(Method2);
myDelegate multicastDelegate = (myDelegate)Delegate.Combine(d1, d2);
multicastDelegate.Invoke();
توجه داشته باشید که نمونه های نمایندگی غیر قابل تغییر هستند. هر زمان که نمایندگان را ترکیب میکنید، یا نمونهای از نماینده را از فهرست کم میکنید، یک نمونه نماینده جدید ایجاد میشود تا فهرست جدید یا بهروز شده روشهایی را که باید فراخوانی شود، نشان دهد.
فهرست کد زیر یک نماینده چندپخشی را نشان میدهد. به استفاده از عملگر += برای اختصاص دادن نماینده به چندین روش که دارای امضاهای یکسان هستند توجه کنید.
using System;
namespace Delegates
{
public delegate void MyDelegate();
class Program
{
public static void Method1()
{
Console.WriteLine("Inside Method1...");
}
public static void Method2()
{
Console.WriteLine("Inside Method2...");
}
static void Main()
{
MyDelegate d = null;
d += Method1;
d += Method2;
d.Invoke();
Console.ReadLine();
}
}
}
مزایا و معایب نمایندگان در سی شارپ
در اینجا چند مورد از مزایای نمایندگان وجود دارد که باید به خاطر داشته باشید:
- از نمایندگان می توان برای فراخوانی روش های ایستا و غیر ایستا استفاده کرد.
- از یک نماینده می توان برای فراخوانی یک یا چند روش با امضاهای یکسان استفاده کرد.
- از نمایندگان میتوان برای تعریف روشهای برگشت به تماس و فراخوانی کنترلکنندههای رویداد استفاده کرد.
- نمایندگان میتوانند به نمایندگان چندپخشی ترکیب شوند که زنجیرهای از نمایندگان را به ترتیب اجرا میکنند.
در اینجا برخی از معایب استفاده از نمایندگان آورده شده است:
- یک نماینده کندتر از روش معمولی اجرا می شود زیرا زمان اجرا باید مرجع متد را قبل از حل شدن فراخوانی و فراخوانی متد حل کند.
- یک استثنا در روشی که توسط نماینده ارجاع داده شده است، دلیل خطا را نشان نمی دهد، که اشکال زدایی را دشوارتر می کند.
- هر چه تعداد نمایندگان بیشتری استفاده کنید، کد شما کمتر قابل خواندن می شود.
- وقتی از نمایندگان استفاده می کنید، کامپایلر JIT و زمان اجرا ممکن است بسیار کمتر از توابع معمولی بهینه شوند.
نمایندگان برای اجرای برنامهنویسی رویداد محور بسیار مناسب هستند. یک نماینده نیازی به دانستن کلاس شیئی که به آن اشاره دارد ندارد. تنها چیزی که یک نماینده باید بداند امضای روشی است که به آن اشاره می کند. استفاده صحیح از نمایندگان میتواند قابلیت استفاده مجدد را در کد شما و انعطافپذیری در طرحهای شما را افزایش دهد. برای کسب اطلاعات بیشتر میتوانید به مستندات آنلاین مایکروسافت مراجعه کنید. درباره نمایندگان.
پست های مرتبط
نحوه کار با نمایندگان در سی شارپ
نحوه کار با نمایندگان در سی شارپ
نحوه کار با نمایندگان در سی شارپ