【发布时间】:2016-10-18 19:08:12
【问题描述】:
我在检查类属性的代码覆盖率时发现了一个场景。当属性的类型为 List 并使用初始化程序时,似乎不会调用 set 方法。这不适用于其他类型,例如字符串和整数。代码覆盖率没有显示 set 调用,也没有遇到 set 中的断点。
示例类:
public class ContainerClass
{
public string Text { get; set; }
public List<Item> Items { get; set; }
}
当使用初始化器时,如下所示,Text 上的 set 方法被调用,并在代码覆盖范围内注册,但 Items 上的 set 方法没有,我想知道为什么:
var arrange = new ContainerClass
{
Text = "value",
Items = { new Item() }
};
编辑:我会指出该列表已正确分配,并且可以进行测试,但它似乎绕过了实际的 set 方法。
有趣的是,当我指定新列表时,它确实会被调用:
var arrange = new ContainerClass
{
Items = new List<Item> { new Item() }
};
【问题讨论】:
-
初始化它的正确方法是在你的最后一个例子中,我不确定其他版本是什么意思
-
从未为我分配该列表 - 导致 NullReferenceException。
-
§7.6.10.2 “在等号之后指定集合初始值设定项的成员初始值设定项是嵌入式集合的初始化。不是将新集合分配给字段或属性,而是在初始化器被添加到字段或属性引用的集合中。”您的列表正在其他地方初始化以使您的代码正常工作 - 您给出的示例将无法正确运行。
-
正如@BoltClock 所指出的,我的问题不包括我正在使用的实际场景,并且我在属性声明中设置了一个新列表的值。
标签: c# initializer