了解 List<> 类型的属性的工作原理
本文关键字:属性 工作 类型 List 了解 | 更新日期: 2023-09-27 18:34:38
我不得不认为我不明白它是如何工作的。
我的具体问题是:当我没有 setter 和 没有支持列表变量时,为什么允许我设置 list 属性元素的值?
让我解释一下。假设我有一个 CustomerTable 类,其中包含:
public List<string> Name
{
get
{
var names = new List<string>();
foreach (CustomerRow row in Rows)
{
name.Add(row.Name);
}
return names;
}
}
这个想法是让只读属性显示列的内容,而不会在我的类中重复数据,因为我已经有一个行列表。
无论如何,当像下面这样的代码片段被Visual Studio接受而没有声称任何类型的错误时,我感到惊讶(它甚至允许我编译而没有错误(:
Name[0] = "John";
我不明白为什么这是合法的。我的属性没有设置 { },它甚至没有要修改的支持列表。这段代码应该做什么?
它不应该像一种方法一样工作吗?除了我每次"得到"它时生成的列表之外,真的有一个存储的列表吗?
(我可以根据需要提供更多细节,并将不胜感激任何其他评论(
您不是在设置属性,而是在获取属性(这是一个列表(,然后对其进行操作(在您的示例中,更改其第一个成员(。如果您要尝试:
Name = new List<string>();
你会得到你期望得到的编译错误。请注意,由于每次都创建新列表,因此 Rows
属性保持只读(假设它未在其他地方公开(。如果要明确表示对返回集合的更改毫无意义,可以将 Name
属性的类型更改为 IEnumerable<string>
:
public IEnumerable<string> Name
{
get
{
return Rows.Select(row => row.name); //LINQ is more elegant here
}
}
在您的示例中,您没有设置Name
(实际上是只读的(,但是您设置了包含在 Name
中的第一个列表元素,这是Name[0]
,并且没有理由不能这样做,因为List<string>
是一种允许设置元素的对象类型。