در زبان برنامهنویسی سیشارپ، Func یکی از ابزارهای مهم و کاربردی است که برای کار با توابع و متدها به عنوان پارامتر مورد استفاده قرار میگیرد. در این مقاله، به بررسی کامل Func و کاربردهای آن میپردازیم و با مثالهایی از دنیای واقعی، نحوه استفاده از آن را به زبانی ساده و روان توضیح میدهیم.
Func در سیشارپ چیست؟
Func در سیشارپ، یک نوع دلیگیت (Delegate) آماده است که به شما این امکان را میدهد تا یک تابع را به عنوان پارامتر به متدهای دیگر منتقل کنید. این دلیگیتها میتوانند 0 تا 16 پارامتر ورودی بگیرند و در نهایت یک خروجی بازگردانند. این یعنی با استفاده از Func میتوانید توابع را به صورت پویا مدیریت کنید، بدون اینکه نیاز به تعریف دلیگیتهای جدید داشته باشید.
مشخصات Func:
0 تا 16 پارامتر ورودی پشتیبانی میکند.
یک خروجی دارد که همیشه نوع آن آخرین پارامتر تعریفشده است.
قالب کلی:
Func<پارامتر1، پارامتر2، ..., خروجی>
مثال ساده:
Func<int, int> doubleFunc = x => x * 2;
در این مثال:
تابع doubleFunc یک int به عنوان ورودی میگیرد و int دیگری به عنوان خروجی برمیگرداند.
این تابع به ازای هر عددی که دریافت میکند، آن را دو برابر میکند.
چرا از Func در سیشارپ استفاده میکنیم؟
استفاده از Func در سیشارپ به دلایل مختلفی توصیه میشود:
کاهش پیچیدگی کد: با استفاده از Func نیازی به تعریف دلیگیتهای جدید یا متدهای اضافی نیست.
پیادهسازی کالبکها (Callbacks): Func به شما اجازه میدهد تا توابع را به عنوان پارامتر به سایر متدها منتقل کرده و از آنها به عنوان کالبک استفاده کنید.
انعطافپذیری بالا: میتوانید الگوریتمهای مختلفی را با Func پیادهسازی کنید، بدون نیاز به تعریف کلاسها یا متدهای جدید.
استفاده آسان از توابع ناشناس (Anonymous Functions): با Func میتوانید به راحتی از لامبدا اکسپرشنها برای تعریف توابع ناشناس استفاده کنید.
نحوه استفاده از Func در سیشارپ
مثال ساده: دو برابر کردن یک عدد
فرض کنید میخواهیم تابعی بنویسیم که یک عدد صحیح را دریافت کرده و دو برابر آن را برگرداند. با استفاده از Func، این کار را به سادگی انجام میدهیم:
کد:
Func<int, int> doubleFunc = x => x * 2;
int result = doubleFunc(5); // result = 10
در این مثال:
doubleFunc یک تابع است که یک int میگیرد و یک int برمیگرداند.
ورودی تابع 5 است و خروجی آن 10، چون عدد ورودی دو برابر شده است.
مثال پیچیدهتر: شمارش اعداد زوج در یک لیست
حال فرض کنید میخواهیم تعداد اعداد زوج در یک لیست از اعداد صحیح را محاسبه کنیم. با استفاده از Func، میتوانیم این کار را به راحتی انجام دهیم:
کد:
Func<List<int>, int> countEvens = numbers => numbers.Count(n => n % 2 == 0);
List<int> numbers = new List<int> {1, 2, 3, 4, 5, 6};
int evensCount = countEvens(numbers); // evensCount = 3
در این مثال:
countEvens یک لیست از اعداد به عنوان ورودی میگیرد و تعداد اعداد زوج در لیست را برمیگرداند.
لیست numbers شامل اعداد 1 تا 6 است، و سه عدد از این لیست (2، 4، 6) زوج هستند، بنابراین خروجی برابر با 3 خواهد بود.
استفاده از Func در پروژههای واقعی
در پروژههای واقعی، Func به شما این امکان را میدهد تا عملیات پیچیدهای را به سادگی و بدون نیاز به تعریف متدهای تکراری انجام دهید. در این بخش، به چند مثال کاربردی از استفاده Func در پروژههای واقعی میپردازیم.
1. مرتبسازی سفارشی لیستها
فرض کنید میخواهید لیستی از اشخاص را بر اساس سن مرتب کنید. با استفاده از Func، میتوانید تابعی برای مقایسه سنها تعریف کنید و آن را به متد Sort ارسال کنید.
کد:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
List<Person> people = new List<Person>
{
new Person { Name = "Ali", Age = 30 },
new Person { Name = "Sara", Age = 25 },
new Person { Name = "Reza", Age = 35 }
};
people.Sort((p1, p2) => p1.Age.CompareTo(p2.Age));
foreach (var person in people)
{
Console.WriteLine($"{person.Name}: {person.Age}");
}
در این مثال:
تابع Sort با استفاده از Func، لیست people را بر اساس سن مرتب میکند.
(p1, p2) => p1.Age.CompareTo(p2.Age) یک لامبدا اکسپرشن است که سن دو نفر را مقایسه میکند.
2. فیلتر کردن لیست بر اساس شرط خاص
فرض کنید میخواهید لیستی از محصولات را فیلتر کنید و تنها محصولاتی که قیمت آنها بالاتر از یک مقدار خاص است را نمایش دهید. با Func میتوانید این فیلتر را پیادهسازی کنید.
کد:
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}
List<Product> products = new List<Product>
{
new Product { Name = "Laptop", Price = 1500 },
new Product { Name = "Phone", Price = 800 },
new Product { Name = "Tablet", Price = 600 }
};
Func<Product, bool> isExpensive = product => product.Price > 1000;
List<Product> expensiveProducts = products.Where(isExpensive).ToList();
foreach (var product in expensiveProducts)
{
Console.WriteLine($"{product.Name}: {product.Price}");
}
در این مثال:
isExpensive تابعی است که بررسی میکند آیا قیمت محصول بالاتر از 1000 است یا خیر.
با استفاده از Where، محصولات گرانقیمت فیلتر میشوند و در نهایت این محصولات در expensiveProducts ذخیره میشوند.
مزایای استفاده از Func
کاهش پیچیدگی کد: با استفاده از Func، میتوانید کدهای پیچیده را به توابع کوچکتر و قابل استفاده مجدد تقسیم کنید.
استفاده آسان از لامبدا اکسپرشنها: Func امکان استفاده سریع از لامبدا اکسپرشنها را فراهم میکند که باعث میشود کد شما خواناتر و کوتاهتر شود.
انعطافپذیری در طراحی الگوریتمها: با استفاده از Func، میتوانید بدون نیاز به تعریف کلاسها و متدهای جدید، انواع مختلفی از الگوریتمها را پیادهسازی کنید.
نتیجهگیری
Func یکی از ابزارهای قدرتمند و مفید در سیشارپ است که به شما امکان میدهد توابع و متدها را به صورت پارامتر به دیگر متدها ارسال کنید. این ابزار با انعطافپذیری بالا، به شما کمک میکند تا کدهای سادهتر و خواناتر بنویسید و به راحتی کالبکها و الگوریتمهای پیچیده را پیادهسازی کنید.
این مقاله فقط اولین قدم در فهم عملکرد Func در سی شارپ بود. برای ارتقا دادن مهارت های برنامه نویسی خود به سطح بعدی، من به شما دوره های آموزش سی شارپ در باگتو را توصیه می کنم.
بعد از مطالعه مقاله "مفهوم فهمیدن عملکرد Func در سی شارپ"، توصیه میشود به مقالات "Expression Func در سی شارپ"، "Throw در سی شارپ"، و "Stack در سی شارپ" رجوع کنید. مقاله "Expression Func" به طور مستقیم به موضوع Func و عبارات تابعی در سیشارپ مرتبط است و. "Throw در سی شارپ" میتواند به شما نشان دهد چگونه Func ها میتوانند با مدیریت استثناها کار کنند. همچنین، "Stack در سی شارپ" میتواند نمایانگر کاربردهای Func در پیادهسازی دادهساختارها باشد.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید