类型为IEventAggregator(或)Dictionary的变量是否可以生成';只读';

本文关键字:是否 只读 变量 IEventAggregator Dictionary 类型 | 更新日期: 2023-09-27 18:22:19

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

我的问题是,在声明IEventAggregator(或)Dictionary变量类型时,我们是否可以在该变量类型上使用修饰符"readonly"?ReSharper已经建议我这么做太多次了。

我确实看过这篇文章.NET中有只读的通用词典吗 ,但它没有讨论使用修饰符"只读"。请协助。

类型为IEventAggregator(或)Dictionary的变量是否可以生成';只读';

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

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的博客文章了解更多。

最重要的是,您需要区分只读的变量和它引用的对象。他们非常不同。