IEventAggregator(或)Dictionary类型的变量可以'readonly'吗?

时间:2013-07-15 15:46:39

标签: c# resharper readonly

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

我的问题是,我们可以在声明时在 IEventAggregator (或) Dictionary 变量类型上使用修饰符' readonly '吗?它? ReSharper建议我做太多次了。

我确实通过了这篇文章 Is there a read-only generic dictionary available in .NET? ,但它没有讨论使用修饰符' readonly '。请帮助。

1 个答案:

答案 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,而对象引用是不可变的。他们是非常不同的。