我不确定我想在C#中调用什么操作,但我知道它可以用其他语言完成。
假设我有三个vars并将它们设置为相同的值:
MyObject Ob1 = new MyObject(ID:1);
MyObject Ob2 = Ob1;
MyObject Ob3 = Ob1;
(假设这些变量不在同一个上下文中,我只是不能用它们替换它们,我也不知道它们是否存在。它们可以是一个,两个或数百个代表相同的对象......)
我知道我通过Ob3
对对象所做的更改实际上会更改Ob1
和Ob2
中的对象(当然,它们都代表ID为1的同一对象) 。
但如果我使用Ob3
为Ob3 = new MyObject(ID:2)
分配内容,则不会更改Ob1
和Ob2
的值,因为它们会继续代表对象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#??
中进行“向后”分配答案 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指向
的地方无关这是一张有助于理解的图片
引用变量保存对象所在堆内存储位置的十六进制数。因此,当您将一个引用变量分配给另一个引用变量时,实际上只是将十六进制数字从一个复制到另一个,并且此十六进制数字表示对象所在的位置
答案 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);
编辑:我想证明我认为这通常不是一件好事,这有点像黑客。可能有一些情况下它有用,但将变量保存在元组内并不是一般的事情。