سؤال

هل تعتقد أن C# سوف يدعم شيء مثل؟

بدلا من هذا:

if (list == null)
  list = new List<int>();

قد يكون من الممكن الكتابة:

list ??= new List<int>();

الآن ، يمكنني استخدام (ولكن يبدو لي غير قابل للقراءة جيدًا):

list = list ?? new List<int>();
هل كانت مفيدة؟

المحلول

لطالما أردت شيئًا كهذا. أود استخدامه في كثير من الأحيان أكثر من ?? بنفسها.

ما أريده حقًا ، على الرغم من ذلك ، هو شكل من أشكال المشغل يتيح لك أن يضعف الكائن فقط إذا لم يكن فارغًا. لاستبدال هذا:

    int count = (list != null)? list.Count : 0

مع شيء مثل هذا:

    int count = list??.Count : 0

وهو ما سيكون مفيدًا بشكل خاص بالنسبة لي مع سلاسل المراجع الطويلة (التصميم السيئ ، وأنا أعلم) ، ولكن على سبيل المثال

    int count = foo??.bar??.baz??.list??.Count : 0

هذا غير ممكن حاليا مع ?? لأنه يمكنك فقط قول "تعيين إلى FOO ، أو بديل إذا كان فارغًا" ولكن ليس " منشأه من فو ، أو بديل إذا كانت لاغية ".

نصائح أخرى

أنا شخصياً أعتقد أن التوسع الثاني فقط أمر منطقي (من حيث الحفاظ على نفس الخط مثل += إلخ):

list = list ?? new List<int>();

ولكن لأكون صادقًا ، أجدها غير ضرورية بعض الشيء. عادة ما "يحصل" الناس i += 5;, ، ولكن تميل إلى وجود مشكلة مع الفرق الفارغة (??). أضف مشغلًا لتصنيف الفرق الفارغة و ... حسنًا ، لا أرى أنه ينتهي بشكل جيد.

أنا شخصياً أؤيد الكود الأصلي:

if(list == null) { list = new List<int>(); }
....

أيضا - النظر: في كل الآخر +=, -= إلخ - يتم تقييم الجانب الأيمن دائمًا. في هذه الحالة ، لن يكون (في بعض الحالات). وهذا يضيف المزيد من الالتباس. الذي أعني به:

i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?

خدعة وجدتها في مكان ما هنا على Stackoverflow كانت القيام بشيء مثل هذا ...

private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}

... ربما يمكنك استخدام Eval البطيئة مماثلة في الكود الخاص بك.

يعجبني - إنها طريقة لطيفة ومختصرة للتعبير عن تعبير كسول. ما إذا كان يتم إضافته إلى اللغة أم لا شيء آخر تمامًا - مثل يحب إريك ليبرت الإشارة, ، تتطلب الميزات الجديدة كميات كبيرة من العمل للتنفيذ ، وبالتالي يجب أن تساهم في شبكة إيجابية كبيرة في اللغة من أجل تضمينها.

ما لم أقرأ سؤالك بشكل خاطئ ، فإن هذا المشغل موجود في C#: http://msdn.microsoft.com/en-us/library/ms173224(vs.80).aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top