2010-04-13 31 views
8

Nhìn vào các tính năng mới của VB 2010, tôi tình cờ gặp hỗ trợ cho Auto-Implemented Properties.Tại sao các thuộc tính tự động C# không hỗ trợ các giá trị mặc định như VB 2010?

Kể từ khi tôi đang làm việc với C#, điều này dường như khá quen thuộc, nhưng tôi nhận thấy rằng VB đã thêm một tính năng tôi rất thích có trong C#: thiết lập một giá trị mặc định tùy ý cho tự động thực hiện bất động sản:

Public Class Person 

    Property Name As String = "Scott Guthrie" 
    Property Age as Integer = 35 

End Class 

Tôi thực sự thích việc sử dụng tự động các thuộc tính tự động trong C#. Điều này sẽ tiết kiệm cho chúng tôi những nỗ lực của việc giới thiệu một lĩnh vực sao lưu và hooking nó lên đến tài sản mỗi khi chúng ta chỉ cần một giá trị mặc định, do đó cluttering lên mã không cần thiết.

Tôi đã tự hỏi tại sao điều này cũng không được giới thiệu trong C#? Điều gì có thể là lý do để không làm điều này? Là một cuộc thảo luận cú pháp đang diễn ra, hoặc có những hạn chế kỹ thuật để thực hiện điều này?

+0

Tại sao một trường sao lưu, không cần điều đó. Nhưng tôi đồng ý rằng nó làm tăng thêm sự lộn xộn. – Abel

+0

PS: bạn không phải là người đầu tiên hỏi, hãy kiểm tra để thảo luận thêm: http://stackoverflow.com/questions/169220/initializing-c-auto-properties – Abel

+0

@Abel: Tôi nhớ đã thấy bài đăng này. Tôi biết nó không thể và làm thế nào để làm việc xung quanh nó, nhưng tôi đã tò mò về lý do thực sự lý do tại sao VB không hỗ trợ nó và C# chưa (chưa). –

Trả lời

3

Điều gì về:

public class Person 
{ 
    public Person() 
    { 
     this.Name = "Scott Guthrie"; 
     this.Age = 35; 
    } 
    public string Name { get; set; } 
    public string Age { get; set; } 
} 

trong thực tế, điều này đi xuống giống nhau và không phải là nhiều công việc phụ, tôi tin. Nhưng có lẽ, một lần trong một thời gian dài, VB trông rõ ràng hơn sau đó C# ... ;-)

EDIT (lý do):
Bạn đã yêu cầu cơ sở lý luận trong bình luận cuối cùng của bạn dưới (và trong) của bạn câu hỏi ban đầu. Suy nghĩ to, tôi nghĩ rằng nguyên tắc trong C# mà mã khởi tạo đi đến một nơi và một nơi duy nhất, cụ thể là nhà xây dựng, là lý do cho quyết định này. Thêm một địa điểm khác mà bạn phải tìm để tìm mã khởi tạo giúp gỡ lỗi khó hơn và mã ít rõ ràng hơn.

Rõ ràng, giá trị khởi tạo nội tuyến không được chứa các phép tính khởi tạo hoặc tính toán khác (ít nhất, rất hạn chế). Trong khi tôi đồng ý rằng nó có thể ngắn gọn hơn trong cách VB, tôi sẽ hiểu nhóm C# và Anders Hejlsberg nếu họ nói rằng họ coi đó là một lợi thế lớn hơn để có một nơi để khởi tạo.

EDIT:here's what Microsoft says about it. Tóm lại, không phải cho C# 4.0, nhưng có lẽ C# 5.0? Ngoài ra:

"Nó không phải là dễ dàng như nó có vẻ mặc dù: điều tiếp theo bạn muốn là cho constructor để khởi tạo lĩnh vực sao lưu , nhưng nó chỉ có thể làm điều đó thông qua setter, mà có thể không phải là những gì bạn muốn."

và (chỉ là một commenter):

"Thiếu khởi hoặc constructor kiểm soát làm cho các tính năng thực tế vô giá trị đối với tài sản trả lại một loại tham khảo"

.
+0

James Curran nhận xét về câu trả lời đó bằng cách nói - "DefaultValueAttribute KHÔNG đặt giá trị của một thuộc tính. Tất cả những gì nó làm là nói với Visual Studio giá trị mặc định sẽ là gì, để trong Cửa sổ thuộc tính, sẽ được in đậm nếu không được đặt thành giá trị đó. Nó không thay đổi giá trị theo bất kỳ cách nào " –

+0

Xem nhận xét trong chuỗi khác:" DefaultValueAttribute KHÔNG đặt Tất cả những gì nó làm là nói cho Visual Studio biết giá trị mặc định là gì, để trong Cửa sổ thuộc tính, sẽ được in đậm nếu nó không được đặt thành giá trị đó. Nó không thay đổi giá trị theo bất kỳ cách nào. " –

+0

Nếu tôi không nhầm, 'DefaultValue' chỉ đặt giá trị cho Visual Studio, trong ngăn thuộc tính, nhưng không đặt giá trị tại thời gian thực thi. – Shimrod

10

Tại sao không chỉ mặc định chúng trong hàm tạo? Đó là những gì nó cho quá.

+0

Chính xác. Tại chỗ trên. – Finglas

+1

Đó là những gì tôi thường làm, nhưng đôi khi nó có thể hữu ích để xem các giá trị mặc định khi khai báo. –

+2

Bạn có thể có nhiều hàm tạo, do đó có nhiều giá trị mặc định. Vì vậy, trong khi đó là một giải pháp tốt, nó không phải là sạch như cung cấp một giá trị mặc định duy nhất. –

0

Trong khi tôi không phải là Microsoft, tôi cho rằng lợi ích nhận thức thấp hơn chi phí để thực hiện, kiểm tra và hỗ trợ tính năng này.

Tất nhiên, bạn chỉ có thể thiết lập các giá trị mặc định bằng cách tuyên bố một constructor, nhưng tôi đồng ý rằng cú pháp VB là rõ ràng hơn một chút (đặc biệt nếu bạn đang đi để trang trí nó với siêu dữ liệu như <DefaultValue(...)>)

0

Tôi có một giải pháp cho việc kinh doanh tẻ nhạt của việc chuyển đổi thuộc tính tự động thành trường thuộc tính có hậu trường: Addin của tôi , AtomineerUtils sẽ thực hiện việc tái cấu trúc đó cho bạn bằng một lần nhấn phím.

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