عقد ICollection<T>.IsReadOnly
-
21-08-2019 - |
سؤال
أنا أكتب فئة مجمعة للصفيف يتم تنفيذها IList<T>
.لست متأكدًا مما سأعود إليه IList<T>.IsReadOnly
(موروث من ICollection<T>
)، رغم ذلك.
صفي لا يسمح بالإدراج والإزالة.هو - هي يفعل السماح بتعديل العناصر عبر this[int].set
ملكية.
ال MSDN ينص علي
لا تسمح المجموعة المخصصة للقراءة فقط بإضافة أو إزالة أو تعديل العناصر بعد إنشاء المجموعة.
بالنسبة لصفي، يبدو أن هذا يعني أنه يجب علي العودة true
ولكن في نظري هذا يجعل الخاصية أ قليلعديمة الفائدة تماما:وبقدر ما أستطيع أن أرى، فإن استخدام هذه الطريقة هو كما يلي:
يتعامل العملاء بشكل تعسفي IList
وتحتاج إلى إدراج عنصر فيه، إذا كان ذلك ممكنا.يمكنهم القيام بذلك بمجرد الاتصال Insert
والتقاط النتيجة NotSupportedException
- ولأسباب مختلفة، قد لا يكون هذا أمرًا مرغوبًا فيه.لذلك بدلاً من إثارة استثناء، يمكن للعملاء فقط اختبار IsReadOnly
الملكية مسبقا.
ولكن نتيجة هذه الخاصية ستكون خطأ لأنه يمزج بين إمكانية تعديل المجموعة وإمكانية تعديل محتوياتها - وهي مسائل غير ذات صلة تماما!
من المؤكد أن هناك IList.IsFixedSize
خاصية ولكن هذا نوع منفصل (IList<T>
يفعل لا يمتد IList
).ماذا علي أن أفعل؟تنفيذ أيضا IList
(أنا في الحقيقه لا مثل هذا البديل)؟افعل شيئا اخر؟
المحلول
شيء آخر للنظر فيه ...
مجموعتك عبارة عن غلاف مصفوفة ولها بعض الدلالات المشابهة للمصفوفة.أي أنه لا يمكن إدراج العناصر أو إزالتها ولكن يمكن تعديلها.
عودة المصفوفات false
ل IsReadOnly
و true
ل IsFixedSize
.
أعتقد أنني ربما سأنفذ IList
بالإضافة إلى IList<T>
ثم قم بتقليد سلوك المصفوفة، بقدر ما IsReadOnly
و IsFixedSize
نشعر بالقلق.
الكلمة المفتاحية في ملاحظة من MSDN هو "أو":
المجموعة المخصصة للقراءة فقط لا تسمح بإضافة أو إزالة أو أو تعديل العناصر بعد إنشاء المجموعة.
مجموعتك يفعل السماح بالتعديل، لذلك العودة true
ل IsReadOnly
سيكون فسخ هذا العقد، في رأيي.
نصائح أخرى
أعتقد أنه للوفاء بالعقد كما هو محدد، سيتعين عليك العودة true
.
يمكنك (بالإضافة إلى ذلك) التنفيذ IBindingList
- هذا قد AllowNew
, AllowEdit
و AllowRemove
.سوف تعود true
من AllowEdit
, ، و false
من الاثنين الآخرين.
ومع ذلك، فإن ما إذا كان المتصل الخاص بك يتحقق من ذلك أمر متروك للمتصل.ومع ذلك، فإن الكثير من أكواد ربط واجهة المستخدم ستفعل ذلك.
وأضاف:
أيضًا؛أنت يجب ربما تنفيذ IList
إذا كنت تنفذ IList<T>
;بخاصة، IList
يعد أمرًا مهمًا لعدد من سيناريوهات الانعكاس والربط، حيث لا تكون الأنواع معروفة مسبقًا.
هنا، دلالات التعديل مهمة.هناك فرق بين تعديل عناصر المجموعة وتعديل الكائنات التي تحتويها المجموعة.فكر في عناصر المساحات الفعلية في المجموعة.لا يمكنك إضافة مسافات أو إزالة مسافات أو تغيير الكائن في مساحة معينة.هذا هو العقد الذي IsReadOnly
يلتزم بها.