2010-01-07 82 views
16

我無法在任何地方找到作爲C#關鍵字列出的「字段」。有人知道背景嗎?爲什麼在我的屬性聲明「[field:NonSerialized]」中需要「field:」?

+0

你能發佈多一點的代碼嗎?你在哪裏試圖創建一個新的屬性,或者你是否在某處應用該屬性。更多的上下文會有幫助 – Nick 2010-01-07 17:00:52

+3

我忘了那些。我已經更新了我的C#關鍵字列表以包含它們。謝謝!有關詳細信息,請參閱http://blogs.msdn.com/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx。 – 2010-01-07 17:55:38

回答

6

C#編譯器通常無需弄清楚屬性適用的聲明的哪一部分。我可以想到三種情況,您可能會使用它:

  1. 適用於程序集的屬性。在AssemblyInfo.cs中非常明顯
  2. 應用於P/Invoke聲明返回值的屬性,[return:MarshalAs]
  3. 將該屬性應用於不帶訪問器的屬性或事件的支持變量。你的情況。
0

的NonSerializedAttribute只適用於域,可以按如下方式使用它:

[NonSerialized] 
public string myString; 
+1

和屬性... – 2010-01-07 17:04:08

+2

沒有隻是字段。 – 2010-01-07 17:04:28

+0

我站好了。 – 2010-01-07 17:07:45

12

這是必要的,例如,如果您標記事件非序列化。它指定該屬性適用的目標。

它是屬性目標語法的一部分。從specification

attribute-target: 
    field 
    event 
    method 
    param 
    property 
    return 
    type 

也文檔查看NonSerializedAttribute

向該NonSerializedAttribute類適用於一個事件,屬性位置設置爲字段,如圖下面的C#代碼。

[field:NonSerializedAttribute()]

public event ChangedEventHandler Changed;

+0

那麼你不能序列化一個事件,而NonSerializedAttribute只適用於字段,所以我不明白[field:NonSerializedAttribute()]是什麼,我也驚訝它編譯。 – 2010-01-07 17:10:12

+2

關鍵是訂閱事件的對象將被視爲對象圖的一部分,並在包含事件的對象被序列化時被序列化。爲了防止它們被序列化,你必須用'NonSerializedAttribute'來指定事件。但是由於'NonSerializedAttribute'只適用於字段,所以必須用attribute-target'field'標記它。 – jason 2010-01-07 17:17:02

+0

Yuriy,我相信委託被編譯成類,在這種情況下,當它被序列化時,它們會用它們的調用列表進行序列化。在這種情況下,您需要將其設置爲[NonSerialized],但它會引發編譯錯誤,因此您需要指定字段:NonSerialized。我認爲他們在.NET 3.5中修復它,然而 – 2010-01-07 17:19:58

5

這是爲了讓你設置非序列化的字段屬性,這是序列化的事件是有用的。

例如這會給你一個編譯錯誤

[NonSerialized] 
public event SomeEventHandler SomeEvent; 

爲了解決這個問題,你必須使用field:

[field:NonSerialized] 
public event SomeEventHandler SomeEvent; 

更多關於此這裏 - Delegates and Serialization

+0

但是你將它標記爲NonSerialized,並且事件不能被序列化。 – 2010-01-07 17:13:13

+0

Yuriy,我相信.NET 3.0事件/代表可以作爲類序列化,因此您必須將它們指定爲NonSerialized – 2010-01-07 17:21:04

+0

Yuriy,請查看以下鏈接http://msdn.microsoft.com/en-us/雜誌/ cc163902.aspx#S1 – 2010-01-07 17:37:24

相關問題