2010-07-17 18 views
9

Một mặt, tôi biết rằng việc sử dụng nên các tài sản là phải có một lĩnh vực ủng hộ, như trong ví dụ sau:Thuộc tính lĩnh vực sao lưu - Điều gì là tốt cho?

private int m_Capacity; 

    public int Capacity 
    { 
     get { return m_Capacity > 0 ? m_Capacity : -666; } 
     set { m_Capacity = value; } 
    } 

Mặt khác, những gì lợi ích nào tôi nhận được từ việc sử dụng các ví dụ trên trên loại bỏ trường và chỉ sử dụng thuộc tính cho tất cả các mục đích, như trong ví dụ sau:

public int Capacity 
    { 
     get { return Capacity > 0 ? Capacity : -666; } 
     set { Capacity = value; } 
    } 

Điều gì tốt về việc sử dụng trường sao lưu cho thuộc tính thông thường (không được tự động triển khai)?

+6

Bạn không thấy rằng ví dụ thứ hai của bạn dẫn đến StackOverflowExceptions? Bạn đã viết nó đúng chưa? Bạn hiện đang tham chiếu tài sản từ chính bản thân tài sản. –

+1

Bạn hoàn toàn chính xác. Tôi không nghĩ điều này thông qua tôi cũng không chạy mã. – galbarm

+2

@Alex Humphrey: .. từ bên trong bản thân tài sản trong chính tòa nhà trong chính tòa nhà .. – maxwellb

Trả lời

21

Nếu bạn làm điều này:

public int Capacity 
{ 
    get { return Capacity > 0 ? Capacity : -666; } 
    set { Capacity = value; } 
} 

sau đó mã của bạn sẽ có một đệ quy vô hạn. Nó sẽ không bao giờ hoạt động. Đó là bởi vì getter cho Capacity là tham chiếu chính nó. Điều tương tự cũng xảy ra với setter.

Trừ khi bạn đang sử dụng thuộc tính tự động, bạn cần một lĩnh vực sao lưu

+1

Đó là một trường sao lưu đáng xấu hổ không thể tự động; điêu đo thật tuyệt vơi. –

2

Chủ yếu là vì bạn sẽ nhận được StackOverflow.

+0

Thật vậy. Điều này, cụ thể, gây ra hầu hết các SO mà tôi nhớ thấy gần đây trong mã .Net. Tôi tự hỏi liệu một cảnh báo biên dịch có phù hợp hay không; sử dụng này có bao giờ có ý nghĩa? –

+0

Có phải Resharper đặt biểu tượng nhỏ ở lề trái khi cuộc gọi được đệ quy không? Tôi luôn luôn nhìn thấy nó, nhưng tôi không bao giờ chắc chắn cho dù những thứ như thế là R # hoặc VS. –

+0

Có thể Resharper; Tôi chưa bao giờ thấy bất cứ điều gì như thế trong một cổ phiếu VS. – cHao

3

Các memberid tin rõ ràng là hữu ích nếu bạn cần truy cập vào giá trị thực tế của m_Capacity, chứ không phải là giá trị 'quản lý' bạn nhận được từ các Công suất thuộc tính,

CHỈNH SỬA: Các bài đăng khác chỉ ra chính xác lỗi cú pháp. Tôi cũng đã đề cập đến nó, nhưng tôi bỏ qua nó và chỉ cố gắng trả lời câu hỏi của anh ta, dường như là về các thuộc tính tự động

+0

Hoặc nếu bạn cần thay đổi cách tính Công suất. Các thuộc tính với các biến riêng tư được sao lưu là một cách tách rất dễ dàng. –

+0

Điều này nên được bình chọn là câu trả lời. Câu trả lời được chấp nhận hiện tại chỉ nói rằng bạn cần một tài sản nhưng không * tại sao * nó cần thiết, mà sẽ trả lời câu hỏi của OP. –

2

Đừng quên rằng Properties chỉ đơn giản là viết tắt cú pháp để tạo ra các phương thức getter và setter. Họ trông giống như các lĩnh vực, nhưng họ không.

+0

còn được gọi là "đường cú pháp". –

1

Các trường sao lưu hỗ trợ khái niệm đóng gói.

Đóng gói cho phép bạn thay đổi chi tiết thực hiện sau này của lớp mà không thay đổi giao diện của lớp.

Điều này có nghĩa là có trường hậu thuẫn với getters và setters thay vì có một thành viên lớp công khai sẽ làm cho mã của bạn mạnh mẽ hơn và/hoặc có thể đọc được cho các nhà phát triển tương lai hoặc bản thân tương lai của bạn.

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