3
string name = "bob";
object obj = name; 
obj = "joe";
Console.WriteLine(name);

名前がbobを印刷する方法について少し混乱しています。文字列とオブジェクトの両方が参照型である場合、「obj = name」の割り当て後、ヒープ上の同じメモリを指すべきではありませんか?ご説明いただきありがとうございます。

編集:StackUnderflowの例は、別の関連する質問を提起しました。

MyClass myClass1 = new MyClass();
MyClass myClass2;
myClass1.value = 4;
myClass2 = myClass1;
myClass2.value = 5;  // myClass1 and myClass2 both have 5 for value

両方がクラス参照である場合はどうなりますか?一方の参照を介してクラスフィールドを変更でき、もう一方の参照に反映されるため、同じように機能しないのはなぜですか。クラス変数も参照である必要があります。不変の刺し傷が関係するのはここですか?

4

4 に答える 4

6

「obj = name」割り当ての後にヒープ上の同じメモリを指すべきではありません

はい。どちらも同じ文字列インスタンスを参照しています。これは、次のように呼び出すことで確認できます。

bool sameStringReference = object.ReferenceEquals(obj, name); // Will be true

ただし、すぐに次のことを行います。

obj = "joe";

これを変更しているのでobj、別の文字列を参照しています。 nameただし、元の文字列を再割り当てしていないため、引き続き元の文字列を参照します。

次に行う場合:

sameStringReference = object.ReferenceEquals(obj, name); // Will be false

これは、この時点で false になります。

于 2012-06-16T01:28:46.860 に答える
5

(OPはC ++の背景を述べているため):

C# の参照は C++ の参照と同じではなく、ポインターのように機能します。C# では、初期化時に「バインド」されないため、代入演算子 ( =)は元のオブジェクトを変更する代わりに新しい参照を割り当てます

C++ の場合:

std::string name = "bob";
std::string& obj = name; // now bound to 'name'
obj = "joe"; // name is directly affected
std::cout << name; // prints "joe"

C# の場合:

string name = "bob";
string obj = name; // both reference "bob"
obj = "joe"; // obj now references "joe", and name still references "bob"
Console.WriteLine(name); // prints "bob"
于 2012-06-16T01:37:56.583 に答える
1

objいいえ、 「joe」文字列オブジェクトへの参照を再割り当てしているだけです。文字列は不変であるため、そのように変更することはできません。あなたができる最善のことはname、独自のクラスでラップすることです。

public class MyName
{
    public string Name { get; set; }
}

MyName firstName = new MyName() { Name = "bob" };
MyName secondName = name;
secondName.Name = "joe";
Console.WriteLine(firstName.Name) //outputs "joe"
于 2012-06-16T01:27:52.397 に答える
1

割り当てと変数に対する操作には違いがあります。代わりにこれがあった場合:

public class A { public string Name; }

...
var orig = new A { Name = "bob" };
var obj = orig;
obj.Name = "joe";
Console.WriteLine(orig.Name); //"joe"

objここでは、(何を指すかを変更するのではなく) を指すオブジェクトを変更しますobj

于 2012-06-16T01:33:05.010 に答える