2013-04-19 29 views
6

người tôi đã thấy sử dụng một vài cách khác nhau của các mảng khởi tạo:Whats sự khác biệt giữa Khai báo một biến (như mới) và sau đó khởi tạo nó và trực tiếp khởi tạo nó?

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

hay cách khác, hay còn gọi là Khởi tạo là:

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

gì là cách tốt nhất, và những gì là quan trọng khác nhau giữa hai cách (bao gồm cấp phát bộ nhớ)?

+0

[Trình khởi tạo mảng] (http://msdn.microsoft.com/en-us/library/aa664573 (v = vs.71) .aspx) (cũ, nhưng ngôn ngữ chưa thực sự thay đổi ở đây) –

+0

Thậm chí 'var Meats = {" Thịt bò nướng "," Salami "," Turkey "," Ham "," Pastrami "};' cũng giống nhau. –

+0

@ SonerGönül: yea Tôi biết về điều đó. – Vishal

Trả lời

16

Không có sự khác biệt trong cả hai trường hợp. Trình biên dịch tạo ra bytecode cùng (newarr opcode):

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 
+0

Wow điều này rất mô tả @Dmitry, BTW Làm thế nào tôi có thể kiểm tra MSIL? – Vishal

+0

sử dụng tiện ích mặc định trong gói MS Visual Studio ILDASM: http://msdn.microsoft.com/en-us/library/f7dy01k1(v=VS.80).aspx –

+0

Cảm ơn, điều này rất hữu ích. – Vishal

4

Hai là giống hệt nhau, và sẽ tạo ra mã IL giống hệt nhau. Thứ hai chỉ đơn giản là cú pháp đường cho lần đầu tiên.

3

Cả hai cách này đều tương đương với mã được biên dịch, chọn cách bạn cho là rõ ràng nhất hoặc dễ đọc nhất.

2

Xem Eric Lippert's response to a similar question. Trong kịch bản cụ thể này, cả hai đều tạo ra cùng một mã được biên dịch và cùng một kết quả. Sự khác biệt duy nhất giữa hai cú pháp là cú pháp thứ hai chỉ có thể được sử dụng trong khai báo biến, có nghĩa là bạn không thể sử dụng nó để thay đổi giá trị của một biến hiện tại. Ví dụ:

// 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" }; 

Cá nhân, tôi sẽ đề nghị sử dụng cú pháp thứ hai cho khai báo biến, nếu bạn đang tuyên bố một cách rõ ràng các loại biến của bạn, như vậy:

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

Tôi muốn giới thiệu cú pháp đầu tiên nếu bạn có xu hướng sử dụng từ khóa var, vì nó làm cho nó rõ ràng hơn loại bạn mong đợi kết quả là (khả năng đọc) và buộc trình biên dịch kiểm tra bạn, như vậy:

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

Nói chung, tốt nhất là chọn một kiểu và nhất quán.

+1

Nếu bạn bỏ phiếu, hãy giải thích lý do. Tôi muốn hiểu điều gì sai về câu trả lời của tôi. –

Các vấn đề liên quan