在c#中将参数显式标记为变异

时间:2015-07-18 04:34:40

标签: c# oop immutability mutable

我有大量依赖于对象列表的代码。该列表在作为参数传递给各种方法时被大量修改。

即使了解此代码的工作原理,我仍然感到不安,因此存在这样一个容易出错的机会。有没有办法在愚蠢的评论或重构之外的c#中处理这种情况?

2 个答案:

答案 0 :(得分:1)

如果您在代码中传递List<Something>,那么默认情况下它是“可变的”,并且无法明确地发出此信号。

如果这是一个语言背景问题(Haskell?),那么在C#中你应该从不同的角度看问题:如果你想传递一个不可变的集合,你需要使用一些不同的类型(可能是{{ 1}},即使它与列表不同);如果您在List周围传递,则可以通过接收它的每个方法对其进行修改。

答案 1 :(得分:0)

也许你可以给这个名单一个特殊的类型:

class MyCustomMutableList : List<int>

你甚至不能给它任何基类来确保任何使用站点必须使用这种特殊类型才能访问列表数据。

我通常认为这是对继承的滥用。如果这是一个实现细节,并且没有泄露给您的API的消费者,那么它可能已经足够好了。否则,通过合成创建IList<int>派生类。 R#具有将所有虚拟方法委派给实例字段的功能。这会生成所有代码。

您还可以创建一个包装类,它只公开执行所需突变所需的方法:

class DataCollector {
 public void Add(int item) { ... }
}

由于所有这个对象都允许做突变,很明显突变正在进行。