我不确定,但是似乎无法设置列表的属性? (set)部分中的代码无法执行,放置断点时调试器不会在set中停止。
如果列表属性的处理方式不同?以及是否有与此主题相关的阅读链接。
class test
{
public test()
{
id = new List<string>();
_id = new List<string>();
}
private List<string> _id;
public List<string> id
{
get { return _id; }
set
{
_id = value;
}
}
}
test t = new test();
t.id.Add("one");
答案 0 :(得分:0)
(设置)部分中的代码未执行,放置断点时调试器不会在设置中停止。
您的问题似乎是,“为什么在执行此操作时未调用set
访问器:t.id.Add("one");
”
原因很简单,set
访问者是List
本身的访问者。您的代码未将t.id
设置为新的List<string>
,而是调用了.Add
属性返回的对象的t.id
方法。
所以执行看起来像这样:
get
时将调用t.id
访问器,它返回_id
的实例.Add
的{{1}}方法,并将字符串_id
添加到私有后备字段"one"
请注意,当您将_id
显式设置为新列表时,在构造函数中会调用set
。
您已声明您的目标是“当我向id添加项目时更改其他一些属性” 。有几种方法可以做到这一点,但可能最容易理解和实现的是:
id
访问器中,返回列表的副本。这样可以防止客户端直接通过get
方法添加项目。另外请注意,不需要Add
访问器。set
方法,客户端必须调用该方法才能实际添加项目。将项目添加到列表后,您就可以在这里做其他事情。例如:
AddId
请注意,这可能会给您班级的客户带来一些困惑,因为他们仍然可以执行class Test
{
private readonly List<string> id = new List<string>();
// Return a copy of our private list
public List<string> Id => id?.ToList();
public void AddId(string newId)
{
id.Add(newId);
// do something else here when we add a new item
}
}
并且不会收到任何错误,但是也不会在私有列表中添加任何内容。如果要在列表中添加内容,则必须调用test.Id.Add("invalid item");
方法:
AddId