ما رأيك ؟؟ = المشغل في C#؟ [مغلق
-
23-09-2019 - |
سؤال
هل تعتقد أن 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