如何在使用表达式主体定义的类中添加只读'List'属性?



当我在testHelper上运行'Works'属性下方的代码时,返回4个测试项目,但'Fails''属性'属性仅返回1个测试项目。

样本类:

  public class Test {
    public string Name { get; set; }
  }
  public class TestHelper {
    public TestHelper() {
      AddTest(new Test() { Name = "1" });
    }
    public List<Test> Works { get; } = new List<Test>() {
      new Test(){ Name="0"}
    };
    public List<Test> Fails => new List<Test>() {
      new Test(){ Name="0"}
    };
    public TestHelper AddTest(Test test) {
      Works.Add(test);
      Fails.Add(test);
      return this;
    }
  }

样本程序:

  var th = new TestHelper();
  th.AddTest(new Test { Name = "2" });
  th.Works.Add(new Test { Name = "3" });
  th.Fails.Add(new Test { Name = "4" });
  var json = Newtonsoft.Json.JsonConvert.SerializeObject(th);

JSON结果:

{
  "Works":[{"Name":"0"},{"Name":"1"},{"Name":"2"},{"Name":"3"}],
  "Fails":[{"Name":"0"}]
}

"作品"&amp;"失败"看起来是定义为测试的仅阅读列表属性。

为什么一种定义方法不起作用而不是另一种方法?

Works是一个仅读取的自动插入属性,具有默认值,等同于此:

private List<Test> _works = new List<Test>() { new Test() { Name="0" } };
public List<Test> Works { get { return _works; } }

创建Works的值一次是初始化的。随后,您是通过添加值来对列表进行修改 - 请注意,属性是只读的,而不是它包含的List

相比之下, Fails是一个属性,每次获得时,getter都会返回新创建的列表。它等效于此:

public List<Test> Fails
{
    get
    {
        return new List<Test>() { new Test() { Name = "0" } }; 
    }
}

相关内容

最新更新