2012-01-01 38 views
6

Whats sự khác biệt giữa ba cách tạo mới List<string> trong C#?Whats sự khác biệt giữa ba cách tạo Danh sách mới <string> trong C#?

A = new List<string>(); 
B = new List<string> { }; 
C = new List<string>() { }; 
+0

() trong biến số {} đặt dữ liệu vào biến Tôi không chắc chắn B sẽ biên dịch? Nhưng A = C;) – craig1231

+0

Có thể() nhập biến, nhưng sự khác biệt nó tạo ra, vẫn Count = 0 –

+0

Tất cả các biên dịch, trên thực tế, tôi chỉ tìm thấy một số mã đầu của tôi tất cả như B, cảm thấy lạ sau đó tôi đến đây hỏi câu hỏi này :) –

Trả lời

4

Đó là số tương đương, cả ba tạo một số trống List<string>.

  1. là một đơn giản, xây dựng parameterless
  2. sử dụng cú pháp thu khởi, nơi bạn được phép bỏ qua các dấu ngoặc của các nhà xây dựng nếu lớp cung cấp một constructor parameterless
  3. giống như 2., chỉ cần cung cấp các dấu ngoặc đơn xây dựng tùy chọn.

Cú pháp khởi tạo bộ sưu tập cho phép bạn để cung cấp dữ liệu trong khi xây dựng các đối tượng,

List<string> list = new List<string> { "one", "two", "three" }; 

được mở rộng để

List<string> list = new List<string>(); 
list.Add("one"); 
list.Add("two"); 
list.Add("three"); 

bởi trình biên dịch.

+2

Cú pháp khởi tạo đối tượng: 'new Foo() {Bar =" hello ", Count = 2};' Cú pháp khởi tạo bộ sưu tập: 'danh sách mới () {" one "," two "};' - so "cú pháp khởi tạo bộ sưu tập" là thuật ngữ chính xác trong việc sử dụng của bạn. – Adam

+0

đúng, đã sửa. – Femaref

4

Tất cả đều giống nhau. Không có sự khác biệt trong kết quả cuối cùng, chỉ trong cú pháp.

1

Trong ví dụ của bạn, cả ba câu lệnh đều giống nhau: chúng tạo danh sách chuỗi rỗng. Báo cáo B và C có thể gán một số dữ liệu ban đầu cho danh sách, ví dụ:

ingredients = new List<string> { "Milk", "Sugar", "Flour" }; 

() như trong tuyên bố C có thể bỏ qua.

8

Không có sự khác biệt vì bạn không khởi tạo bất kỳ thứ gì bên trong danh sách tại thời điểm khai báo.

Nếu bạn đã thêm một số chuỗi tại tuyên bố thời gian, bạn sẽ cần phải đi với sự lựa chọn thứ hai hoặc thứ ba:

var B = new List<string> { "some", "strings" }; 
var C = new List<string>() { "some", "strings" }; 

Lựa chọn thứ ba sẽ chỉ là cần thiết nếu bạn đã vượt qua một giá trị vào các List<of T> constructor:

var C = new List<string>(5) { "some", "strings" }; 

hoặc

var C = new List<string>(5); // empty list but capacity initialized with 5. 

có mo các nhà xây dựng lại có sẵn cho lớp List<of T> (ví dụ: chuyển một bộ sưu tập hiện có hoặc IEnumerable vào trong hàm tạo danh sách). Xem MSDN để biết chi tiết.

+0

+1 - Giải thích hay. –

1

{} được sử dụng cho bộ sưu tập \ đối tượng initilizer.
Nếu nó vẫn trống, nó không làm gì cả.

Vì vậy, tất cả các dòng đó đều giống nhau.

1

Trong ví dụ bạn đã cung cấp cho chúng tôi, kết quả sẽ giống nhau.

Về hiệu suất, bạn sẽ không tìm thấy bất kỳ vấn đề nào bằng cách sử dụng bất kỳ tùy chọn nào để khởi tạo danh sách trống, vì IL được tạo sẽ chứa ctor(), như bạn có thể thấy bằng cách sử dụng IL DASM.

Nếu bạn muốn khởi tạo danh sách với một số thông tin, bạn có thể đi cho các phương án 2 hoặc 3.

List<string> b = new List<string> { "abc", "abc" }; 
List<string> c = new List<string>() { "abc", "abc"}; 

Xét về hiệu suất cũng là như nhau, IL tạo ra sẽ giống hệt nhau, chứa số điện thoại ctor() và hai Thêm cho cả hai.

Nhưng bạn nên sử dụng cách tốt nhất để đọc. Để tránh bất kỳ sự cố nào khi đọc mã cho bạn đồng nghiệp, tôi sẽ truy cập

List<string> a = new List<string>(); 

Nhưng đó là câu hỏi về ý kiến ​​cá nhân.

+0

Tôi đã sử dụng Danh sách mới {}, giống như một đối tượng cho tôi. Nhưng bây giờ tôi bắt đầu sử dụng Danh sách mới () {}, rõ ràng hơn về những gì tôi đang làm. –

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