سؤال

هذه

var h = new HashSet<int>();
var r = h.IsReadOnly;

لا يترجم. لا بد لي من القيام

var r = ((ICollection<int>)h).IsReadOnly;

لماذا لم يتم تنفيذ isreadonly بشكل طبيعي؟

(أنا لا أطلب كيف, ، لكن لماذا)

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

المحلول

أنا أظن أنه لأنه، في حين أن Hashset تنفذ ICOollection، isreadonly ليس له معنى له الحزينة. في الواقع، إذا كنت تعكس ذلك، فإن العقار يعيد دائما خطأ. ينفذ ذلك صراحة هذه الطريقة من الواجهة العامة.

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

نصائح أخرى

هناك أساسين سببين لأنك ستجمع إلى تطبيق واجهة صريحة (المصدر: MSDN.):

  1. يمكنك تنفيذ واجهات متعددة مع الأعضاء الذين يتضمنون نفس التوقيعات، وتريد أن يتصرف هؤلاء الأعضاء بشكل مختلف.
  2. عضو واجهة ليس اهتمام خاص للفئة، ولكنه مطلوب من أجل الكائنات المرجعية من خلال الواجهة.

بالنسبة HashSet<T>, ، تنطبق القضية الأخيرة، حيث لا تتم قراءة مجموعة التجزئة فقط IsReadOnly وبالتالي سوف يعود دائما false.

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