هل يجب استخدام الافتراضي (فو)، Foo.Empty، أو باطل؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

وهكذا C # الآن يسمح لك لاستخدام default(Foo) للحصول على الاعتراف "لا شغل في بعد" / المثال فارغة من فئة - أنا لست متأكدا ما اذا كان هو بالضبط نفس new Foo() أم لا. العديد من الفئات مكتبة أيضا تنفيذ خاصية Foo.Empty، والتي ترجع مثيل مماثل. وبالطبع أي نوع مرجع يمكن أن نشير إلى null. ذلك حقا، ما هو الفرق؟ عندما يكون الحق أو الباطل؟ ما هو أكثر اتساقا، أو أداء أفضل؟ ما هي الفحوصات التي يجب استخدامها عند التحقق إذا كان الهدف من ذلك هو المفهوم "غير مستعد لوقت الذروة"؟ لا تمت Foo.IsNullOrEmpty() الجميع.

هل كانت مفيدة؟

المحلول

وdefault(Foo) سيعود لاغية عند Foo هو نوع من الدرجة صفر حيث Foo هو نوع قيمة (مثل كثافة العمليات)، ومثيل Foo مع كافة المجالات تهيئة إلى <م> من القيم default() منها حيث Foo هي البنية. تم إضافته إلى اللغة بحيث الأدوية يمكن أن تدعم كلا النوعين قيمة ومرجعية - أكثر المعلومات في MSDN

استخدم default(Foo) عندما كنت اختبار T في سياق SomeClass<T> أو MyMethod<T> وكنت لا أعرف ما إذا كان T سيكون نوع قيمة، وهو نوع فئة أو بنية.

وعلى خلاف ذلك، لاغية ينبغي أن يعني "غير معروف"، وفارغة ينبغي أن يعني "أعرف أن هذا هو فارغ". استخدام نمط Foo.Empty إذا كنت بحاجة حقا فارغة - ولكن غير خالية - مثيل لفئة الخاص بك؛ مثلا String.Empty كبديل لل"" إذا كنت بحاجة إلى تهيئة بعض المتغير إلى سلسلة فارغة.

استخدم لاغية إذا كنت تعرف أنك تعمل مع أنواع المراجع (فئات)، وليس هناك الأدوية المعنية، والتي تقوم باختبارها صراحة على إشارات غير مهيأ.

نصائح أخرى

وعندما تعرف نوع الفعلي المعنية، أو إذا كنت قد حصلت على معلمة نوع مقيدة ب ": فئة". انها أبسط لاستخدام قيمة معروفة (خالية، 0 الخ)

وعندما كنت قد حصلت للتو على معلمة النوع الذي هو غير مقيدة أو مقيدة البعض من أن يكون نوع مرجع، تحتاج إلى استخدام الافتراضي (T).

وdefault(Foo) يعمل لكلا النوعين قيمة وأنواع مرجع. New Foo(), null وFoo.Empty() لا. وهذا يجعل منه خيارا جيدا للاستخدام مع الأنواع العامة، على سبيل المثال، عندما قد لا تعرف الذي كنت تتعامل معه. ولكن في معظم الحالات إشارة من نوع، null هو على الارجح جيدة بما فيه الكفاية.

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