0

我目前正在使用ReSharper进行 C# 代码审查。此代码是针对 .NET 4.0 框架编写的。

我的问题是我们可以在声明时在IEventAggregator(或)字典变量类型上使用修饰符“ readonly ”吗?ReSharper 多次建议我这样做。

我确实浏览过这篇文章.NET 中是否有可用的只读通用字典?,但没有讨论使用修饰符' readonly '。请协助。

4

1 回答 1

3

这行中的可变性有两个方面(例如):

private readonly List<string> names = new List<string>();

names变量是只读的。你不能改变它的值(除了在构造函数中)。因此,如果您有这样的方法:

public void ResetNames(List<string> newNames)
{
    names = newNames; // Error!
}

那不会编译。这就是变量

接下来,考虑变量值所指的对象——在本例中为 a List<T>。该对象是可变的……您可以更改其中的数据。所以这很好:

public void AddName(string name)
{
    names.Add(name);
}

现在某些类型(例如string)本身是不可变的——因此您也不能修改对象中的数据。它变得比这两个极端更复杂。例如,ReadOnlyCollection<T>它是不可变的,因为你不能对该对象做任何事情来改变它(这意味着你可以安全地将它暴露给调用者),但它可以包装一个本身可变的集合:

List<string> mutable = new List<string>();
ReadOnlyCollection<string> funky = new ReadOnlyCollection<string>(mutable);
Console.WriteLine(funky.Count); // 0
mutable.Add("xyz");
Console.WriteLine(funky.Count); // 1

还有更多种类的不变性,甚至 - 例如,请参阅Eric Lippert 的博客文章了解更多信息。

主要的是,您需要区分只读变量和它所指的不可变对象。它们非常不同。

于 2013-07-15T16:19:59.313 回答