2012-04-04 6 views
3

私の知る限り、C#の文字列は参照型です。C#の別の文字列への参照を作成する

したがって、次のコードでは 'a'は「Hi」と同じである必要がありますが、その値は「Hello」です。どうして?

string a = "Hello"; 
string b = a; 
b = "Hi"; 
+3

チェックこの: http://stackoverflow.com/questions/2365272/why-net-string-is-immutable – ZeNo

+5

@ZeNo:これは文字列の不変性とは何の関係もありません。これは通常の参照型の動作です。 – porges

+0

類似した質問:http://stackoverflow.com/questions/636932/in-c-why-is-string-a-reference-type-that-behaves-like-a-value-type – SimpleVar

答えて

26

多くの回答は、文字列が不変であることを示しています。それは本当ですが、それはあなたの質問に完全に無関係です。

より関連性の高いことは、変数に関して参照がどのように機能するかを誤解していることです。参照は変数への参照ではありません。参照を文字列と考えてください。あなたはこれで起動します。

a----------------------Hello 

その後、あなたはaに接続されていることと同じことに文字列の別の部分を添付意味「B = A」、と言う:

a----------------------Hello 
        /
b--------------------- 

その後、あなたは「今、こんにちはにbを付ける」

a----------------------Hello 

b----------------------Hi 

を言うあなたは考えているいずれかの言及は、このように動作していること:

a----------------------Hello 

それから私はbaのための別の名前であることを言う:

a/b ----------------------Hello 

彼らは同じもののための2つの名前であるため、その後、私は、aを変更する、bを変更:

a/b ----------------------Hi 

あるいは、リファレンスが次のように機能すると思っているかもしれません:

あなたは への参照を作成するために期待している、ある

b -------------- a ----------------------Hi 

b -------------- a ----------------------Hello 

その後、私は間接的aを変更bを、変更します。私はbaを参照していることを言う

はその後10 変数の代わりに、の代わりに。 「Mへの呼び出しの期間中、xがyのための別の名前である」ことを意味し

void M(ref int x) 
{ 
    x = 1; 
} 
... 
int y = 0; 
M(ref y); 

:あなたはこのように、C#でそれを行うことができます。同じ変数であるため、xの変更はyを変更します。変数のタイプが参照型である必要はないことに注意してください。

7

行番号が参照する行が変更されます。 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" 
1

参考文献bを変更しています。そうではありません。参照自体は、オブジェクトが変更されずにコピーされます。したがって、b = "Hi"は、 "Hi"オブジェクトへの参照をbにコピーします。これはaには影響しません。

0

NO!

あなたがしたことは、文字列「Hello」に対して2つの参照( 'a'、 'b')を作成することです。 b = "Hi"では、文字列 "Hi"を参照するように 'b'を変更します。

「a」は決してこのように変更されません。

1

参照型の概念は、OOPプログラマの中で最も混乱しやすいものです。

は、以下のコードを実行し、あなたは答えを見て驚かれることでしょう。

Nameと呼ばれるプロパティを持つシンプルなBookクラスを作成し、アプリケーションの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としてであることを考えると、そのがいるだろうBになりましたcbになります。

どちらも該当しません

Ballon analogy for Reference typeでバルーンアニマルを読んでください。詳細については、

+0

実際には、私はすでに知っています:) –

+0

[OK]をクリックして、例の文字列をブックに置き換えて、同じ質問をしたかどうかを確認しますか? – Dhananjay

+1

私はこの行(a = "Hi")が変数(a)を別のオブジェクトを参照するようにしていることを知らなかったので、変数(a)が参照しているオブジェクトを変更していると思いました。 –