【问题标题】:How to override List<T>.IsReadOnly in C#如何在 C# 中覆盖 List<T>.IsReadOnly
【发布时间】:2009-04-22 19:40:31
【问题描述】:

我正在尝试从 List 派生并有选择地打开和关闭 IsReadOnly 属性。我希望 Add/Remove/[] 函数会尊重这个属性,但他们没有。 这样做的正确方法是什么?

我的派生类有一些额外的属性,所以很遗憾我不能将列表包装在 ReadOnlyCollection 中。

【问题讨论】:

    标签: c# properties overriding readonly


    【解决方案1】:

    在这种情况下使用封装而不是继承。

    你应该让你的类实现 IList,并有一个私有 List 变量。

    你可以通过任何你想要的函数,也可以完全覆盖它们,改变行为等。这给了你完全的控制权(代价是有很多方法除了调用 this.List.method(.. .) ).

    总的来说,我认为在任何情况下从 BCL 集合类继承都不是一个好主意。我更喜欢让它们成为我班级内部的实现细节。

    【讨论】:

      【解决方案2】:

      List 根据定义是可变类型。无法将其设为只读。

      如果您正在创建派生类,您可能应该直接实现 IList 而不是子类化 List。这将使您可以完全控制实施,如果您愿意,可以将其设为只读。

      【讨论】:

        【解决方案3】:

        您可以调用 list 上的“AsReadOnly”方法,该方法应该返回一个 IList 实例,该实例应该承认它是...错误...只读。

        ...好吧,我刚刚看了你的最后一句话,我的错。在这种情况下,您可能只想实现 IList 接口或任何朋友,并将大部分接口路由到您在内部保留的列表。然后你可以建立这种行为。即便如此,我也会做一个类似的模式,提供一些“AsReadOnly”方法,显式地给你一些只读的东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-09
          • 2012-11-21
          • 1970-01-01
          • 2010-10-23
          • 1970-01-01
          • 1970-01-01
          • 2016-03-16
          • 1970-01-01
          相关资源
          最近更新 更多