【问题标题】:How to create a C# List with const content?如何使用 const 内容创建 C# 列表?
【发布时间】:2016-11-01 17:12:50
【问题描述】:

在 C# 中:有没有办法像在 C++ 中一样定义 List const/readonly 的内容?

C++ 示例:

List<const Content> listWithConstContent;

【问题讨论】:

  • C# 不支持这样的不变性。
  • System.Collections.Immutable 有一个预发布版本,其中包含 ImmutableList。我还没有尝试过,但 MS 说你可以从 Nuget 获得它。
  • 可能最接近的东西是 ReadOnlyCollection msdn.microsoft.com/en-us/library/ms132474(v=vs.110).aspx .. 虽然远非完美
  • C# 中没有“常量引用”。我的建议是,您使用所有“阅读器”方法创建一个公共接口,让Content 实现该接口,然后分发List&lt;IReadOnlyContent&gt;。然后将Content 设为内部类型。因此,现在您的内部代码可以随心所欲地处理您想要的内容,但外部代码只能通过公共接口获取。
  • @tommy_tee:C/C++ 中的 Const 存在严重缺陷。它不能保证我真正想要的。所有 const 参考都说“你不能改变这个”,但我想要的保证是“这不会改变”。但它确实施加了我不想要的限制;例如,它施加了一个限制,即我不能将纯 const 方法重构为通过更新私有 memoizer 来实现的方法。有比将 const 放入类型系统更好的方法来实现不变性保证。

标签: c# c++ list constants


【解决方案1】:

C# 不支持这样的不变性

【讨论】:

    【解决方案2】:

    .NET 框架中的List&lt;T&gt; 类是可变的。在 C# 或 CLR 中都没有与该 C++ 功能等效的功能。

    如果你想要一个不可变的列表,那么你需要使用例如ImmutableList&lt;T&gt;

    【讨论】:

    • ImmutableList 的内容是不可变的还是只是列表本身?
    • @tommy_tee,列表本身是不可变的。如果T 是可变类型,那么元素的内容可以改变。更改内容被认为是不好的做法,但编译器或运行时不会强制执行。
    • 谁在乎不好的做法? ;-)
    【解决方案3】:

    只读不可变是不同的属性。你期待哪一个?

    • 如果您需要只读,C# 类型不支持它 系统。您需要通过接口公开您的对象 不允许改变这个对象的状态。
    • 如果您需要不变性,则需要设计您的类以使其工作。没有办法 让它神奇地不可变。

    【讨论】:

    • 请您解释一下,不可变和只读在什么方面不一样?
    • 当前时间是只读的——你不能改变它,你只能检查它。当前时间不是一成不变的 - 每次量子都会发生变化
    • 这是一个非常好的例子。我以前从未理解过不可变与只读声明不同。我现在这样做。谢谢。
    • List&lt;T&gt; 有一个成员 AsReadOnly
    猜你喜欢
    • 2016-06-19
    • 2021-06-18
    • 2016-03-05
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多