25

文字列は参照型と見なされますが、値のように振る舞うことができます。手動または MemberwiseClone() を使用して何かを浅いコピーする場合、文字列はどのように処理されますか? それらは、コピーとマスターから分離され、分離されていると考えられていますか?

4

4 に答える 4

58

文字列は参照型です。ただし、それらは不変 (変更できない) であるため、値によってコピーされるか、参照によってコピーされるかは問題になりません。

それらが浅いコピーされている場合、参照はコピーされます...しかし、それらを変更することはできないため、一度に2つのオブジェクトに影響を与えることはできません.

于 2009-02-03T10:35:00.640 に答える
30

このことを考慮:

public class Person
{
    string name;
    // Other stuff
}

MemberwiseClone を呼び出すと、Person の 2 つの別個のインスタンスが作成されますが、それらのname変数は、別個のものですが、同じ値を持ち、同じ文字列インスタンスを参照します。これは、浅いクローンであるためです。

これらのインスタンスの 1 つで名前を変更しても、2 つの変数自体が分離しているため、他のインスタンスには影響しません。別の文字列を参照するように一方の値を変更するだけです。

于 2009-02-03T10:46:56.793 に答える
6

参照をコピーしているだけです(「ポインター」と考えてください)。2 つの参照は別々ですが (たまたま同じ値を持っています)、単一の文字列オブジェクトしかありません。

于 2009-02-03T10:35:53.557 に答える
1

@stusmith には本当に良い答えがあり、jon は浅いコピーの動作について言及しています。これについて詳しく説明するために、.NET Fiddleを作成しました

浅いコピーを作成していることに気付くと思いますが、実際にはメンバーは文字列のみであるため、深いコピーとしても機能します。明確にするために言うと、文字列への参照が重複しているという意味ではディープ コピーではないため、コピー関数が実行されると、メモリ内に同じ文字列への参照を持つ 2 つのオブジェクトが存在します。

ただし、多くのアプリケーションではこれで問題ありません。私の例のように、最初のオブジェクトをコピーした後に文字列を更新すると、新しい文字列と参照が作成され、最終結果は異なる文字列値への異なる参照を持つ 2 つのオブジェクトになるからです。

フィドルが何をしているかのプレビューは次のとおりです。

// Create a person
Person a = new Person("Sally");

// Shallow copy the person
Person b = a.ShallowCopy();

// Change the name of the second person
b.firstName = "Bob";

// Observe that the original person's name has not changed
Console.WriteLine("First person is {0}", a.firstName);
Console.WriteLine("Second person is {0}", b.firstName);

// Output is:
// First person is Sally
// Second person is Bob
于 2020-06-23T16:13:34.163 に答える