如何设置列表的属性?

时间:2019-06-14 21:39:10

标签: c# list properties set

我不确定,但是似乎无法设置列表的属性? (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");

1 个答案:

答案 0 :(得分:0)

  

(设置)部分中的代码未执行,放置断点时调试器不会在设置中停止。

您的问题似乎是,“为什么在执行此操作时未调用set访问器:t.id.Add("one");

原因很简单,set访问者是List本身的访问者。您的代码未将t.id设置为新的List<string>,而是调用了.Add属性返回的对象的t.id方法。

所以执行看起来像这样:

  1. 执行get时将调用t.id访问器,它返回_id的实例
  2. 然后调用.Add的{​​{1}}方法,并将字符串_id添加到私有后备字段"one"

请注意,当您将_id显式设置为新列表时,在构造函数中会调用set


您已声明您的目标是“当我向id添加项目时更改其他一些属性” 。有几种方法可以做到这一点,但可能最容易理解和实现的是:

  1. 在列表的id访问器中,返回列表的副本。这样可以防止客户端直接通过get方法添加项目。另外请注意,不需要Add访问器。
  2. 在类上提供一个单独的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