2015-10-01 16 views
7

Tôi chỉ nhận thấy rằng sau đây là có thể trong C# viết bằng Visual Studio 2015, nhưng tôi chưa bao giờ thấy nó trước:Cú pháp khởi tạo đối tượng C# 6 mới?

public class X 
{ 
    public int A { get; set; } 

    public Y B { get; set; } 
} 

public class Y 
{ 
    public int C {get; set; } 
} 

public void Foo() 
{ 
    var x = new X { A = 1, B = { C = 3 } }; 
} 

Kỳ vọng của tôi là dành cho Foo phải được thực hiện như thế này:

public void Foo() 
{ 
    var x = new X { A = 1, B = new Y { C = 3 } }; 
} 

Lưu ý rằng không cần phải gọi new Y.

Đây có phải là điểm mới trong C# 6 không? Tôi đã không thấy bất kỳ đề cập đến điều này trong release notes, vì vậy có lẽ nó luôn luôn ở đó?

+0

có thể trùng lặp của (http://stackoverflow.com/questions/32342188/c-sharp- object-initialization-bug) –

Trả lời

11

Bạn sẽ nhận được NullReferenceException nếu bạn chạy mã này.

Nó sẽ không tạo ra một thể hiện của Y, nó sẽ gọi getter của X.B tài sản và cố gắng để gán giá trị cho tài sản C.

Nó luôn luôn làm việc như thế. Theo đặc điểm kỹ thuật ngôn ngữ C# 5.0:

Trình khởi tạo thành viên chỉ định trình khởi tạo đối tượng sau dấu bằng là bộ khởi tạo đối tượng lồng nhau, tức là khởi tạo đối tượng được nhúng. Thay vì gán một giá trị mới cho trường hoặc thuộc tính, các phép gán trong bộ khởi tạo đối tượng lồng nhau được coi là gán cho các thành viên của trường hoặc thuộc tính.

+0

Bạn nói đúng, cảm ơn. Vì vậy, chúng ta có thể thay đổi khai báo 'X.B' thành giống như 'public Y B {get; } = new Y(); 'và mã này sẽ hoạt động như mong đợi. Lạ lùng mà tôi chưa bao giờ nhận thấy cú pháp này trước đây! – jonnystoten

+2

Tính năng này được giới thiệu trong C# 3.0 – Vova

6

Tính năng này được giới thiệu trong C# 3.0 làm trình khởi tạo đối tượng.

Xem ví dụ về p. 169 của C# Language 3.0 specification: [? C# đối tượng khởi tạo lỗi]

Rectangle r = new Rectangle { 
    P1 = { X = 0, Y = 1 }, 
    P2 = { X = 2, Y = 3 } 
}; 

trong đó có tác dụng tương tự như

Rectangle __r = new Rectangle(); 
__r.P1.X = 0; 
__r.P1.Y = 1; 
__r.P2.X = 2; 
__r.P2.Y = 3; 
Rectangle r = __r; 
Các vấn đề liên quan