0

C#で実行したい操作が何と呼ばれるかはわかりませんが、他の言語でも実行できることはわかっています。

3つの変数があり、それらを同じ値に設定するとします。

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

(これらの変数が同じコンテキストになく、単一の変数に置き換えることも、存在するかどうかもわかりません。同じオブジェクトを表す1つ、2つ、または数百の変数である可能性があります...)

Ob3を介してオブジェクトに加えた変更は、実際にのオブジェクトOb1を変更することを知っていますOb2(もちろん、それらはすべてID:1の同じオブジェクトを表します)。

Ob3ただし、を使用してに何かを割り当てると、とOb3 = new MyObject(ID:2)の値は変更されません。これらはID:1でオブジェクトを表し続けるためです。Ob1Ob2

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

私がやりたいのは、対応するコードを書くときのように、3つの変数すべてを一度に割り当てることです。Ob3 = new MyObject(ID:2);他のすべての変数は、ID:1ではなくID:2でオブジェクトを表すようになります。

//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#でその「逆方向」の割り当てを行う同様の方法はありますか?

4

3 に答える 3

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はオブジェクトではありません。オブジェクトのメモリ位置への参照。したがって、ヒープ上に新しいインスタンスを作成する(MyObject型の新しいオブジェクトを作成する)ようにobj3に指示した場合、それはobj1またはobj2が指す場所とはまったく関係ありません。

これが理解に役立つ写真です

ここに画像の説明を入力してください

参照変数は、オブジェクトがヒープ上に存在するメモリ位置のHEX番号を保持します。したがって、ある参照変数を別の参照変数に割り当てる場合、実際には1つの16進数を別の16進数にコピーするだけであり、この16進数はオブジェクトが存在する場所を表します。

于 2013-02-28T19:30:38.577 に答える
1

あなたはこれを行うことができます:

MyObject Obj1, Obj2, Obj3 = new MyObject(ID:1);
Obj1 = Obj2 = Obj3 = new MyObject(ID:2);
于 2013-02-28T19:30:54.663 に答える
1

あなたはこれを行うことができます:

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

3つすべてが同じオブジェクトを指します。しかし、あなたがそれから言うなら

Ob3 = new MyObject(ID:2);

Ob1とOb2は引き続き同じMyObjectを指し、Ob3は新しいMyObjectを指します。これは、これらが参照型であるため、Ob1に格納されている値は、基本的にオブジェクト自体へのポインターです。あなたが望むのは、3つすべてが同じものを指すことです。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);

編集:これは一般的に良いことではないと思うので、資格を与えたいと思います。それはちょっとしたハックです。便利な場合もいくつかありますが、変数をタプル内に保持することは、一般的に行うことではありません。

于 2013-02-28T19:42:12.393 に答える