اشرح x => x.toString () // تبسيط الكثير من المكالمات
سؤال
في جواب السؤال أجد نصيحة الترميز التالية:-
2) lambdas بسيطة مع معلمة واحدة:
x => x.ToString() //simplify so many calls
بصفتي شخصًا لم يستخدم بعد 3.0 ، لا أفهم هذه النصيحة حقًا ، لكن يبدو الأمر مثيرًا للاهتمام ، لذا سأقدر إحياء حول كيفية تبسيط هذا المكالمات مع بعض الأمثلة.
لقد بحثت في Lambdas لذلك أنا فكر في أنا أعرف ماذا يفعلون ، لكنني مايو لا تفهم تمامًا ذلك أ قليل قد يكون التفريغ أيضًا في النظام.
المحلول
عندما تحتاج إلى إنشاء مثيل لمندوب يحتوي على معلمة واحدة ، تتيح لك تعبيرات Lambda إنشاء هذا المندوب "المضمّن" بطريقة موجزة للغاية. على سبيل المثال ، هنا رمز للعثور على شخص معين في قائمة ، باسمه:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");
في C# 2.0 ، يمكنك استخدام طريقة مجهولة المصدر والتي كانت أكثر فترة طويلة ، ولكن ليس جدا سيئ:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });
في C# 1.0 ، يجب عليك إنشاء طريقة إضافية كاملة. بالإضافة إلى ذلك ، إذا كنت ترغب في الحصول على معلمة ذلك ، فيجب عليك إنشاء نوع مختلف ، في حين أن الأساليب المجهولة وتعبيرات Lambda تلتقط بيئتها التنفيذية (المتغيرات المحلية وما إلى ذلك) بحيث تتصرف مثل الإغلاق:
public Person FindByName(List<Person> list, String name)
{
return list.Find(p => p.Name == name); // The "name" variable is captured
}
هناك المزيد عن هذا في مقالتي عن الإغلاق.
في حين أن تمرير المندوبين إلى الأساليب ليس شائعًا بشكل رهيب في C# 2.0 و .NET 2.0 ، إلا أنه جزء كبير من أساس LINQ - لذلك تميل إلى استخدامه كثيرًا في C# 3.0 مع .NET 3.5.
نصائح أخرى
هذا يتوسع أساسا إلى:
private string Lambda(object x) {
return x.ToString();
}
هل أنت على دراية بطرق C# 2.0 المجهولة؟ هاتان المكالمتان متكافئتان (على افتراض أن Somemethod يقبل مندوبًا وما إلى ذلك):
SomeMethod(x => x.ToString());
SomeMethod(delegate (SomeType x) { return x.ToString();});
أعرف ما الذي أفضل كتابة ...
string delegate(TypeOfX x)
{
return x.ToString();
}