【问题标题】:Object still linked (referenced) after selecting it out of list?从列表中选择对象后仍然链接(引用)?
【发布时间】:2010-05-18 11:52:23
【问题描述】:

我想知道,我不太确定,但请帮帮我。

如果您有一个列表项,并且有一个对象需要更改它的属性。 假设 myClass 有一个字符串属性“status”。我正在用 for 循环搜索我的列表,我得到了我的对象,所以我这样做了

myClass item = items[i];

如果我想更改“状态”属性,例如:

item.Status = "new status";

我的问题/问题是:“项目”是否仍然链接到列表项,所以如果我执行上面的行,它也会在列表中更改而无需设置:

items[i] = item;

希望这很清楚。

提前致谢。

【问题讨论】:

    标签: c# list reference


    【解决方案1】:

    列表和item 变量都有对实际对象的引用。您对对象所做的任何更改都可以通过任一引用看到。

    换句话说...假设您查看电话簿,然后选择一个特定的地址。你把地址复制到一张纸上,然后开车去那里。然后你把房子漆成红色。现在,任何在电话簿中查找相同地址并前往那里的其他人仍然会看到一座红色的房子,即使他们没有看到您的那张纸。

    查看我的article about value types and reference types 了解更多信息。

    (顺便说一句,这都是假设myClass 确实是一个类。)

    【讨论】:

      【解决方案2】:

      是的,您正在更改列表中的项目。您无需再次将其分配给列表。

      【讨论】:

      • 假设 myClass 确实是一个类而不是一个结构 :-)
      • @Jakob:即使是结构体也是如此,只要它不是不可变的。
      • 我不同意。如果 myClass 是一个结构,那么 item 变量将是列表中项目的副本。在 djerry 的示例中 item.Status 和 list[0].Status 将不一样。
      【解决方案3】:

      是的,如果myClass 顾名思义是一个类(而不是结构),那么它就是一个reference type。因此,当您编写myClass item = items[i]; 时,它不会被复制。 item 只是对 items[i] 引用的同一对象的引用。

      【讨论】:

        【解决方案4】:

        代码item.Status = "new status";会改变列表项

        items[i] 指向一个 myClass 对象。

        当您说myClass item = items[i]; 时,它同时被itemitems[i] 引用。

        因此,当您更改像 item.Status = "new status"; 这样的属性之一时,您实际上是在更改您的 myClass 对象,该对象现在有两个名称 itemitems[i]

        您也可以使用item[i].Status = "new status";。两者都做同样的工作。

        设置items[i] = item; 无效,因为两者已经引用了同一个对象。

        【讨论】:

          猜你喜欢
          • 2012-10-19
          • 1970-01-01
          • 2019-09-17
          • 1970-01-01
          • 1970-01-01
          • 2012-07-12
          • 2013-10-14
          • 1970-01-01
          • 2016-02-24
          相关资源
          最近更新 更多