عنوان:

‫تفاوت بین Func ،Predicate و Expression در #C


نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۲/۲۴ ۰۷:۵۳
آدرس: www.dntips.ir
این مقاله به بررسی تفاوت ها و کاربردهای سه نماینده (دلیگیت) (delegate) داخلی در C# .Net یعنی Func، Predicate و Expression می پردازد.
نماینده های کلیدی:
  • Func (فانک):
    • نماینده‌ای برای متدهایی است که مقدار بازگشتی دارند.
    • می تواند تا 16 پارامتر ورودی داشته باشد.
    • برای توابعی استفاده می‌شود که نیاز به ورودی و خروجی دارند.
    • مثال: Func<int, string> (تبدیل عدد صحیح به رشته).
Func<int, string> func = x => x.ToString();
string result = func(5); // "5"
  • Predicate (پردیکیت):
    • نوع خاصی از Func است که یک پارامتر ورودی می گیرد و مقدار بولی (boolean) (درست یا غلط) برمی‌گرداند.
    • برای متدهایی استفاده می‌شود که یک شرط را ارزیابی می‌کنند (مثلاً بررسی زوج بودن یک عدد).
    • مثال: Predicate<int> (بررسی زوج بودن یک عدد صحیح).
Predicate<int> isEven = x => x % 2 == 0;
bool isFiveEven = isEven(5); // false
  • Expression (اکسپرشن):
    • نماینده‌ای برای کد به صورت داده‌است که یک "درخت عبارت" (expression tree) را ایجاد می‌کند.
    • امکان بررسی، تغییر و کامپایل کد را قبل از اجرا، فراهم می‌کند.
    • در مواردی استفاده می شود که نیاز به تحلیل یا تبدیل کد وجود دارد، مانند ابزارهای ORM یا LINQ providers.
    • مثال: Expression<Func<int, bool>> (بررسی بزرگتر بودن یک عدد صحیح از 10).
Expression<Func<int, bool>> expr = x => x > 10;
// You can compile and run this expression:
Func<int, bool> compiledExpr = expr.Compile();
bool isElevenGreaterThanTen = compiledExpr(11); // true
  • Action (اکشن):
    • مشابه Func است اما مقداری را برنمی‌گرداند. (برگشت از نوع void).
    • برای متدهایی استفاده میشود که عملی را انجام میدهند، بدون آنکه مقداری را برگردانند.
    • مثال: Action<string> (یک رشته را در کنسول چاپ میکند).
// Prints "Print action called!" to the console
Action<string> print = message => Console.WriteLine(message);
print("Print action called!");

مقایسه:
    • Func (فانک) در مقابل Predicate (پردیکیت): Func (فانک): هر نوع مقداری را برمی‌گرداند.
    • Predicate (پردیکیت): فقط مقدار بولی (boolean) برمی‌گرداند.
    • Func/Predicate در مقابل Expression (اکسپرشن):Func/Predicate: نماینده را مستقیماً اجرا می‌کند.
    • Expression (اکسپرشن): امکان تحلیل و تغییر قبل از اجرا را فراهم می کند.

موارد استفاده:
  • Func (فانک): متدهای عمومی با مقادیر بازگشتی.
  • Predicate (پردیکیت): بررسی شرط و فیلتر کردن.
  • Expression (اکسپرشن): پرس و جوهای پویا، ابزارهای ORM و تبدیل کد.
  • Action (اکشن): انجام یک عمل.




مشاهده مطلب اصلی