【问题标题】:Can you make an element and an element-in-a-list act like the same object?你能让一个元素和一个列表中的元素表现得像同一个对象吗?
【发布时间】:2016-11-03 00:17:07
【问题描述】:

我从诸如“它是Possible to store references to objects in list?”之类的问题中知道,您可以修改对象的属性,而无需从列表中删除该对象。因此,您可以创建一个包装类并将您的对象放入其中,然后修改该值。但是,如果你想要做的是改变对象本身......

我想知道的是:您能否制作一系列对象,将它们存储在类似列表的结构中,然后从列表或对象中访问它们?你能让object object-in-the-list 表现得像同一个object吗?如果你使用数组,你可以这样做吗?

Using System;
Using System.Collections.Generic;

Namespace Project1
{
    Class Test
    {
        Public static void Main()
        {
            int one = 1;
            int two = 2;
            int num = 3;
            List<int> myList = new List<int>();

            myList.Add(one);
            myList.Add(two);
            myList.Add(num);

            myList[2] = 4; // I want this to also set num to 4
            num = 5; // I want this to also set myList[2] to 5

            Console.WriteLine(myList[2]);   //prints 4
            Console.WriteLine(num);         //prints 5
        }
    }
}

【问题讨论】:

  • 即使num = 5myList[2] 设置为5,您是否希望第一个Console.WriteLine 打印4?如果你运行所有代码,那行应该输出 5 吗?
  • @PeterDuniho 只是想理解这个问题

标签: c# list reference


【解决方案1】:

看看你的代码示例,我想我明白你在说什么。基本上,您希望直接访问数组中的元素,而不是通过索引属性访问器。这样做很简单,只要数组中的项是引用类型。但是,这不适用于值类型,因为当涉及值类型时,独立变量和索引属性指向不同的内存存储空间。

举例说明:

listOfPersons[2] = new Person { Name = "Homer Simpson", Age = 35 };
Console.WriteLine(listOfPersons[2].Name);  // will show Homer Simpson

Person myself = listOfPersons[2];
myself.Name = "Bart Simpson";
Console.WriteLine(myself.Name);  // will show Bart Simpson
Console.WriteLine(listOfPersons[2].Name); // will show Bart Simpson

Console.WriteLine(listOfPersons[2].ReferenceEquals(myself));  // will show true

另一方面:

listOfInts[2] = 2;
Console.WriteLine(listOfInts[2]); // will show 2

int myInt = listOfInts[2];
myInt = 5;
Console.WriteLine(myInt);  // will show 5
Console.WriteLine(listOfInts[2]); // will show 2...

希望这会有所帮助!

【讨论】:

  • OP 没有询问修改对象的属性。他询问是否修改存储该对象或其引用的变量。在您的示例中,这相当于修改 myself 变量本身(即引用完全不同的 Person 对象)并更改 listOfPersons[2] 元素。
  • @PeterDuniho:我不同意 - 请注意他的问题:Can you make a series of objects, store them in a list like structure, and then access them from either the list or the objects? Can you make object and the object-in-the-list act like they are the same object? Can you do this if you use an array? - 他在问你是否可以让变量和列表项就像它们是同一个对象一样。
【解决方案2】:

首先,除了您创建的 List 对象之外,您的代码没有任何对象。整数不是对象。您可以将整数装箱,但 C# 将在装箱和拆箱时复制,因此您无法将其用于您的要求。

一般来说,要获得您正在寻找的行为,您需要使用一个引用类型(即一个对象)来公开您想要使用的类型的属性。但是请注意,即使对于引用类型,您也绝对可以有两个引用指向同一个对象,但引用本身是不同的——因此将一个引用更改为引用另一个对象不会改变另一个引用所指的内容.

您可以通过对方法或函数调用的引用来传递参数,但您不能存储此引用(即使尝试用 lambda 关闭它也不行),因此您不能在列表中保留引用并且使用它来更新添加到列表中的变量。

您可以模拟一个非常复杂的解决方法,在其中维护Func&lt;T&gt;/Action&lt;T&gt; getter/setter 对的列表,并在将原始变量添加到集合之前使用 lambdas 关闭原始变量,但如果您是达到那个水平,你早就过了应该退后一步并弄清楚为什么你要走上阻力最大的道路的地步。

简单地说,这不是你真正应该发现自己需要做的事情 - 如果这是你遇到的事情,这可能表明你错过了另一种更好的代码架构方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多