سؤال

لقد رأيت معظم الأشخاص يستخدمون متغيرات الأعضاء في فصل دراسي مثل:

string _foo;
public string foo { get { return _foo; }; private set { _foo = value}; }

ولكن ما الفرق بين ذلك وبين هذا؟

public string foo { get; private set; }
هل كانت مفيدة؟

المحلول

في حالات بسيطة مثل نفسها، ولكن في حالات أكثر تعقيدا حيث تقوم بإطلاق الأحداث أو أي شيء تحتاج إلى رمز إضافي في Get and Set بحيث تحتاج إلى العضو السابق:

giveacodicetagpre.

نصائح أخرى

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

  • الكود القديم قبل C# 3.0 (الذي أضاف خصائص تلقائية، على سبيل المثال.ال public string Name { get; set; } بناء الجملة.
  • من المتوقع أن تضطر إلى تغيير تنفيذ getter/setter في مرحلة ما.
  • متطلبات بعض التسلسل المخصص.
  • استخدام الحقل الأساسي في الكود لأي سبب كان.من الأمثلة الجيدة على ذلك استخدام حقل الدعم كـ ref المعلمة لبعض الأساليب.يتضمن هذا أيضًا أشياء مثل استخدام القيمة في التشغيل المتداخل الأصلي (GCHandle إلخ.).
  • تفضيل المستخدم البسيط.لا أستخدم عادةً الخصائص التلقائية، لأنني أحب تحديد حقول الدعم يدويًا.
  • باستخدام أ readonly حقل الدعم مستحيل عند استخدام الخصائص التلقائية.

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

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

giveacodicetagpre.

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

سيناريو مختلف يعطي مزايا مختلفة.

giveacodicetagpre.

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