【问题标题】:Readonly Field used as a normal field [duplicate]用作普通字段的只读字段[重复]
【发布时间】: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);
    }
  }

输出:

  1. 我今天哭了。
  2. 我吃了一个芒果。

【问题讨论】:

  • 没有修改字段的代码
  • entriesreadonly;在构建类后,您无法为其分配新的List&lt;string&gt;List&lt;string&gt; 是一个引用类型,所以你可以改变它的属性,使用它的方法来改变它等等。
  • @Loocid 你不能修改只读对象,例如recordreadonly structList 不是只读对象。这是只读字段
  • 我添加了第二个副本,展示了如何防止修改列表。同样,这只会阻止您改变列表本身。如果列表项是引用类型,那么您可以将它们更改为您喜欢的内容。

标签: c# access-modifiers


【解决方案1】:

这里真正发生的是在 entries 只读字段上调用的方法,它不会更改 entries 字段的引用。

更改只读字段的引用是编译错误,但在只读字段上调用方法(无论它在内部做什么)完全没有问题

试试下面的语句

entries = new List<string>();

你会看到错误

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多