在c#中显式地将parameter标记为可变的

本文关键字:记为 parameter | 更新日期: 2023-09-27 18:03:23

我有大量依赖于对象列表的代码。当列表作为参数传递给各种方法时,它被修改了很多。

尽管理解这段代码的工作原理,我还是不放心让这样一个容易出错的机会存在。在c#中,除了愚蠢的注释或重构之外,有没有办法处理这种情况?

在c#中显式地将parameter标记为可变的

如果您在代码中传递List<Something>,那么默认情况下它是"可变的",并且没有办法显式地发出信号。

如果这是一个语言背景问题(Haskell?),那么在c#中你应该从不同的角度来看事情:如果你想传递一个不可变的集合,你需要使用一些不同的类型(可能是IEnumerable<Something>,即使它与列表不一样);如果你传递一个List,它可以被每个接收它的方法修改。

也许你可以给这个列表一个特殊的类型:

class MyCustomMutableList : List<int>

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

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

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

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

由于这个对象所允许做的就是变异,所以很明显变异正在发生。