اشرح x => x.toString () // تبسيط الكثير من المكالمات

StackOverflow https://stackoverflow.com/questions/156815

  •  03-07-2019
  •  | 
  •  

سؤال

في جواب السؤال أجد نصيحة الترميز التالية:-

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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top