سؤال

أنا أعمل على خلق ثابتة الدرجة.
لقد تميزت كل الخصائص للقراءة فقط.

لدي قائمة من البنود في الصف.
على الرغم من أن إذا كان العقار هو للقراءة فقط قائمة يمكن تعديلها.

وفضح IEnumerable من قائمة يجعله غير قابل للتغيير.
أردت أن أعرف ما هي القواعد الأساسية التي يتعين اتباعها لجعل فئة ثابتة ?

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

المحلول

أعتقد أنك على الطريق الصحيح -

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

نصائح أخرى

ليكون غير قابل للتغيير، وينبغي أن يكون كل ما تبذلونه من خصائص وحقول للقراءة فقط. والعناصر في أي قائمة يجب أن يكون غير قابل للتغيير أنفسهم.

ويمكنك جعل خاصية قائمة للقراءة فقط كما يلي:

public class MyClass
{
    public MyClass(..., IList<MyType> items)
    {
        ...
        _myReadOnlyList = new List<MyType>(items).AsReadOnly();
    }

    public IList<MyType> MyReadOnlyList
    {
        get { return _myReadOnlyList; }
    }
    private IList<MyType> _myReadOnlyList

}

وأيضا، أن نضع في الاعتبار ما يلي:

public readonly object[] MyObjects;

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

استخدم الطبقة ReadOnlyCollection. وهو يقع في مساحة الاسم System.Collections.ObjectModel.

في أي شيء يعود قائمتك (أو في المنشئ)، تعيين قائمة كمجموعة للقراءة فقط.

using System.Collections.ObjectModel;

...

public MyClass(..., List<ListItemType> theList, ...)
{
    ...
    this.myListItemCollection= theList.AsReadOnly();
    ...
}

public ReadOnlyCollection<ListItemType> ListItems
{
     get { return this.myListItemCollection; }
}

وثمة خيار آخر يتمثل في استخدام نمط الزوار بدلا من تعريض أي مجموعات داخلية على الإطلاق.

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