سؤال

أنا أكتب فئة مجمعة للصفيف يتم تنفيذها 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 يلتزم بها.

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