2015-05-25 27 views
10

Tôi đang sử dụng .NET 4.5 trong trình bổ sung VSTO cho triển vọng 2013. Tôi đang gặp một số sự cố khi nắm bắt toàn bộ thuộc tính và trình truy cập. Tự động thực hiện accessors mà tôi giả định là khi bạn chỉ cần viết get; bộ; thay vì nhận được {// code}, v.v. cũng khiến tôi gặp rắc rối. Tôi có một từ điển tôi sử dụng trong nội bộ lớp học của mình. Đây là mã của tôi:Thuộc tính và tự động triển khai

private Dictionary<string, string> clientDict { get; set; } 
private Dictionary<string, string> clientHistoryDict { get; set; } 

sau đó vào lúc:

clientDict = new Dictionary<string, string>(); 
clientHistoryDict = new Dictionary<string, string>(); 

Tôi đang sử dụng tên giống như các thuộc tính trong các mã sau này, trong cùng một lớp.

Tôi chưa bao giờ thực sự viết:

private Dictionary<string, string> _clientDict; // etc. 

để tạo ra các biến tôi chỉ được sử dụng tài sản trực tiếp.

Tôi đã thử thay đổi mã của mình để thực hiện việc này và tôi đã gặp một số vấn đề và nhận ra sự hiểu biết về các thuộc tính của tôi hơi lộn xộn một chút.

Dưới đây là một số câu hỏi tôi cần được làm rõ rằng dường như tôi không thể tìm thấy câu trả lời đúng.

Trước tiên, có lý do gì để sử dụng tài sản riêng tư không? Từ điển của tôi không bao giờ được truy cập bên ngoài lớp học hoặc trong bất kỳ lớp học có nguồn gốc nào như vậy là có một lý do để thậm chí sử dụng tài sản? Tôi không sử dụng bất kỳ xác nhận đặc biệt hoặc bất cứ điều gì trong setter hoặc bất cứ điều gì như thế.

Thứ hai, khi tôi cố thay đổi mã của mình để sử dụng biến và sau đó truy cập chúng thông qua các thuộc tính như ví dụ điển hình của bạn, tôi gặp sự cố. Tôi tìm thấy một ví dụ nơi getter được thiết lập để return _clientDict, nhưng setter chỉ là Nó đã cho tôi lỗi: rằng tôi phải cung cấp cho thiết lập một cơ thể vì nó không trừu tượng hoặc một phần. Tại sao nó không tự động thực hiện setter cho tôi trong trường hợp này?

Cuối cùng, khi tôi gọi mới trên thuộc tính trong cùng một lớp mà nó được khai báo, sự khác nhau giữa việc làm điều đó với thuộc tính và biến bình thường cùng loại là gì? Do các thuộc tính khác nhau ở tất cả các biến trong trường hợp đó? Có thực tế xấu để sử dụng các thuộc tính theo cách này khi nó cần được thực hiện với các biến riêng tư không?

Đây có thể là một số câu hỏi sai lầm nhưng tôi không thể tìm thấy bất kỳ địa điểm nào khác có thông tin để giúp tôi hiểu những khác biệt này. Tôi đã chơi đùa với các tài sản để thử và tìm ra tất cả những điều này nhưng tôi có thể sử dụng để hỗ trợ tôi.

Trả lời

11

First, is there any reason to use a private property?

Thông thường, không. Thuộc tính tuyệt vời cho việc đóng gói . Một lợi thế (có manymore) sử dụng thuộc tính là nó có thể xác thực trước khi gán. Khi bạn có một cái gì đó private, bạn thường không cần để bảo vệ mọi thứ khỏi số mình. Ngoài ra, các thuộc tính có lợi thế là thiết lập các trình truy cập khác nhau (private, protected, v.v.), trong đó các trường không có.

Why would it not auto-implement the setter for me in this instance?

Chúng ta phải hiểu rằng các thuộc tính được tự động triển khai không phải là ma thuật đen. Trình biên dịch sẽ tạo ra một trường hậu thuẫn riêng cho chúng ta, thay vì cung cấp một ourself.Từ quan điểm của mình, anh ta thấy rằng bạn có một getter trả về một trường riêng, nhưng setter là tự động, theo đó sẽ chỉ ra một số loại lỗi logic trong mã của bạn. Tại sao bạn trả lại một giá trị nhưng đặt một giá trị hoàn toàn khác? Khi bạn tạo một thuộc tính với một trường sao lưu, bạn phải cung cấp cả getter và setters, those are the rules.

when I call new on the properties in the same class that it is declared in, what is the difference between doing that with a property and a normal variable of the same type?

Ngữ nghĩa, không có gì. new thuộc loại đang được xây dựng và sẽ phát ra một cuộc gọi hàm tạo. Sự khác biệt là khi đối tượng mới được tạo là được chỉ định. Một trường sẽ khiến trình biên dịch phát ra mã opcode stfld. Đối với một thuộc tính, nó sẽ phát ra một call để gọi trình thiết lập thuộc tính. Khi bạn truy cập thuộc tính, trình biên dịch sẽ kết thúc bằng cách gọi số get_YourPropertyName và số ldfld trên trường.

Is it bad practice to use properties this way when it should be accomplished with private variables?

Tôi sẽ không gọi nó là thực tế xấu, nhưng tôi sẽ cảm thấy hơi lạ khi có tài sản riêng.

Để biết thêm những hiểu biết về các lĩnh vực và các thuộc tính, xem What is the difference between a Field and a Property in C#?

+0

Trợ giúp rất lớn cảm ơn rất nhiều, chỉ cần làm rõ một số? Những gì bạn có ý nghĩa của các lĩnh vực không thể có specifiers truy cập? Biến thành viên riêng tư có phải là một ví dụ về điều này không? Tôi nghĩ rằng tôi đang thiếu những gì bạn có ý nghĩa của lĩnh vực. – shenk

+2

Đối số cho các thuộc tính riêng là tiềm năng cho sự thay đổi trong tương lai. Mặc dù bạn không có logic xác nhận ngay bây giờ, bạn có thể trong tương lai và đã có một thuộc tính cung cấp cho bạn một nơi duy nhất để thay đổi logic này, thay vì mọi phép gán diễn ra trong lớp của bạn, làm cho các biến thể lớp của bạn dễ bảo trì hơn. Nó có thể không phải là một đối số * tuyệt vời *, đặc biệt là trong mọi trường hợp, nhưng nó * có thể * giúp gói gọn một số loại biến động. –

+0

@shenk Một tài sản có thể làm điều này: 'public string Foo {get; bộ bảo vệ; } ', có nghĩa là chỉ các kiểu dẫn xuất mới có thể đặt giá trị' Foo'. Một lĩnh vực không thể làm điều đó. –

3

Is there any reason to use a private property?

Không - đó là toàn bộ điểm thực hiện tự động. Nó tiết kiệm cho bạn phải viết tất cả các mã phụ khi tất cả những gì bạn muốn làm là lấy hoặc thiết lập những gì trong biến thành viên riêng. .Net xử lý việc tạo biến thành viên private shadowing đằng sau hậu trường.

When I tried to change my code to use variables and then access them via the properties like your typical property example would, I ran into problems. I found an example where the getter was set to return _clientDict, but the setter was just set; It gave me the error: that I must give set a body because it's not abstract or partial. Why would it not auto-implement the setter for me in this instance?

Hiểu biết của tôi là tất cả hoặc không có gì khi triển khai tự động. (Mở để sửa chữa ở đó mặc dù). Điều đó nói rằng tôi đã thấy biên dịch mã với khối thiết lập đơn giản được định nghĩa là set { }. Chỉnh sửa: Chỉ cần làm rõ khối set { } sẽ không thực sự đặt giá trị, về cơ bản nó sẽ nuốt cuộc gọi và không làm gì cả - nó sẽ biên dịch.

When I call new on the properties in the same class that it is declared in, what is the difference between doing that with a property and a normal variable of the same type? Do properties differ at all from variables in that case? Is it bad practice to use properties this way when it should be accomplished with private variables?

Không có sự khác biệt thực sự theo như tôi biết. Chính xác điều tương tự đang xảy ra, nó chỉ là. Net đang xử lý hệ thống ống nước cho bạn.

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