2016-11-10 11 views
6
string s = ""; 
for(int i=0;i<10;i++) { 
s = s + i; 
} 

私はこの質問に答えるこれらの選択肢でした。下のコードでいくつの文字列オブジェクトが作成されますか?

私はこの単純なコードを持って、私はこのコードによって作成されますどのように多くの文字列オブジェクトを知りたいです。

私には疑問があります。string s = "";はオブジェクトを作成していません。私はそうは思わない、私を明確にしてください。

+演算子で文字列を追加すると、新しい文字列が作成されるので、forループの各繰り返しで作成された新しいオブジェクトになると思います。

私は11個のオブジェクトが作成されると思います。もし私が間違っているなら教えてください。

String result = "1" + "2" + "3" + "4"; //Compiler will optimise this code to the below line. 
String result = "1234"; //So in this case only 1 object will be created?? 

私は以下のリンクに従っていますが、それでも明らかではありません。

Link1

すぎstring strstring str = nullケースをカバーしてください。どうしたら文字列を初期化せず、いつ文字列をnullに割り当てるか。したがって、これらの2つのケースでは、オブジェクトでもオブジェクトでもありません。

string str; 

string str = null; 

後でコードを入力してください。

str = "abc"; 

オブジェクトの数を計算するプログラミング方法はありますか?議論の余地があるトピックであると思うからです。何らかのプログラミングや何らかのツールを使って、どのようにして100%にすることができますか?私はILコードでこれを見ることができません。

新しいオブジェクトが作成されるかどうかを確認するために、以下のコードを試しました。各反復ごとに「異なる」と書いています。それは、常に私に別のオブジェクトを与えることを意味するので、10または20のオブジェクトの可能性があります。それは私に中間状態の情報(iのためにボクシングをやってs = s + i

string s = "0"; 
    object obj = s; 
    for (int i = 0; i < 10; i++) 
    { 
     s = s + i; 

     if (Object.ReferenceEquals(s, obj)) 
     { 
      Console.Write("Same"); 
     } 
     else 
     { 
      Console.Write("Different"); 
     } 
    } 

を与えるものではありませんので、私はstring str = ""は、任意のオブジェクトを作成しないことを声明で合意していませんよ。私はこれを実際に試しました。

string s = null; 
    object obj = null; 

    if (Object.ReferenceEquals(s, obj)) 
    { 
     Console.Write("Same"); 
    } 
    else 
    { 
     Console.Write("Different"); 
    } 

コードは「同じ」の書き込みが、私はstring s = "";を記述する場合、それは、コンソール上で「異なる」を書き込みます。

もう1つ疑いがあります。

s = s + is = s + i.ToString()の違いは何ですか?

s = s + i.ToString() ILコード

IL_000f: call  instance string [mscorlib]System.Int32::ToString() 
IL_0014: call  string [mscorlib]System.String::Concat(string, string) 

s = s + i ILコード

IL_000e: box  [mscorlib]System.Int32 
IL_0013: call  string [mscorlib]System.String::Concat(object, object) 

ので、いただきました、ここでボックスとインスタンスの違い

+1

'ReferenceEquals(" "、string.Empty)'を試してください。 'string s =" "; *は既存の*空の文字列オブジェクトへの参照を格納し、* new *は空文字列を保持します。オブジェクトはそのステートメント用に作成されました。 –

+1

あなたの最新アップデート。 'string'は不変クラスなので、インスタンスを共有することができます(つまりそれらをキャッシュすることはできますが、必ずしも*する必要はありません)。空の文字列は*非常に人気のあるインスタンスです。そのため、 'string.Empty'として明示的にキャッシュされています。 'string s =" 0 ";'は頻繁ではありません.Netは特殊ケース*としてキャッシュしません。 –

+1

これも試してください: 'string s1 =" test ";文字列s2 = "テスト"; ReferenceEquals(s1、s2) 'の場合、JITterによって文字列リテラルがインターンされ再利用されるため、最後の式は' true'を返します。このコードのために1つの新しい文字列オブジェクトが作成されました。これは '' test "'という文字列を持つ単一の文字列オブジェクトです。 –

答えて

6

さて、数えてみましょう:

string s = ""; // no new objects created, s assigned to string.Empty from the cache 

// 10 times: 
for(int i = 0; i < 10; i++) { 
    // i  <- first object to create (boxing): (object) i 
    // s + i <- second object to create: string.Concat(s, (object) i); 
    s = s + i; 
} 
10int sおよび 10 string秒箱入り):3210

string s = ""はあなたが最終的に

string s = ""; 

if (object.ReferenceEquals(s, string.Empty)) 
    Console.Write("Empty string has been cached"); 

置くことができ、追加のオブジェクトを作成しないことをテストするために、我々は20オブジェクトを持っています。

string result = "1" + "2" + "3" + "4"; 

の場合、あなたはresultをすることができ、(だろう)見ることができるようにコンパイル時で計算するので、ただ一つのオブジェクト("1234")が作成されます。の場合

string str; // just a declaration, str contains trash 

string str = null; // no objects created 
... 
str = "abc"; // an object ("abc") created 
+0

しかし、私はオプションを与えられていません20 –

+6

オプションは間違っています。さらに、 'i'は反復ごとにボックス化され、追加の*オブジェクト*(文字列ではありません)を作成します。 –

+0

最初のコードブロックで 'string s =" ";'は文字列オブジェクトを作成します。文字列オブジェクトは0文字しか含まれません。 – sr28

0

ドミトリービッチェンコの答えは正しいとよく説明されていますが、私は何かを追加したいです。

string s = ""; 
for(int i=0;i<10;i++) { 
s = s + i; 
} 

コードでは20個のオブジェクトが表示されます。参照には空の文字列がキャッシュされるため、string str = ""のオブジェクトは作成されません。そしてs = s + i;ボクシングが起こると、新しいオブジェクトになるその寄付保証は、新しい文字列を参照するために作成されますので、以下のILコードに費やされますs + i

IL_000e: box  [mscorlib]System.Int32 
IL_0013: call  string [mscorlib]System.String::Concat(object, object) 

あなたはIL Disassemblerを使用することによってILコードを見ることができます。

+1

s = s + i.ToString();注意してください。 s = s + iと異なるコードを生成する。新しい文字列を作成します - 元の質問に対する答えは10個のStringオブジェクトでなければなりません(10個のボックス化されたintと共に)。 s = s + i.ToString()を使用すると、20個の文字列オブジェクトが作成されます。 – PaulF

+0

@PaulFなので、私がs = s + iをするとき、ボクシングだけが起こるのですが、新しいopbjectは作成されません。 i.ToStringを実行すると、新しいオブジェクトが作成されます。 –

+0

@PaulF私の更新された質問に関する提案はありますか? –

関連する問題