我目前正在使用 ReSharper 进行C#代码审核。本代码是针对.NET 4.0框架编写的。
我的问题是,我们可以在声明时在 IEventAggregator (或) Dictionary 变量类型上使用修饰符' readonly '吗?它? ReSharper建议我做太多次了。
我确实通过了这篇文章 Is there a read-only generic dictionary available in .NET? ,但它没有讨论使用修饰符' readonly '。请帮助。
答案 0 :(得分:3)
这一行有两个可变性方面(作为例子):
private readonly List<string> names = new List<string>();
names
变量是只读的。您无法更改其值(除了在构造函数中)。所以如果你有这样的方法:
public void ResetNames(List<string> newNames)
{
names = newNames; // Error!
}
那不会编译。那就是变量。
接下来,考虑变量值引用的对象 - 在本例中为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's blog post了解更多信息。
主要的是你需要区分变量是readonly,而对象引用是不可变的。他们是非常不同的。