-1

参照型がどのように動作するかについて頭を悩ませようとしています。クラスが参照型であることは私の理解です。MyObject型をパラメーターとして受け取るコンストラクターを持つクラスがあるとします。同じMyObjectインスタンスを両方のクラスに渡し、それを 1 つのクラスで変更すると、両方のクラスで変更を確認できますか? 例えば:

MyObject myObject = new MyObject();
MyClass myClass1 = new MyClass(myObject);
MyClass myClass2 = new MyClass(myObject);

myClass1.myObject.Name = "Joe";

myClass2.myObject.Nameに行われた変更を反映する意志を参照すると、 myClass1.myObject.Name?

4

5 に答える 5

1

はい、このように使用する限り。また、MyObject がclassではなく の場合struct:

    MyObject myObject = new MyObject();
    MyClass myClass1 = new MyClass(myObject);
    MyClass myClass2 = new MyClass(myObject);

    myClass1.myObject.Name = "Joe";
于 2013-06-17T15:24:53.857 に答える
1

参照型は「オブジェクト ID」を保持していると考えてください。また、「someReference.DoSomething()」という式は、「ID が_ _ であるオブジェクトを見つけて、それに対して DoSomething() メソッドを実行する」という意味であると考えてください。「reference1 = reference2」のようなステートメントは、reference2 に格納されているオブジェクト ID を reference1 にコピーすることを示しています。最初のステートメントは変更しないことに注意してくださいsomeReference。実行前に「object id #8675309」を保持していた場合、実行後も保持し続けます。さらに、2 番目のステートメントは によって参照されるオブジェクトを変更せず、 によって参照されていたオブジェクトも変更しないことに注意してreference1くださいreference2

.NET 言語のオブジェクト参照で実際にできることはほとんどありません。参照型のメンバーを含むもの [例myCar.Color = Blue;] は、参照型の格納場所には作用しませんが、その場所に ID が格納されているオブジェクトに作用します。

値型は参照型とは異なる動作をすることに注意することが重要です。プリミティブ値型 ( などInt32) の格納場所には、実際に値が保持されます。構造型 (例: ) の格納場所には、その型のDrawing.Pointすべてのインスタンス フィールド (パブリック、内部、またはプライベート) が保持されます。ある値型の格納場所を別の場所にコピーすると、コピー先のすべてのフィールドが最初の値から取得された値で上書きされ、値型のメンバーにアクセスすると、実際にはそこに格納されているフィールドにアクセスします。

次のようなコードを書くことが許されるのは悪いことだと考える人もいます。

Point myPoints[1000];
myPoints[0] = startPosition;
myPoints[1] = startPosition;
myPoints[0].X += 4;

これにより、データの一部が変更されますがmyPoint[0]、他のすべてのコピーは変更startPositionされません。このような動作は、クラス オブジェクトの動作とは大きく異なり、注意が必要ですが、それ自体が非常に便利な場合もあります。

于 2013-06-17T15:32:39.250 に答える