6

人々が配列を初期化するためにいくつかの異なる方法を使用しているのを見てきました:

string[] Meal = new string[]{"Roast beef", "Salami", "Turkey", "Ham", "Pastrami"};

または、初期化とも呼ばれる別の方法は次のとおりです。

string[] Meats = {"Roast beef", "Salami", "Turkey", "Ham", "Pastrami" };

最良の方法は何ですか? また、両方の方法の主な違いは何ですか (メモリ割り当てを含む)?

4

4 に答える 4

16

どちらの場合も違いはありません。コンパイラは同じバイトコード ( newarrOpCode ) を生成します。

public static void Main()
{
   string[] Meal = new string[] { "Roast beef", "Salami", "Turkey", "Ham", "Pastrami"};
   string[] Meats = { "Roast beef", "Salami", "Turkey", "Ham", "Pastrami" };
}

MSIL:

.entrypoint
  // Code size       100 (0x64)
  .maxstack  3
  .locals init ([0] string[] Meal,
           [1] string[] Meats,
           [2] string[] CS$0$0000)
  IL_0000:  nop
  IL_0001:  ldc.i4.5
  IL_0002:  newarr     [mscorlib]System.String
  IL_0007:  stloc.2
  IL_0008:  ldloc.2
  IL_0009:  ldc.i4.0
  IL_000a:  ldstr      "Roast beef"
  IL_000f:  stelem.ref
  IL_0010:  ldloc.2
  IL_0011:  ldc.i4.1
  IL_0012:  ldstr      "Salami"
  IL_0017:  stelem.ref
  IL_0018:  ldloc.2
  IL_0019:  ldc.i4.2
  IL_001a:  ldstr      "Turkey"
  IL_001f:  stelem.ref
  IL_0020:  ldloc.2
  IL_0021:  ldc.i4.3
  IL_0022:  ldstr      "Ham"
  IL_0027:  stelem.ref
  IL_0028:  ldloc.2
  IL_0029:  ldc.i4.4
  IL_002a:  ldstr      "Pastrami"
  IL_002f:  stelem.ref
  IL_0030:  ldloc.2
  IL_0031:  stloc.0
  IL_0032:  ldc.i4.5
  IL_0033:  newarr     [mscorlib]System.String
  IL_0038:  stloc.2
  IL_0039:  ldloc.2
  IL_003a:  ldc.i4.0
  IL_003b:  ldstr      "Roast beef"
  IL_0040:  stelem.ref
  IL_0041:  ldloc.2
  IL_0042:  ldc.i4.1
  IL_0043:  ldstr      "Salami"
  IL_0048:  stelem.ref
  IL_0049:  ldloc.2
  IL_004a:  ldc.i4.2
  IL_004b:  ldstr      "Turkey"
  IL_0050:  stelem.ref
  IL_0051:  ldloc.2
  IL_0052:  ldc.i4.3
  IL_0053:  ldstr      "Ham"
  IL_0058:  stelem.ref
  IL_0059:  ldloc.2
  IL_005a:  ldc.i4.4
  IL_005b:  ldstr      "Pastrami"
  IL_0060:  stelem.ref
  IL_0061:  ldloc.2
  IL_0062:  stloc.1
  IL_0063:  ret
于 2013-04-19T14:18:19.597 に答える
4

この 2 つは同一であり、同一の IL コードを生成します。2 番目は、1 番目のシンタックス シュガーです。

于 2013-04-19T14:18:43.957 に答える
3

これらの方法は両方とも、コンパイルされたコードでは同等です。最も明確で読みやすいと思われる方法を選択してください。

于 2013-04-19T14:19:14.647 に答える
2

同様の質問に対する Eric Lippert の回答を参照してください。この特定のシナリオでは、どちらも同じコンパイル済みコードと同じ結果を生成します。2 つの構文の唯一の違いは、2番目の構文は変数宣言でのみ使用できることです。つまり、既存の変数の値を変更するために使用することはできません。例えば:

// Compiles fine
string[] Meats = {"Roast beef", "Salami", "Turkey", "Ham", "Pastrami" };

// Causes compilation error
Meats = {"Roast beef", "Salami", "Turkey", "Ham", "Pastrami" };

// Also causes compilation error
string[] Meats2;
Meats2 = {"Roast beef", "Salami", "Turkey", "Ham", "Pastrami" };

個人的には、変数の型を明示的に宣言する場合は、変数宣言に 2 番目の構文を使用することをお勧めします。

string[] Meats = {"Roast beef", "Salami", "Turkey", "Ham", "Pastrami" };

キーワードを使用する傾向がある場合は、最初の構文をお勧めしますvar。これにより、結果がどのようなタイプであると予想されるかが明確になり (読みやすさ)、コンパイラーに次のようにチェックさせるためです。

var Meats = new string[]{"Roast beef", "Salami", "Turkey", "Ham", "Pastrami" };

一般に、1 つのスタイルを選択し、一貫性を持たせることが最善です。

于 2013-04-19T14:21:56.427 に答える