【发布时间】:2021-08-26 04:31:16
【问题描述】:
我正在查看在线教程视频,我注意到这段代码在没有构造函数的情况下修改了只读字段,并且运行良好。它的工作原理和原因?
public class Journal
{
private readonly List<string> entries = new List<string>();
private static int count = 0;
public int AddEntry(string text)
{
entries.Add($"{++count}: {text}");
return count; // memento pattern!
}
public void RemoveEntry(int index)
{
entries.RemoveAt(index);
}
public override string ToString()
{
return string.Join(Environment.NewLine, entries);
}
}
public class Demo
{
static void Main(string[] args)
{
var j = new Journal();
j.AddEntry("I cried today.");
j.AddEntry("I ate a mango.");
WriteLine(j);
}
}
输出:
- 我今天哭了。
- 我吃了一个芒果。
【问题讨论】:
-
没有修改字段的代码
-
entries是readonly;在构建类后,您无法为其分配新的List<string>。List<string>是一个引用类型,所以你可以改变它的属性,使用它的方法来改变它等等。 -
@Loocid 你不能修改只读对象,例如
record或readonly struct。List不是只读对象。这是只读字段 -
我添加了第二个副本,展示了如何防止修改列表。同样,这只会阻止您改变列表本身。如果列表项是引用类型,那么您可以将它们更改为您喜欢的内容。
标签: c# access-modifiers