2009-07-02 19 views
5

Trong C# bạn có thể tạo getter/setters theo một cách đơn giản hơn các ngôn ngữ khác:Bạn có thường xuyên thấy sự lạm dụng của các thuật toán/giải quyết nhanh của C# không?

public int FooBar { get; set; } 

Điều này tạo ra một biến tin nội bộ mà bạn không thể giải quyết trực tiếp, với tài sản bên ngoài 'foobar' để truy cập trực tiếp .

Câu hỏi của tôi là - tần suất bạn thấy điều này bị lạm dụng? Dường như nó có tiềm năng cao để vi phạm các thực hành tốt nhất đóng gói thường xuyên. Đừng hiểu lầm tôi, tôi sử dụng nó một cách thích hợp và một phần biến thể của nó cho các loại thuộc tính chỉ đọc, nhưng những kinh nghiệm khó chịu của bạn với nó từ các tác giả khác trong cơ sở mã của bạn là gì?

Làm rõ: định nghĩa lạm dụng dự định thực sự sẽ tạo thuộc tính như vậy khi biến riêng tư phù hợp.

+0

Bị lạm dụng chính xác như thế nào? điều lạm dụng duy nhất tôi có thể nghĩ đến là đặt giá trị của phương thức làm việc vào một tài sản, và đó là khá nhỏ – annakata

+1

Bạn có thể đưa ra một ví dụ mà bạn cho rằng việc sử dụng các thuộc tính tự động không thích hợp không? –

+1

@annakata - mà bạn ** không thể ** thực hiện với thuộc tính được tự động triển khai. –

Trả lời

29

Tôi đã nhìn thấy nó bị lạm dụng (theo ý kiến ​​của tôi). Đặc biệt, khi các nhà phát triển sẽ thường viết:

private readonly int foo; 
public int Foo 
{ 
    get 
    { 
     return foo; 
    } 
} 

họ sẽ thỉnh thoảng viết:

public int Foo { get; private set; } 

Vâng, nó ngắn hơn. Có, từ bên ngoài lớp, nó có ngoại hình giống nhau - nhưng tôi không xem chúng như một thứ tương tự, vì dạng thứ hai cho phép thuộc tính được đặt ở nơi khác trong cùng một lớp. Nó cũng có nghĩa là không có cảnh báo nếu thuộc tính không được thiết lập trong hàm tạo và trường không phải là chỉ đọc cho CLR. Đây là những khác biệt tinh tế, nhưng chỉ cần đi cho các hình thức thứ hai bởi vì nó đơn giản và bỏ qua sự khác biệt cảm thấy như lạm dụng với tôi, ngay cả khi nó nhỏ.

May mắn thay, điều này bây giờ đã có như C# 6:

// Foo can only be set in the constructor, which corresponds to a direct field set 
public int Foo { get; } 
+0

Điểm tốt. Cũng muốn xem chỉ đọc cho các thuộc tính tự động – BengtBe

+0

Tôi đã nhìn thấy điều này thường là tốt, nhưng mất của bạn là thú vị. –

+0

Nó gần như không giống nhau, khiến bạn đánh dấu biến cục bộ foo là chỉ đọc. Nếu nó là chỉ đọc, nó không thể được đặt bất cứ nơi nào khác như trên khởi tạo đầu tiên, nếu không, nó có thể được truy cập từ những nơi khác trong cùng một lớp - như hình thức sau của bạn. –

3

Không có "lạm dụng" chỉ đơn giản là không viết trường theo cách thủ công; và nó là tốt để khuyến khích tất cả các truy cập thông qua tài sản (không trực tiếp đến lĩnh vực này) anyway!

Vấn đề lớn nhất tôi biết là với binary serialization, nơi nó được một chút khó khăn để thay đổi trở về một lĩnh vực thường xuyên mà không làm cho nó phiên bản không tương thích - nhưng sau đó ... sử dụng một serializer khác nhau ;-p

Sẽ tốt hơn nếu có một biến thể chỉ đọc "thích hợp" và nếu bạn không cần sử dụng chuỗi vi xử lý :this() trên các cấu trúc, nhưng .... meh!

+0

Tôi đồng ý. Tôi nghĩ rằng Properties và có thể giúp mở rộng những điều sau này (đặc biệt nếu chúng được công khai và bạn mong đợi người khác sử dụng các lớp học của bạn). – Ian

+0

Làm theo con trỏ hướng dẫn ở đây (;)): Thuộc tính tự động, bạn không thể đến cửa hàng sao lưu của chúng. Nếu nó là eadonly sau đó không có cách nào để cung cấp cho nó một giá trị * ở tất cả *. Vì vậy, nó sẽ là vô nghĩa ... – RCIX

+0

@RCIX: Ý tưởng sẽ là khai báo nó như một tập riêng tư, nhưng sử dụng '[Readonly]' để buộc truy cập này bị ràng buộc chính xác như 'readonly'. –

1

Tôi chưa từng thấy bất kỳ hành vi lạm dụng nào. Và thành thật mà nói, tôi không thực sự hiểu ý của bạn, vì tôi không thể thấy cú pháp này có thể bị lạm dụng như thế nào.

0

Tôi không nghĩ rằng các đặc tính tự động bất kỳ tồi tệ hơn properties thông thường liên quan đến đóng gói.

Nếu bạn muốn nói rằng một số nhà phát triển sử dụng các thuộc tính tự động công cộng thay vì các trường riêng thì điều này dĩ nhiên là sai và phá vỡ đóng gói ..