2009-11-06 39 views
6

Tôi đang tìm kiếm thuộc tính tích hợp để chỉ định loại là không thay đổi và tôi chỉ tìm thấy System.ComponentModel.ImmutableObjectAttribute.ImmutableObjectAttribute được sử dụng như thế nào?

Sử dụng Trình phản xạ, tôi đã kiểm tra nơi nó được sử dụng và có vẻ như lớp công khai duy nhất sử dụng nó là System.Drawing.Image ... WTF? Nó có thể đã được sử dụng trên chuỗi, int hoặc bất kỳ kiểu nguyên thủy nào, nhưng Hình ảnh chắc chắn là không phải là không thay đổi, có rất nhiều cách để thay đổi trạng thái nội tại của nó (sử dụng một phương thức đồ họa hoặc phương pháp Bitmap.SetPixel).

Vì vậy, lớp duy nhất trong BCL được tuyên bố rõ ràng là không thay đổi, có thể thay đổi! Hay tôi đang thiếu một cái gì đó?

Trả lời

8

Các trạng thái tài liệu:

Thuộc tính này thường được sử dụng trong cửa sổ Properties để xác định liệu để làm cho một đối tượng có thể mở rộng như read-only. Như vậy, bất động sản này chỉ được sử dụng vào thời gian thiết kế.

Trình phản xạ cho thấy phương pháp duy nhất sử dụng thuộc tính này là nội bộ System.Windows.Forms.PropertyGridInternal.GridEntry.Flags thuộc tính getter được sử dụng bởi lưới thuộc tính thiết kế.

3

Tôi nghĩ rằng bạn có việc sử dụng ImmutableObjectAttribute bối rối - nó có nghĩa là thuộc tính của đối tượng không nên được thay đổi trong một nhà thiết kế dạng hoặc tương tự thời gian thiết kế giao diện người dùng, không rằng đối tượng là bản thân không thay đổi.

Thuộc tính này có lẽ là một ứng cử viên cho WTF hàng ngày, tuy nhiên ...

+1

"không phải là đối tượng là chính nó bất biến" - Tài liệu chỉ định rằng thuộc tính này "Chỉ định rằng một đối tượng không có tài sản con có khả năng được chỉnh sửa". Có vẻ như những gì bạn đang nói là mâu thuẫn với tài liệu. Bạn có thể giải thích? – MasterMastic

+0

@Ken, thuộc tính này có nghĩa là đối tượng không có thuộc tính con nào được * chỉnh sửa * khi sử dụng trình chỉnh sửa thuộc tính * giống như trong trình thiết kế biểu mẫu của Visual Studio. Các thuộc tính đó vẫn có thể được đặt hoặc sửa đổi từ mã bất kể thuộc tính này. Theo tài liệu hiện tại, nhấn mạnh mỏ: "Thuộc tính này thường được sử dụng * trong cửa sổ Properties * để xác định xem có * render * một đối tượng có thể mở rộng là chỉ đọc hay không. Như vậy, thuộc tính này * chỉ được sử dụng ở thời gian thiết kế *. " –

2

Nhìn vào tài liệu cho ImmutableObjectAttribute: "Chỉ định rằng một đối tượng không có khả năng subproperties đang được chỉnh sửa ... Thuộc tính này thường được sử dụng trong cửa sổ Thuộc tính để xác định xem có hiển thị đối tượng có thể mở rộng dưới dạng chỉ đọc hay không. Do đó, thuộc tính này chỉ được sử dụng vào thời gian thiết kế. " Vì vậy, thuộc tính này không thực sự về bất biến: đó là về việc vô hiệu hóa hiển thị/khả năng chỉnh sửa của các subproperties trong một trình soạn thảo như một PropertyGrid.

Vì vậy, hình ảnh không được tuyên bố là không thay đổi, không phải Int32 là có thể thay đổi. Int32 không cần ImmutableObjectAttribute vì nó không được mở rộng. Hình ảnh có nó bởi vì nó sẽ được mở rộng, nhưng không hữu ích như vậy. Đó chỉ là một cái tên thực sự gây hiểu nhầm.

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