2015-01-27 16 views
9

Sử dụng thành viên Biểu-Bodied tính năng mới trong C# 6.0, chúng ta có thể lấy một phương pháp như thế này:Tại sao chúng ta không thể sử dụng các nhà xây dựng biểu hiện?

public void Open() 
{ 
    Console.WriteLine("Opened"); 
} 

... và thay đổi nó thành một biểu thức đơn giản với chức năng tương đương:

public void Open() => Console.WriteLine("Opened"); 

Tuy nhiên, điều này không đúng đối với các nhà xây dựng. Mã như thế này không biên dịch:

private DbManager() => Console.WriteLine("ctor"); 

Cũng không phải thực hiện điều này:

private DbManager() => {} 

Có bất kỳ lý do tại sao nhà xây dựng không thể được hưởng lợi từ các thành viên biểu hiện thân đặc trưng, ​​và phải được khai báo theo cách truyền thống ?

+0

tôi chỉ có thể cung cấp một * Đoán * đây ... về cơ bản họ đáng kể ít hữu ích cho nhà thầu, và các trường hợp sử dụng chính cho các thành viên biểu hiện thân là nơi họ * trả lại * một cái gì đó, trong khi trong một nhà xây dựng bạn không trả lại bất cứ điều gì. Lưu ý rằng ví dụ cuối cùng của bạn dài hơn là chỉ viết mã * mà không có * '=>'. –

+0

Có một số thí nghiệm xung quanh các nhà thầu đã bị bỏ rơi cho C# 6.0. Có một số tính năng khác được lập kế hoạch cho C# 7.0 liên quan đến các nhà xây dựng và đã có quyết định không thay đổi bất cứ điều gì liên quan đến các nhà thầu lần này. –

Trả lời

14

Sẽ khó hiểu hơn là hữu ích. Đặc biệt khi bạn thêm một cuộc gọi đến một hàm tạo khác.

Dưới đây là trích dẫn trực tiếp từ các ghi chú thiết kế:

Constructors có yếu tố cú pháp trong tiêu đề theo hình thức này (...) hoặc cơ sở (...) initializers mà sẽ trông lạ ngay trước khi một mũi tên chất béo. Quan trọng hơn, các nhà xây dựng hầu như luôn là các tuyên bố hiệu quả phụ và không trả về một giá trị.

Từ C# Design Notes for Nov 4, 2013

Trong một cách tổng quát hơn:

Nói tóm lại, cơ quan biểu hiện được phép về phương pháp và người sử dụng định nghĩa các nhà khai thác (bao gồm cả chuyển đổi), nơi họ thể hiện giá trị trả về từ chức năng, và trên các thuộc tính và các chỉ mục mà chúng biểu diễn giá trị được trả về từ getter, và ngụ ý sự vắng mặt của một setter.

3

Bây giờ, C# 7.0 đã được phát hành, có thể sử dụng các hàm tạo biểu thức.

private DbManager() => Console.WriteLine("ctor"); 

hoạt động tốt trong C# 7.0

+1

Cảm ơn bạn đã chia sẻ! Thật tuyệt khi biết đội C# đã có những thách thức được đề cập trong câu trả lời được chấp nhận. – Gigi

+0

@Gigi Họ chưa bao giờ là những thách thức kỹ thuật. Các đối số là họ "sẽ trông kỳ lạ ngay trước một mũi tên béo". – Neme

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