2

私がこのコードを持っているとき:

class A 
{
    public int X = 0;
 ...
}

public void Function()
{
    // here I create a new instance of class
    A a = new A();
    a.X = 10;
    // here I create a pointer to null
    A b = null;
    // here I assign a to b
    b = a;
    b.X = 20;
}

クラスAのインスタンスへの参照を今渡しましたか?または、Aのインスタンスを新しいインスタンスに複製し、bでそのインスタンスへの参照を作成しましたか?

xをbに変更すると、Xもaに変更されますか?なんで?そうでない場合、aのコピーを作成し、それをbに挿入する適切な方法は何ですか?

なぜ文字列と同じものが常にコピーを作成するのでしょうか?等しい演算子は文字列でオーバーライドされますか?

string a = "hello";
string b = a;
b = "world";
// "hello world"
Console.WriteLine( a + " " + b );
4

4 に答える 4

6

C#は、ポインターではなく参照を使用します。クラスはreference typesです。

あなたの例で bは、と同じ参照がありaます。それらは、メモリ上の同じ場所を参照しています。

xをbに変更すると、Xもaに変更されますか?なんで?

はい。同じオブジェクトを参照しており、一方の参照を変更するともう一方のオブジェクトに影響するためです。

string a = "hello";
string b = a;
b = "world";
// "hello world"
Console.WriteLine( a + " " + b );

文字列も参照型です。しかし、彼らもそうimmutable typeです。つまり、それらを変更することはできません。それらを変更したと思っても、実際には新しい文字列オブジェクトを作成します。

  1. オブジェクトを作成する行には"hello"、と呼ばれる参照が含まれaます。
  2. b同じオブジェクトへの参照と呼ばれる新しい参照を作成する行。("hello"
  3. b参照と呼ばれる新しいオブジェクトを割り当てる行"world"。あなたのb参照は"hello"もうオブジェクトを参照していません。
于 2013-02-13T10:16:17.407 に答える
4

クラスAのインスタンスへのポインタを渡しましたか?または、Aのインスタンスを新しいインスタンスに複製し、bにそのインスタンスへのポインターを作成しましたか?

bはと同じ参照を保持しておりa、両方とも同じ場所を指しています。

xをbに変更すると、Xもaに変更されますか?なんで?

それらの両方が同じ参照を指しているためです。

aのコピーを作成してbに挿入する適切な方法は何ですか?

IClonableインターフェースを実装する

既存のインスタンスと同じ値を持つクラスの新しいインスタンスを作成するクローン作成をサポートします

編集

文字列を使用して質問を編集したため、文字列は参照型ですが、不変でもあります

文字列(C#リファレンス)

文字列は不変です。文字列オブジェクトの内容は、オブジェクトの作成後に変更することはできませんが、構文上は変更できるように見えます。

于 2013-02-13T10:11:12.837 に答える
1

オブジェクトbはオブジェクトaを指していますIClonable 。インターフェイスを使用してコピーを作成するには、ディープクローンを作成する必要があります。

于 2013-02-13T10:13:15.177 に答える
1

割り当てるときは、割り当てられた式の戻り値のコピーを渡します。

  • 値型の場合、これは、それらを使用するときに通常表示される値です(整数の数値など)。
  • 参照型の場合、実際の値は、参照されるオブジェクトを指すアドレスのようなものです(ただし、実際には、実装の詳細です)。したがって、そのアドレスのコピーを渡しても、そのコピーは同じオブジェクトを指します。
于 2013-02-13T10:47:49.373 に答える