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??
私は以下のリンクに従っていますが、それでも明らかではありません。
すぎstring str
とstring 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 + i
とs = 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)
ので、いただきました、ここでボックスとインスタンスの違い
'ReferenceEquals(" "、string.Empty)'を試してください。 'string s =" "; *は既存の*空の文字列オブジェクトへの参照を格納し、* new *は空文字列を保持します。オブジェクトはそのステートメント用に作成されました。 –
あなたの最新アップデート。 'string'は不変クラスなので、インスタンスを共有することができます(つまりそれらをキャッシュすることはできますが、必ずしも*する必要はありません)。空の文字列は*非常に人気のあるインスタンスです。そのため、 'string.Empty'として明示的にキャッシュされています。 'string s =" 0 ";'は頻繁ではありません.Netは特殊ケース*としてキャッシュしません。 –
これも試してください: 'string s1 =" test ";文字列s2 = "テスト"; ReferenceEquals(s1、s2) 'の場合、JITterによって文字列リテラルがインターンされ再利用されるため、最後の式は' true'を返します。このコードのために1つの新しい文字列オブジェクトが作成されました。これは '' test "'という文字列を持つ単一の文字列オブジェクトです。 –