2010-06-30 39 views
5

Tôi đã đọc rằng có những lý do tốt để sử dụng các thuộc tính thay vì các trường trong C# trên SO. Vì vậy, bây giờ tôi muốn chuyển đổi mã của tôi từ việc sử dụng các trường để sử dụng các thuộc tính.Có cách nào thanh lịch để đặt giá trị mặc định cho thuộc tính trong C#?

Đối với trường thể hiện của một lớp, tôi có thể đặt giá trị mặc định. Ví dụ:

int speed = 100; 

Đối với tài sản tương đương, mà tôi nghĩ là:

int Speed { get; set; } 

sự hiểu biết của tôi là tài sản Speed ​​sẽ được khởi tạo bằng không khi lớp được khởi tạo. Tôi đã không thể tìm hiểu cách đặt giá trị mặc định để dễ dàng cập nhật mã của mình. Có cách nào thanh lịch để cung cấp giá trị mặc định cho một thuộc tính không?

Dường như có một cách thanh lịch để thực hiện việc này, mà không cần sử dụng hàm tạo, nhưng tôi không thể tìm hiểu cách thực hiện.

+0

Có gì sai với việc sử dụng một constructor? Hoặc sử dụng thuộc tính có trường sao lưu được xác định thủ công thay vì trường tự động sửa lỗi? –

+0

Nó sẽ làm cho công việc chuyển đổi của tôi dễ dàng hơn nếu tôi có thể thay đổi trường thành thuộc tính trong cùng một vị trí mà trường đã được khai báo trước đó. Sử dụng một hàm tạo, tôi sẽ cần phải cuộn qua mã của tôi để thực hiện thay đổi. Tôi không biết rằng bạn có thể sử dụng một trường sao lưu đã được khởi tạo. –

+0

Mới trong C# 6: [Trình khởi tạo cho thuộc tính tự động] (https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#auto-property-enhancements) –

Trả lời

7

đặt cược tốt nhất là để làm một tài sản lĩnh vực hậu thuẫn old-fashioned bình thường, như:

private int _speed = 100; 
public int Speed { get { return _speed; } set { _speed = value; } } 
+0

Cảm ơn cho mã. Đó là khá thanh lịch và tôi không phải sử dụng một nhà xây dựng. Rực rỡ. –

+0

Không có prob. Đây là những gì bạn sẽ thấy tất cả thời gian cho mã được viết trước .NET 3.0. Với 3.0, thuộc tính tự động đã được giới thiệu, nhưng bạn chạy vào chính xác vấn đề bạn đã đưa ra, nơi bạn không thể định nghĩa một giá trị mặc định đơn giản, mà không sử dụng hàm tạo. –

+0

Tôi vẫn thích cách làm cũ, tuy nhiên nó có thể gây nhầm lẫn vì bạn không biết cách nào để lấy/đặt giá trị từ bên trong lớp. Bạn có sử dụng biến cá thể hay bạn sử dụng thuộc tính? –

1

bạn phải đặt giá trị mặc định cho thuộc tính trong hàm tạo. Không có cách nào khác để làm điều đó ngoài việc này cho các thuộc tính tự động vì các trường cho các đạo cụ tự động được khai báo tại thời gian biên dịch và được thay thế trong getter/setter. Tuy nhiên trong các thuộc tính rõ ràng, bạn có thể khởi tạo trường mà thuộc tính sử dụng để đọc hoặc ghi như Joe đã đề cập trong câu trả lời của mình.

0

Các nhà xây dựng là cách duy nhất để thiết lập giá trị ban đầu của một tài sản ô tô.

1

CciSharp hỗ trợ DefaultValue attribute, cho phép đặt giá trị mặc định trên thuộc tính tự động. Cho dù CciSharp đủ điều kiện như là một giải pháp "thanh lịch", tuy nhiên, là một vấn đề của ý kiến ​​(nó hoạt động như một trình biên dịch sau đó chỉnh sửa IL trong nhị phân).

2

Mẫu thiết kế tôi sử dụng, được sử dụng trong các điều khiển Windows.Forms của Microsoft và các Lớp .NET khác. Hơn nữa, từ sự hiểu biết của tôi, việc khởi tạo bên ngoài của contructor cho phép trình biên dịch vừa phải để tối ưu hóa mã lớp.

public class Foo { 
    public static const int DefaultSpeed = 100; 
    private int _speed = DefaultSpeed; 
    [DefaultValue(DefaultSpeed)] 
    public int Speed { get { return _speed; } set { _speed = value; } } 
} 

public class Foo { 
     public static Color DefaultForecolor { get {return SystemColors.WindowText; }} 
     private Color _forecolor = DefaultForecolor; 
     [DefaultValue(DefaultForeColor)] 
     public Color Forecolor { get { return _forecolor; } set { _forecolor = value; } } 
    } 
Các vấn đề liên quan