了解 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";

我不明白为什么这是合法的。我的属性没有设置 { },它甚至没有要修改的支持列表。这段代码应该做什么?

它不应该像一种方法一样工作吗?除了我每次"得到"它时生成的列表之外,真的有一个存储的列表吗?

(我可以根据需要提供更多细节,并将不胜感激任何其他评论(

了解 List<> 类型的属性的工作原理

您不是在设置属性,而是在获取属性(这是一个列表(,然后对其进行操作(在您的示例中,更改其第一个成员(。如果您要尝试:

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>是一种允许设置元素的对象类型。