当我在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" } };
}
}