在单个代码行C#中分配许多变量

时间:2013-02-28 19:19:30

标签: c# pointers assignment-operator assign

我不确定我想在C#中调用什么操作,但我知道它可以用其他语言完成。

假设我有三个vars并将它们设置为相同的值:

MyObject Ob1 = new MyObject(ID:1); 
MyObject Ob2 = Ob1;
MyObject Ob3 = Ob1;

(假设这些变量不在同一个上下文中,我只是不能用它们替换它们,我也不知道它们是否存在。它们可以是一个,两个或数百个代表相同的对象......)

我知道我通过Ob3对对象所做的更改实际上会更改Ob1Ob2中的对象(当然,它们都代表ID为1的同一对象) 。

但如果我使用Ob3Ob3 = new MyObject(ID:2)分配内容,则不会更改Ob1Ob2的值,因为它们会继续代表对象ID:1

// What happens:
Ob3 = new MyObject(ID:2);
// Ob3 is no longer the same as Ob1 and Ob2, wich are still the ID:1 object.

我想要做的是一次分配所有三个变量,比如当我将一些对应代码写入Ob3 = new MyObject(ID:2);时,所有其他变量代表ID为2的对象,而不是ID:1

//What I want:
Ob3 = new MyObject(ID:2); //using the suited operators I don't know
//And Ob1 and Ob2 become the ID:2 object as well.

我知道可以使用C ++中的指针(显然在声明和赋值中进行一些更改)来完成,但我不想用非托管语言来管理事物。那么有没有类似的方法在C#??

中进行“向后”分配

3 个答案:

答案 0 :(得分:1)

MyObject obj1  //This create a reference variable on the stack
obj1 = new MyObject(ID:1)  //This create a new object of type MyOjbect on the heap and then assigns the memory location of this new object to obj1.

MyObject obj2 //This creates a reference variable on the stack, pointing at nothing
obj2 = obj1   //This assigns the memory location of the object (already created) on the heap to the reference variable on the stack

obj3也是如此。

你想要做的事情是不可能的,你需要明确地告诉参考变量obj1和obj2指向这里创建的对象:

Ob3 = new MyObject(ID:2);

因为obj1不是对象,所以obj2不是对象,obj3不是对象。它是对象的内存位置的引用。因此,如果你告诉obj3在堆上创建一个新实例(创建一个MyObject类型的新对象),那就绝对与obj1或obj2指向

的地方无关

这是一张有助于理解的图片

enter image description here

引用变量保存对象所在堆内存储位置的十六进制数。因此,当您将一个引用变量分配给另一个引用变量时,实际上只是将十六进制数字从一个复制到另一个,并且此十六进制数字表示对象所在的位置

答案 1 :(得分:1)

你可以这样做:

MyObject Obj1, Obj2, Obj3 = new MyObject(ID:1);
Obj1 = Obj2 = Obj3 = new MyObject(ID:2);

答案 2 :(得分:1)

你可以这样做:

MyObject Ob1 = new MyObject(ID:1), Ob2 = Ob1, Ob3 = Ob1;

并且所有3将指向同一个对象。但是,如果你再说

Ob3 = new MyObject(ID:2);

Ob1和Ob2仍将指向相同的MyObject,而Ob3将指向新的MyObject。那是因为它们是引用类型,所以存储在Ob1中的值基本上是指向对象本身的指针。你想要的是所有三件事都指向同一件事。如果MyObject是可更新的,你可以说像

Ob3.Reset(ID:2);
如果没有,你可以试试这个,但这很傻。这将让你做你想做的事情,但考虑你正在做的事情是否真的是你想做的事情可能会更好。

Tuple<MyObject> Ob1 = new Tuple<MyObject>(new MyObject(ID:1)), Ob2 = Ob1, Ob3 = Ob1;
Ob3.Item1 = new MyObject(ID:2);

编辑:我想证明我认为这通常不是一件好事,这有点像黑客。可能有一些情况下它有用,但将变量保存在元组内并不是一般的事情。