C# 你能让一个元素和一个列表中的元素像同一个对象一样工作吗?

C# 你能让一个元素和一个列表中的元素像同一个对象一样工作吗?,c#,list,reference,C#,List,Reference,我从“是否”这样的问题中了解到,您可以修改对象的属性,而无需从列表中删除该对象。因此,您可以创建一个包装器类并将对象放入其中,然后修改值。但是,如果您试图做的是更改对象本身 我想知道的是:你能制作一系列对象,将它们存储在类似列表的结构中,然后从列表或对象中访问它们吗?你能让对象和列表中的对象表现得像是同一个对象吗?如果使用数组,可以这样做吗 Using System; Using System.Collections.Generic; Namespace Project1 { Clas

我从“是否”这样的问题中了解到,您可以修改对象的属性,而无需从列表中删除该对象。因此,您可以创建一个包装器类并将对象放入其中,然后修改值。但是,如果您试图做的是更改对象本身

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

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
        }
    }
}
使用系统;
使用System.Collections.Generic;
命名空间项目1
{
课堂测试
{
公共静态void Main()
{
int-one=1;
int 2=2;
int num=3;
List myList=新列表();
添加(一个);
添加(两个);
myList.Add(num);
myList[2]=4;//我希望它也将num设置为4
num=5;//我希望将myList[2]也设置为5
Console.WriteLine(myList[2]);//打印4
Console.WriteLine(num);//打印5
}
}
}

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

举例说明:

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...

希望这有帮助

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

通常,要获得所需的行为,您需要使用一个引用类型(即对象),该类型公开您要使用的类型的属性。但是,请注意,即使对于引用类型,也绝对可以有两个引用引用同一对象,但引用本身是不同的-因此将一个引用更改为引用不同的对象不会更改另一个引用所引用的内容

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

您可以模拟一个非常复杂的解决方案,其中维护了一个
Func
/
Action
getter/setter对的列表,并在将原始变量添加到集合之前使用lambdas关闭该变量,但如果要达到该级别,你已经远远超过了应该退后一步,并找出为什么你会走上阻力最大的道路


简单地说,这不是你真正需要做的事情——如果你遇到了这样的事情,这可能是你错过了另一种更好的代码设计方法的迹象。

你是否希望第一个
控制台。WriteLine
打印4,即使
num=5
myList[2]
设置为5?如果你运行了所有的代码,那么这一行是否应该输出5?@PeterDuniho只是试图理解OP并不是在询问修改对象属性的问题。他询问修改存储该对象或其引用的变量。在您的示例中,这相当于修改
imf
变量本身(即引用一个完全不同的
Person
对象),并使
listopersons[2]
元素发生更改。@PeterDuniho:我不同意-请注意他的问题:
您能创建一系列对象,并将它们存储在类似列表的结构中吗,然后从列表或对象中访问它们?你能让对象和列表中的对象看起来像是同一个对象吗?如果使用数组,您可以这样做吗?
-他问您是否可以使变量和列表项像是同一个对象一样工作。