Func یک delegate تعریف شده در زبان سی شارپ است که با استفاده از آن دیگر نیاز نیست یک delegate را به شکلی که قبلا تعریف میکردیم در برنامه اعلان کنیم. در این فصل با دلیگیت Func در سی شارپ آشنا میشویم.
Func
در فصل های قبل مطالبی را در مورد delegate
ها آموختیم. یک delegate می تواند به شکلی که در زیر آمده است تعریف شود :
public delegate int SomeOperation(int i, int j);
class Program
{
static int Sum(int x, int y)
{
return x + y;
}
static void Main(string[] args)
{
SomeOperation add = Sum;
int result = add(10, 10);
Console.WriteLine(result);
}
}
خروجی نمونه مثال بالا به شکل زیر است :
20
سی شارپ نسخه ی ۳ به بعد شامل یک delegate درونی است که جنریک بوده و Func
نام دارد. بنابراین دیگر نیاز نیست به شکلی که در بالا آمده است، delegate دلخواه خود را تعریف کنید. Func در فضای نامی System
قرار دارد و می تواند به تعداد صفر و یا بیشتر پارامتر ورودی داشته باشد. Func همچنین دارای یک پارامتر out
برای برگرداندن نتیجه است. برای مثال یک Func که یک پارامتر را به عنوان ورودی دریافت و پارامتری را برای خروجی داشته باشد، به شکل زیر در فضای نامی System قرار دارد :
namespace System
{
public delegate TResult Func<in T, out TResult>(T arg);
}
آخرین پارامتر در براکت های <>
به عنوان نوع بازگشتی در نظر گرفته می شود. دیگر پارامترها پارامتر ورودی محسوب می شوند :
یک Func
با دو پارامتر ورودی و یک پارامتر خروجی به شکلی است که در زیر آمده است :
برای مثالی که در ابتدای فصل آمده بود، میتوان با استفاده از دلیگیت Func
بازنویسی را به شکل زیر انجام داد :
class Program
{
static int Sum(int x, int y)
{
return x + y;
}
static void Main(string[] args)
{
Func<int,int, int> add = Sum;
int result = add(10, 10);
Console.WriteLine(result);
}
}
میتوانید هر متدی را که دو پارامتر از نوع int
داشته باشد و مقداری از نوع int
را بازگرداند به Func بالا انتساب داد.
به کار بردن Func به همراه متد های بی نام
میتوان یک متد بی نام را به Func
انتساب داد. این کار با استفاده از کلمه کلیدی delegate
انجام می پذیرد :
Func<int> getRandomNumber = delegate()
{
Random rnd = new Random();
return rnd.Next(1, 100);
};
میتوان در انتساب به یک Func
از عبارت های لمبدا استفاده نمود.مثال زیر این مورد را به خوبی نشان میدهد :
Func<int> getRandomNumber = () => new Random().Next(1, 100);
//Or
Func<int, int, int> Sum = (x, y) => x + y;