2017-09-28 5 views
0

私は、参照型と値型の違いを理解していると思いました。私は 'string'の値型がのセマンティクスしか持たず、参照型の動作を保持していると考えました。それから、私はこれを試しました。どちらの場合でもTrueが返されると思っていました。 私は何を誤解していますか?stringが参照型の場合、strAの値はこの場合変更されないのはなぜですか?

 string strA = "AAA"; 
     string strB = strA; 
     strB = "BBB"; 
     Console.WriteLine($"strA is {strA} and strB is {strB}"); 
     Console.WriteLine($"The statement: strA == strA is {strA == strB} \n"); 

     Car car1 = new Car(); 
     car1.Horsepower = 190; 
     Car car2 = car1; 
     car2.Horsepower = 200; 
     Console.WriteLine($"car1.Horsepower is {car1.Horsepower} and car2.Horsepower is {car2.Horsepower}"); 
     Console.WriteLine($"The statement: car1 == car2 is {car1 == car2}"); 

出力:

STRAがAAAであるとSTRBがBBB

文です:ストラはストラは

car1.Horsepowerが200であるFalseで==とcar2.Horsepowerが200であります

ステートメント:car1 == car2はTrueです

+0

文字列値が設定されると、メモリ内のその位置を指します。変更することはできません。新しい値を設定すると、新しい値を保持するメモリ内の別の場所への新しいポインタが実際に取得されます。 この動作が必要な場合は、文字列ビルダーで試してみてください。 StringBuilder builderA =新しいStringBuilder( "AAA"); StringBuilder builderB = builderA; builderB.Replace( "AAA"、 "BBB"); (ビルダーB.ToString()} "); – Aaron

+0

@Aaron:ああ。私はC#で文字列を変更することはできません。私は、値を変更するとポインタが変化するというアイデアに対して、私はそれを二分しませんでした。 StringBuilderを理解してくれてありがとう。もし私ができるなら、私は答えとしてこのコメントをマークします。 – PakiPat

+0

他の「純粋な」参照型に共通する文字列の唯一の側面は、スタックではなくヒープに保存されるということです。 – PakiPat

答えて

2

文字列リテラルは文字列インスタンスを指定します。容易にするために、車に文字列を変換する、これはあなたが文字列でやっていることは基本的である:

Car AAA = new Car(); 
Car BBB = new Car(); 

Car carA = AAA; 
Car carB = carA; 
carB = BBB; 
Console.WriteLine($"carA is {carA} and carB is {carB}"); 
Console.WriteLine($"The statement: carA == carB is {carA == carB} 

大きな違いは、コンパイラは、静的な文字列のオブジェクトを事前に割り当てますので、あなたが代わりにnew Car/new String"string literals"を使用することです。

関連する問題