2015-10-20 13 views
6

sự khác biệt giữa các khái niệm sau để khởi tạo các thuộc tính trong C# 6 là gì:Sự khác nhau giữa (tự động) thuộc tính cú pháp khởi tạo trong C# 6

1. Auto-tài sản khởi tạo từ constructor

public class Context1 
{ 
    public Context1() 
    { 
     this.Items = new List<string>(); 
    } 

    public List<string> Items { get; private set; } 
} 

2: Sở hữu khởi tạo từ một lĩnh vực ủng hộ

public class Context2 
{ 
    private readonly List<string> items; 

    public Context2() 
    { 
     this.items = new List<string>(); 
    } 

    public List<string> Items 
    { 
     get 
     { 
      return this.items; 
     } 
    } 
} 

3: Auto-tài sản cú pháp mới trong C# 6

public class Context3 
{ 
    public List<string> Items { get; } = new List<string>(); 
} 

4: Auto-tài sản cú pháp mới trong C# 6

public class Context4 
{ 
    public List<string> Items => new List<string>(); 
} 

Trả lời

13

Liệt kê 3 là C# 6 của tương đương với danh sách 2, trong đó lĩnh vực ủng hộ được cung cấp dưới mui xe.

Liệt kê 4:

public List<string> Items => new List<string>(); 

tương đương với:

public List<string> Items { get { return new List<string>(); } } 

mà như bạn có thể tưởng tượng được trả về một danh sách trống mới mỗi khi bạn truy cập vào bất động sản.

Sự khác biệt giữa danh sách 2/3 và 4 được khám phá thêm trong ví dụ this Q&A.

Liệt kê 1 chỉ là thuộc tính tự động có trình khởi động và trình thiết lập riêng. Nó không phải là một thuộc tính chỉ đọc trong đó bạn có thể đặt nó ở bất cứ nơi nào bạn có thể truy cập bất kỳ thành viên riêng của loại. Thuộc tính chỉ đọc (có nghĩa là, thuộc tính chỉ dành cho getter) có thể chỉ được khởi tạo hoặc trong một hàm tạo hoặc trong khai báo thuộc tính, giống như một trường chỉ đọc.

+0

Vì vậy, số 4 giống như một hằng số, nhưng với một loại tài liệu tham khảo !? –

+7

Nếu theo "hằng số", bạn có nghĩa là "liên tục trả về một trường hợp mới có giá trị này" (à la https://xkcd.com/221), thì ... uh, tôi đoán vậy. Nhưng đó không phải là những gì "liên tục" có nghĩa là. Có một loại tham chiếu lý do * không thể * là hằng số. – BoltClock

+0

Số 1 và 2 có giống nhau không? –

3

Auto-tài sản là một chỉ định viết tắt của tự động thực hiện sở hữu, nơi mà các nhà phát triển không cần phải khai báo một cách rõ ràng lĩnh vực sao lưu và trình biên dịch đặt lên đằng sau hậu trường.

1. Auto-tài sản với setter tin

public class Context1 
{ 
    public Context1() 
    { 
     this.Items = new List<string>(); 
    } 

    public List<string> Items { get; private set; } 
} 

Auto-thuộc tính có thể có Accessibility khác nhau cho setter và getter bằng cách xác định một khả năng tiếp cận hạn chế hơn cho các accessor mà khả năng tiếp cận khác với khả năng tiếp cận của khách sạn.

ví dụ khác là:

public string Prop1 { get; private set; } 
public string Prop2 { get; protected set; } 
public string Prop3 { get; internal set; } 
public string Prop4 { protected internal get; set; } 

Những accessors với khả năng tiếp cận khác nhau có thể được truy cập bất cứ nơi nào cho khả năng tiếp cận xác định, không chỉ từ các nhà xây dựng.

2.Thuộc tính chỉ đọc với trường sao lưu

lớp công khai Ngữ cảnh2 { riêng tư Danh sách mục;

public Context2() 
{ 
    this.items = new List<string>(); 
} 

public List<string> Items 
{ 
    get { return this.items; } 
} 

} Trước C# 6, cách duy nhất để thiết lập giá trị của một thuộc tính chỉ đọc đã tuyên bố rõ ràng các lĩnh vực sao lưu và đặt nó trực tiếp.

Do trường có đường dẫn readonly, nó chỉ có thể được đặt trong khi xây dựng đối tượng.

3. Read-Only Auto-tài sản

public class Context3 
{ 
    public List<string> Items { get; } = new List<string>(); 
} 

Bắt đầu với C# 6, §2 thể được xử lý bởi trình biên dịch bởi có một lĩnh vực sao lưu được tạo ra như thế nào cho đọc-ghi tự động tính nhưng , trong trường hợp này, trường sao lưu là chỉ đọc và chỉ có thể được đặt trong khi xây dựng đối tượng.

4. Read-only Auto-tài sản với biểu getter thân

public class Context4 
{ 
    public List<string> Items => new List<string>(); 
} 

Khi khách sạn có một giá trị thay đổi mỗi khi nó là nhận được, C# 6 cho phép để khai báo cơ thể của getter sử dụng a cú pháp giống như cú pháp lambda.

Đoạn mã trên là tương đương với điều này:

public class Context4 
{ 
    public List<string> Items 
    { 
     get { return new List<string>(); } 
    } 
} 
Các vấn đề liên quan