【问题标题】:How to set a Property of a List?如何设置列表的属性?
【发布时间】:2019-06-14 21:39:10
【问题描述】:

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

【问题讨论】:

  • 您的帖子充其量是乱码。将来,您将需要花更多时间来解释问题所在以及您尝试过的方法
  • 对不起,我错过了第一部分是“测试类”,最后两行来自主类,测试类中的设置部分没有被执行,我不确定是否代码有问题,还是逻辑不正确?
  • 你问为什么test.Id.Add("one");不调用setter?
  • @Jonathon Chase 是的,没打电话。尝试了一个断点,也没有停止。
  • 将项目添加到列表时没有调用属性设置器。 ListAdd() 是一种方法 - 当您实际调用List 的方法?在我看来,您的问题是 XY 问题。不要询问您尝试 X(= 调用属性设置器)来解决问题 Y(= ???),而是直接询问或解释您尝试使用 X 解决的实际问题 Y。

标签: c# list properties set


【解决方案1】:

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

看来您的问题是,“为什么我这样做时没有调用 set 访问器:t.id.Add("one");

原因很简单,set 访问器用于 List 本身。您的代码没有将t.id 设置为新的List&lt;string&gt;,而是调用从t.id 属性返回的对象的.Add 方法。

所以执行看起来像这样:

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

请注意,在您现有的代码中,当您将 id 显式设置为新列表时,set确实会从构造函数中调用。


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

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

t.AddId("one");

【讨论】:

  • 那么当我将项目添加到列表时,执行设置器的正确方法是什么?
  • 我想在将项目添加到 id 时更改一些其他属性。
  • 好的,我用一个例子更新了答案。有更好的方法可以做到这一点,但我认为它们可能比你想要的更复杂。
  • 谢谢你,成功了!
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2019-06-27
相关资源
最近更新 更多