2013-02-28 39 views
0

我不确定在C#中我要做什么操作,但我知道可以用其他语言完成操作。在单一代码行中分配许多变量C#

假设我有三个VAR和它们设置为相同的值:

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

(假设这些增值经销商并不在同样的情况下,我只是不能代替他们一个一个,我也不能知道他们甚至还存在,它们可以是一个,两个或代表相同的对象数百...)

我知道我的变化使通过Ob3对象实际上会改变Ob1Ob2(当然的对象,他们全部代表ID为1的相同对象)。

但是,如果我给你的东西Ob3,使用Ob3 = 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#中?

+6

如果你要对待所有相同的东西,到处都有,其中有3个是什么意思?只需在所有地方使用Ob1就可以使用Ob2和Ob3,并且您将达到您所要求的 – 2013-02-28 19:21:39

+1

^This。我看到你来自哪里,但变量只是对位置的引用,当你从引用改变属性时,你正在改变相同的位置。当您通过更改变量本身来更改实际位置时,它显然会更改其指向的位置。 – 2013-02-28 19:22:37

+0

斯坦,这些变量不在同一个上下文中。 – 2013-02-28 19:31:42

回答

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); 

编辑:我想限定我认为这通常不是一件好事,这有点破解。有些情况下可能有用,但在元组内部保存变量通常不是一件容易的事情。

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不是一个对象。它是对象的内存位置的引用。所以,如果你告诉OBJ 3,以创建一个新的实例(创建类型为MyObject的新对象)堆中,有absolutey无关,其中OBJ1或OBJ2点

这里是一个图片的理解

帮助

enter image description here

引用变量包含对象位于堆中的内存位置的十六进制数。所以,当你分配一个参考变量到另一个,你实际上只是从一个到另一个复制一个十六进制数字,而这个十六进制数表示,其中对象生活

+0

我可以直接使用C#中的对象吗? – 2013-02-28 19:37:26

+0

@Daniel精心制作。引用变量与指针相同,除了它仅用于对象(种类)之外。在C++中,你不直接使用对象,你使用指向对象的指针 - 非常类似于引用 – 2013-02-28 19:39:59

+0

在C++中,我可以使用(*指针)=值;因此,指向该对象的所有指针都将指向该新值。 (这正是我想要做的,但在C#中,托管语言); – 2013-02-28 19:47:14

1

你可以这样做:

MyObject Obj1, Obj2, Obj3 = new MyObject(ID:1); 
Obj1 = Obj2 = Obj3 = new MyObject(ID:2); 
相关问题