我無法在任何地方找到作爲C#關鍵字列出的「字段」。有人知道背景嗎?爲什麼在我的屬性聲明「[field:NonSerialized]」中需要「field:」?
回答
C#編譯器通常無需弄清楚屬性適用的聲明的哪一部分。我可以想到三種情況,您可能會使用它:
- 適用於程序集的屬性。在AssemblyInfo.cs中非常明顯
- 應用於P/Invoke聲明返回值的屬性,[return:MarshalAs]
- 將該屬性應用於不帶訪問器的屬性或事件的支持變量。你的情況。
的NonSerializedAttribute只適用於域,可以按如下方式使用它:
[NonSerialized]
public string myString;
和屬性... – 2010-01-07 17:04:08
沒有隻是字段。 – 2010-01-07 17:04:28
我站好了。 – 2010-01-07 17:07:45
這是必要的,例如,如果您標記事件非序列化。它指定該屬性適用的目標。
它是屬性目標語法的一部分。從specification:
attribute-target:
field
event
method
param
property
return
type
也文檔查看NonSerializedAttribute
:
向該
NonSerializedAttribute
類適用於一個事件,屬性位置設置爲字段,如圖下面的C#代碼。
[field:NonSerializedAttribute()]
public event ChangedEventHandler Changed;
那麼你不能序列化一個事件,而NonSerializedAttribute只適用於字段,所以我不明白[field:NonSerializedAttribute()]是什麼,我也驚訝它編譯。 – 2010-01-07 17:10:12
關鍵是訂閱事件的對象將被視爲對象圖的一部分,並在包含事件的對象被序列化時被序列化。爲了防止它們被序列化,你必須用'NonSerializedAttribute'來指定事件。但是由於'NonSerializedAttribute'只適用於字段,所以必須用attribute-target'field'標記它。 – jason 2010-01-07 17:17:02
Yuriy,我相信委託被編譯成類,在這種情況下,當它被序列化時,它們會用它們的調用列表進行序列化。在這種情況下,您需要將其設置爲[NonSerialized],但它會引發編譯錯誤,因此您需要指定字段:NonSerialized。我認爲他們在.NET 3.5中修復它,然而 – 2010-01-07 17:19:58
這是爲了讓你設置非序列化的字段屬性,這是序列化的事件是有用的。
例如這會給你一個編譯錯誤
[NonSerialized]
public event SomeEventHandler SomeEvent;
爲了解決這個問題,你必須使用field:
[field:NonSerialized]
public event SomeEventHandler SomeEvent;
更多關於此這裏 - Delegates and Serialization
但是你將它標記爲NonSerialized,並且事件不能被序列化。 – 2010-01-07 17:13:13
Yuriy,我相信.NET 3.0事件/代表可以作爲類序列化,因此您必須將它們指定爲NonSerialized – 2010-01-07 17:21:04
Yuriy,請查看以下鏈接http://msdn.microsoft.com/en-us/雜誌/ cc163902.aspx#S1 – 2010-01-07 17:37:24
- 1. 爲什麼我要聲明屬性兩次?還是我?
- 2. 我什麼時候需要聲明session_start();?
- 3. 爲什麼我不需要在頭文件中聲明UIAlertViewDelegate?
- 4. 爲什麼我不能在類屬性聲明中做數學?
- 5. 爲什麼在AndroidManifest中聲明爲可選的特性仍然需要?
- 6. 爲什麼我要聲明<PHP
- 7. 爲什麼要在$(function(){...})中聲明?
- 8. 爲什麼我們需要的java.sql聲明*包
- 9. 爲什麼GCC在模板中需要額外的聲明?
- 10. 爲什麼ASP.Net服務器控件聲明需要runat =「server」屬性?
- 11. 爲什麼模板聲明中的size_t參數需要爲const?
- 12. 爲什麼要在JavaScript中爲實例變量聲明原型屬性
- 13. 爲什麼{{}}在src屬性中不起作用?爲什麼我需要ngSrc?
- 14. 爲什麼我的'ReplaceContent'屬性沒有被聲明?
- 15. 爲什麼我需要聲明「extern crate core」來使用libcore?
- 16. 爲什麼靜態變量需要在C++中聲明兩次
- 17. Scala:爲什麼在聲明中需要賦值給var/val
- 18. 爲什麼不需要在.h文件中聲明此方法?
- 19. 爲什麼首先需要GUID屬性?
- 20. 爲什麼屬性不能在接口中聲明
- 21. 爲什麼在ID屬性中允許聲明@ + id
- 22. 爲什麼在PHP中使用隱式屬性聲明?
- 23. 爲什麼在屬性聲明中只使用setter?
- 24. cvGetMinMaxHistValues需要什麼導入聲明?
- 25. 爲什麼我們需要在C#屬性
- 26. 爲什麼我不能在WebForm中聲明UserControl的子元素(屬性)?
- 27. 爲什麼我需要在我的子類中使用EF5的虛擬屬性?
- 28. 我是否需要顯式聲明所有組件屬性(vue.js)?
- 29. 爲什麼我需要在通用子類中重新聲明類型約束
- 30. 爲什麼我們需要在實體中聲明NOT空構造函數?
你能發佈多一點的代碼嗎?你在哪裏試圖創建一個新的屬性,或者你是否在某處應用該屬性。更多的上下文會有幫助 – Nick 2010-01-07 17:00:52
我忘了那些。我已經更新了我的C#關鍵字列表以包含它們。謝謝!有關詳細信息,請參閱http://blogs.msdn.com/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx。 – 2010-01-07 17:55:38