c# الخصائص مقابل الحقول: تحتاج إلى مساعدة في استيعاب استخدامات الخصائص على الحقول




properties field (8)

1) لماذا أرغب في استخدام الخصائص بدلاً من الحقول (خاصةً عندما يبدو أنني أقوم بإضافة رمز إضافي فقط

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

2) أي نصائح حول التعرف على استخدام الخصائص وعدم رؤيتها كطرق بسيطة (باستثناء الحصول على ؛ تعيين يجري الظاهري) عند تتبع رمز الشعوب الأخرى؟

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

3) أي قواعد عامة للإبهام عندما يتعلق الأمر بأساليب البرمجة الجيدة فيما يتعلق بتوقيت استخدام ماذا؟

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

https://code.i-harness.com

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

أحد الجوانب الرئيسية لـ C # التي جئت لتعلمها هو أهمية حماية البيانات داخل الكود الخاص بك عن طريق استخدام التغليف. "ظننت" أنني فهمت ذلك بسبب قدرة استخدام المعدِّلات (الخاصة ، العامة ، الداخلية ، المحمية). ومع ذلك ، بعد معرفة خصائص أنا نوع من تمزق في فهم ليس فقط يستخدم خصائص ، ولكن الأهمية الشاملة / القدرة على حماية البيانات (ما فهمته كالتغليف) ضمن C #.

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

1) تسمح لك بتغيير نوع البيانات عندما لا تستطيع ذلك عندما تدخل مباشرة إلى الحقل مباشرة.

2) يضيفون مستوى من الحماية للوصول إلى البيانات

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

ثم هناك المعدلات بأكملها التي يمكن إضافتها إلى خصائص مما يزيد من تعقيد فهمي للحاجة إلى خصائص للوصول إلى البيانات.

لقد قرأت عددًا من الفصول من كتاب مختلفين عن "الخصائص" ولم يفسر أي منها فهمًا جيدًا للخصائص مقابل الحقول مقابل التغليف (وطرق البرمجة الجيدة).

يمكن للشخص أن يفسر:

1) لماذا أرغب في استخدام الخصائص بدلاً من الحقول (خاصةً عندما يبدو أنني أقوم بإضافة رمز إضافي فقط

2) أي نصائح حول التعرف على استخدام الخصائص وعدم رؤيتها كطرق بسيطة (باستثناء الحصول على ؛ تعيين يجري الظاهري) عند تتبع رمز الشعوب الأخرى؟

3) أي قواعد عامة للإبهام عندما يتعلق الأمر بأساليب البرمجة الجيدة فيما يتعلق بتوقيت استخدام ماذا؟

شكراً وآسفًا على المشاركة الطويلة - لم أكن أريد فقط أن أطرح سؤالاً تم سؤاله 100 مرة دون شرح سبب مطالبتي مرة أخرى.


1) هناك عدة أسباب وراء رغبتك في استخدام الخصائص على الحقول ، وإليك بعضًا من هذه الأسباب:

أ) من خلال وجود ما يلي

public string MyProperty { get; private set; }

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

ب) إذا قررت أنك بحاجة إلى زيادة أمان خصائص استخدام الشفرة الخاصة بك:

public string MyProperty
{
    get { return _myField; }
    set
    {
        if (!string.IsNullOrEmpty(value))
        {
            _myField = value;
        }
    }
}

2) يمكنك معرفة أنها ملكيات لأنها لا تملك () . سيخبرك المحول البرمجي ما إذا كنت تحاول إضافة أقواس.

3) يعتبر من الممارسات الجيدة دائمًا استخدام الخصائص.


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

عند النظر إلى رمز الشعوب الأخرى ، فإن الخصائص لها رموز intellisense مختلفة للأساليب.

إذا كنت تعتقد أن الخصائص هي مجرد رمز إضافي ، فإنني سأجادل بالالتزام بها على أي حال ، ولكن اجعل حياتك أسهل عن طريق إنشاء خاصية تلقائيًا من الحقل (النقر بزر الماوس الأيمن -> Refactor -> Encapsulate Field ...)


تتيح لك الخصائص القيام بأشياء أخرى غير تعيين أو الحصول على قيمة عند استخدامها. الأبرز ، أنها تسمح لك للقيام منطق التحقق من الصحة.

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


على الرغم من أنني لا أحب الكشف عن الحقول بشكل مباشر للجمهور ، فهناك أمر آخر: لا يمكن الكشف عن الحقول عبر الواجهات ؛ خصائص يمكن.


كنت سأقول أن العقارات (المستأجرين) هي مكان رائع لإثارة أحداث مثل NotifyPropertyChanged ، لكن شخصًا آخر اعتدني عليها.

سبب وجيه آخر للنظر في خصائص: دعنا نقول أنك تستخدم مصنع لبناء بعض الكائنات التي لديها منشئ افتراضي ، وأنت تعد الكائن عبر خصائصه.

new foo(){Prop1 = "bar", Prop2 = 33, ...};

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

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


واحدة من الأشياء اللطيفة عن العقارات هي أن الـ getter و setter يمكن أن يكون لهما مستويات مختلفة من الوصول. النظر في هذا:

public class MyClass {

  public string MyString { get; private set; }

  //...other code
}

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

عند الاطلاع على رمز أشخاص آخرين ، يمكنك معرفة ما إذا كان هناك شيء ما أو طريقة أو خاصية لأن رموزهم مختلفة. أيضا ، في Intellisence ، الجزء الأول من ملخص الخاصية هو خاصية الكلمة.


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

كما أن الرمز الإضافي لتعريف الخصائص البسيطة هو الحد الأدنى:

public int MyProp { get; set; } // use auto generated field.

عندما تحتاج إلى تخصيص يمكنك دائما تحديد المجال الخاص بك في وقت لاحق.

لذلك فقد تركت مع طبقة إضافية من حماية التغليف / البيانات ، وهذا أمر جيد.

قاعدتي: فضح الحقول دائمًا من خلال الخصائص





encapsulation