2010-01-07 37 views
16

Tôi không thể tìm thấy "trường" được liệt kê dưới dạng từ khóa C# ở bất kỳ đâu. Có ai biết nền tảng về điều này không?Tại sao tôi cần "trường": trong tuyên bố thuộc tính của tôi "[field: NonSerialized]"?

+0

Bạn có thể đăng thêm một chút mã không? Bạn đang cố tạo thuộc tính mới ở đâu, hoặc bạn đang áp dụng thuộc tính ở đâu đó. Thêm bối cảnh sẽ giúp đỡ. – Nick

+3

Tôi quên mất những điều đó. Tôi đã cập nhật danh sách các từ khóa C# để bao gồm chúng. Cảm ơn! Xem http://blogs.msdn.com/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx để biết chi tiết. –

Trả lời

6

Các trình biên dịch C# thường không gặp khó khăn trong việc tìm ra phần nào của khai báo mà thuộc tính áp dụng. Tôi có thể nghĩ đến ba trường hợp bạn có thể sử dụng nó:

  1. Thuộc tính áp dụng cho lắp ráp. Rất dễ thấy trong AssemblyInfo.cs
  2. Thuộc tính được áp dụng cho giá trị trả lại của khai báo P/Invoke, [return: MarshalAs]
  3. Có thuộc tính áp dụng cho biến số sao lưu của thuộc tính hoặc sự kiện không có người truy cập. Trường hợp của bạn.
0

Các NonSerializedAttribute chỉ áp dụng cho các lĩnh vực, bạn có thể sử dụng nó như sau:

[NonSerialized] 
public string myString; 
+1

và thuộc tính ... –

+2

Không có trường nào. –

+0

Tôi đã sửa. –

12

này là cần thiết, ví dụ, nếu bạn đang đánh dấu một sự kiện như phi serializable. Nó chỉ định mục tiêu mà thuộc tính áp dụng cho.

Đó là một phần của cú pháp mục tiêu thuộc tính. Từ specification:

attribute-target: 
    field 
    event 
    method 
    param 
    property 
    return 
    type 

Xem thêm tài liệu cho NonSerializedAttribute:

Để áp dụng các lớp NonSerializedAttribute tới một sự kiện, thiết lập các vị trí thuộc tính đến lĩnh vực, như trong C# mã sau.

[field:NonSerializedAttribute()]

public event ChangedEventHandler Changed;

+0

Vâng, bạn không thể sắp xếp một sự kiện, và NonSerializedAttribute chỉ áp dụng cho các trường, vì vậy tôi không hiểu [field: NonSerializedAttribute()] làm gì, tôi cũng ngạc nhiên khi nó biên dịch. –

+2

Vấn đề là các đối tượng đăng ký sự kiện sẽ được coi là một phần của đồ thị đối tượng và được tuần tự hóa khi đối tượng chứa sự kiện được đăng. Để ngăn không cho chúng được tuần tự hóa, bạn phải phân bổ sự kiện bằng 'NonSerializedAttribute'.Nhưng vì 'NonSerializedAttribute' chỉ áp dụng cho các trường, bạn phải đánh dấu nó bằng trường' target' đích thuộc tính. – jason

+0

Yuriy, tôi tin rằng các đại biểu được biên dịch thành các lớp, trong trường hợp này, khi nó được tuần tự hóa, họ sẽ tuần tự hóa với danh sách yêu cầu của họ. Trong trường hợp này, bạn cần đặt nó là [NonSerialized], tuy nhiên nó ném một lỗi biên dịch, vì vậy bạn cần phải xác định trường: NonSerialized. Tôi nghĩ rằng họ cố định nó trong NET 3.5. Tuy nhiên –

5

này có nghĩa là để cho phép bạn thiết lập NonSerialized thuộc tính trên các lĩnh vực, điều này rất hữu ích trong serializing sự kiện.

Ví dụ này sẽ cung cấp cho bạn một lỗi biên dịch

[NonSerialized] 
public event SomeEventHandler SomeEvent; 

Để khắc phục điều này, bạn phải sử dụng field:

[field:NonSerialized] 
public event SomeEventHandler SomeEvent; 

Thông tin thêm về điều này ở đây - Delegates and Serialization

+0

Nhưng bạn đánh dấu nó là NonSerialized, và các sự kiện không thể được tuần tự hóa. –

+0

Yuriy, tôi tin vào các sự kiện .NET 3.0/đại biểu đã được tuần tự hóa thành các lớp, vì vậy bạn phải chỉ định chúng là NonSerialized –

+0

Yuriy, hãy xem liên kết sau http://msdn.microsoft.com/en-us/ magazine/cc163902.aspx # S1 –

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