你能将一个元素和一个元素列表作为同一个对象吗?

时间:2016-11-03 00:17:07

标签: c# list reference

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

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

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

2 个答案:

答案 0 :(得分:-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...

希望这有帮助!

答案 1 :(得分:-1)

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

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

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

你可以模拟一个非常复杂的解决方法,你在其中维护一个Action<T> / $route['blog/category/:any'] = 'Blog_Category_Post/page'; getter / setter对的列表,并在将它添加到集合之前使用lambdas来关闭原始变量,但是如果你要达到那个水平,那么你已经远远超过了你应该退后一步并弄清楚你为什么要走大多数阻力的道路。

简单地说,这不是你真正需要做的事情 - 如果你遇到了什么,这可能是你错过了另一个,更好的标志构建代码的方法。