c# - هل يجب علي استخدام العقارات العامة والحقول الخاصة أو الحقول العامة للبيانات؟




.net coding-style (9)

الفكرة هي أنك لا ينبغي أن تغيّر عن غير قصد / دون قصد قيمة حقل خاص خارج الفصل. عند استخدام الحصول على وتحديد ، وهذا يعني أنك تقوم بتغيير الحقل الخاص بالفصل عن قصد وعن علم.

في الكثير من الشفرات التي رأيتها (على SO ، thecodeproject.com وأنا أميل إلى القيام بذلك في رمز بلدي) ، لقد رأيت خصائص عامة يتم إنشاؤها لكل حقل خاص واحد يحتوي على فئة ، حتى لو كانت أكثر النوع الأساسي من get; set; get; set; مثل:

private int myInt;
public int MyInt 
{
     get { return myInt; }
     set { myInt = value }
}

سؤالي هو: كيف يختلف هذا عن:

public int MyInt;

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


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


ثلاثة أسباب:

  1. لا يمكنك تجاوز الحقول الموجودة في الفئات الفرعية مثل يمكنك الخصائص.
  2. قد تحتاج في نهاية المطاف إلى أداة أو معدّل أكثر تعقيدًا ، ولكن إذا كان حقلًا ، فإن تغييره سيؤدي إلى قطع واجهة برمجة التطبيقات.
  3. مؤتمر. هذه هي الطريقة التي يتم بها

أنا متأكد من أن هناك المزيد من الأسباب التي لا أفكر بها.

في .Net 3.x يمكنك استخدام خصائص تلقائية مثل هذه:

public int Age { get; set; }

بدلاً من طريقة المدرسة القديمة بإعلان حقولك الخاصة بنفسك مثل هذا:

private int age;

public int Age
{
    get { return age; }
    set { age = value; }
}

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


حسنا ، هل تحدث فرقا. يمكن تغيير البيانات العامة دون معرفة مثيل الكائن عنها. باستخدام الكائن المتسلل والمستقر ، يدرك الكائن دائمًا أنه تم إجراء تغيير.

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


في الواقع ، إذا كنت تستخدم Silverlight ، فسوف ندرك أن الحقول لا يمكن تعيين موارد ثابتة وبالتالي سيتعين عليك استخدام خاصية (حتى الوصول إلى const ).

لقد أدركت أنه عندما حاولت إحاطة أسماء المنطقة التي استخدمها في الإرشاد المركب (PRISM).

ومع ذلك ، هذا مجرد قيود لغوية وبصرف النظر عن حقول static / const أنا استخدم alsways الخصائص.


في كلمات أبسط ، الإجابة على سؤالك هي معدِّلات الوصول مثل العامة والخاصة.

إذا كنت تستخدم:

public int myInt;
public int MyInt 
{
     get { return myInt; }
     set { myInt = value }
}

ثم تتوفر الخاصية MyInt و متغير myInt في المشروع المراد تعديلها. يعني ، إذا كان صفك افترض أن A يتم توريثه بالفئة suppose B ، فسيكون كل من myInt و MyInt متاحين للتعديل ولا يمكن تطبيق فحص. لنفترض أنك تريد تعيين قيمة myInt في الفصل الدراسي إذا تم تمرير بعض الشروط الخاصة.

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


هذا يعتمد؟

أنا دائمًا أستخدم برنامج getters & setters ، نظرًا لأنهم أنشأوا هذا الاختصار:

public int Foo {get؛ جلس؛ }

في وقت الترجمة يتم ترجمته. الآن لا يمكنك أن تتخيلها ، ولكن هناك ، وإذا كنت بحاجة إلى الحصول على الهوى يمكنك فقط توضيح ذلك في وقت لاحق.

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

protected _foo;  
public Foo  
{  
    get { return _foo; }
} //lack of set intentional.

هناك العديد من الأسباب.

في الأساس:

  • يمكنك القيام ببعض الوظائف الأخرى عند ضبط المتغير
  • يمكنك منع الإعداد وتوفير الحصول فقط
  • بعض "الأشياء" تعمل فقط على الخصائص (DataBinding ، على سبيل المثال)
  • يمكنك إخفاء تنفيذ الخاصية [ربما يكون متغير ViewState ، في ASP.NET).

يجب عليك استخدام الخصائص في الحالات التالية:

  1. عندما تحتاج إلى تسلسل البيانات في الخاصية إلى بعض التنسيق.
  2. عندما تحتاج إلى تجاوز الخصائص في فئة مشتقة.
  3. عند تنفيذ الحصول على وتعيين طرق مع بعض المنطق. على سبيل المثال ، عند تطبيق نمط Singleton.
  4. عندما تكون مشتقًا من الواجهة ، حيث تم إعلان الملكية.
  5. عندما تكون لديك مشكلات محددة متعلقة بالتأمل.




properties