私の知る限り、C# の文字列は参照型です。
したがって、次のコードでは、「a」は「Hi」に等しくなければなりませんが、「Hello」という値を保持しています。なんで?
string a = "Hello";
string b = a;
b = "Hi";
私の知る限り、C# の文字列は参照型です。
したがって、次のコードでは、「a」は「Hi」に等しくなければなりませんが、「Hello」という値を保持しています。なんで?
string a = "Hello";
string b = a;
b = "Hi";
多くの回答は、文字列が不変であることを指摘しています。それは本当ですが、それはあなたの質問とはまったく関係ありません。
さらに重要なのは、変数に関して参照がどのように機能するかを誤解しているということです。参照は変数への参照ではありません。参照を文字列の一部と考えてください。あなたはこれから始めます:
a----------------------Hello
次に、「b = a」と言います。これは、に取り付けられている同じものに別の文字列を取り付けることa
を意味します。
a----------------------Hello
/
b---------------------
次に、「b を Hi に付けます」と言います。
a----------------------Hello
b----------------------Hi
あなたは、参照が次のように機能すると考えています。
a----------------------Hello
それから私はそれb
がの別の名前だと言いますa
:
a/b ----------------------Hello
次にb
、 を変更すると が変更されますa
。これらは同じものの 2 つの名前であるためです。
a/b ----------------------Hi
または、参照は次のように機能すると考えているかもしれません。
a----------------------Hello
b
次に、それは次のことを指していると言いますa
:
b -------------- a ----------------------Hello
次にb
、間接的に変更する を変更しますa
。
b -------------- a ----------------------Hi
つまり、値ではなく、変数への参照を作成することを期待しています。次のように、C# でそれを行うことができます。
void M(ref int x)
{
x = 1;
}
...
int y = 0;
M(ref y);
これは、「M への呼び出しの間、x は y の別の名前である」ことを意味します。x を変更すると y が変更されます。これらは同じ変数だからです。変数の型は参照型である必要はないことに注意してください。
この行は、参照b = "Hi";
する文字列を変更しますb
。 a
まだ参照し"Hello"
ます。
string a = "Hello"; // Set a to reference the string "Hello"
string b = a; // Set b to reference the same string as a
b = "Hi"; // Set b to reference the string "Hi"
参照型の概念は、OOPプログラマーの間で最も紛らわしいものです。
以下のコードを実行すると、答えが表示されて驚かれることでしょう。
Book
というプロパティを使用して単純なクラスを作成し、アプリケーションのメソッドにName
次のコードを記述します。Main
Book a = new Book() {Name = "book a"};
Book b = new Book() {Name = "book b"};
Book c = a; //line 3
Book a = b; //Line 4
Console.WriteLine(c.Name);
そして間違いなく、4行目から答えは「本b」であると期待するでしょう。cはaであり、その後aはbになり、 c もbに等しくなると思います。
そうではありません!
参照型のバルーンアナロジーでバルーンアナロジーを読んでください。
参照を変更しています b. ない。参照自体はコピーされますが、オブジェクトは変更されません。したがって、b = "Hi" は "Hi" オブジェクトへの参照を b にコピーします。これは a には影響しません。
いいえ!
あなたがしたことは、文字列 "Hello" への 2 つの参照 ('a'、'b') を作成することです。「b = "Hi"
b」を変更して、文字列「Hi」を参照します。
「a」はこのように変わることはありません。