0

我不得不认为我不明白它是如何工作的。

我的具体问题是:当我没有设置器和后备列表变量时,为什么允许我设置列表属性元素的值?

让我解释。假设我有一个 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";

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

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

(我可以根据需求提供更多细节,也将感谢任何其他评论)

4

2 回答 2

4

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

Name = new List<string>();

你会得到你期望得到的编译错误。请注意,由于您每次都在创建一个新列表,因此您的Rows属性仍然是只读的(假设它没有在其他地方公开)。如果您想明确对返回集合的更改是没有意义的,您可以将Name属性的类型更改为IEnumerable<string>

public IEnumerable<string> Name
{
    get
    {
        return Rows.Select(row => row.name); //LINQ is more elegant here
    }
}
于 2012-05-19T19:35:57.530 回答
1

在您的示例中,您没有设置Name(实际上是只读的),但是您设置了包含在Name, 中的第一个列表元素Name[0],并且没有理由不能这样做,因为List<string>它是允许设置的对象类型元素。

于 2012-05-19T19:44:03.167 回答