Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我需要“我需要”;字段:";“在我的属性声明中”;[字段:非序列化]”;?_C#_.net_Serialization_Nonserializedattribute - Fatal编程技术网

C# 为什么我需要“我需要”;字段:";“在我的属性声明中”;[字段:非序列化]”;?

C# 为什么我需要“我需要”;字段:";“在我的属性声明中”;[字段:非序列化]”;?,c#,.net,serialization,nonserializedattribute,C#,.net,Serialization,Nonserializedattribute,我在任何地方都找不到作为C#关键字列出的“字段”。有人知道这方面的背景吗?非序列化属性仅适用于字段,您可以按如下方式使用它: [NonSerialized] public string myString; 例如,如果要将事件标记为不可序列化,则这是必需的。它指定属性应用于的目标 它是属性目标语法的一部分。从: 另请参见以下文档: 要将NonSerializedAttribute类应用于事件,请将属性location设置为field,如下面的C#code所示 [字段:NonSerializedA

我在任何地方都找不到作为C#关键字列出的“字段”。有人知道这方面的背景吗?

非序列化属性仅适用于字段,您可以按如下方式使用它:

[NonSerialized]
public string myString;

例如,如果要将事件标记为不可序列化,则这是必需的。它指定属性应用于的目标

它是属性目标语法的一部分。从:

另请参见以下文档:

要将
NonSerializedAttribute
类应用于事件,请将属性location设置为field,如下面的C#code所示

[字段:NonSerializedAttribute()]

公共事件变更事件处理程序变更


这意味着允许您在字段上设置非序列化属性,这在序列化事件时非常有用

例如,这会给您一个编译错误

[NonSerialized]
public event SomeEventHandler SomeEvent;
要解决此问题,您必须使用
字段:

[field:NonSerialized]
public event SomeEventHandler SomeEvent;
这里有更多信息--

C#编译器通常可以毫不费力地确定属性应用于声明的哪一部分。我可以想到三种情况,您可以使用它:

  • 应用于程序集的属性。在AssemblyInfo.cs中非常可见
  • 应用于P/Invoke声明返回值的属性,[返回:marshallas]
  • 将属性应用于不带访问器的属性或事件的支持变量。你的案子

  • 你能多发一点代码吗?您正在尝试在何处创建新属性,或者在何处应用该属性。更多的上下文会有帮助。我忘了这些。我已经更新了我的C#关键字列表,将其包括在内。谢谢有关详细信息,请参阅。您无法序列化事件,并且NonSerializedAttribute仅适用于字段,因此我不理解[field:NonSerializedAttribute()]的作用,我还对它的编译感到惊讶。关键是订阅事件的对象将被视为对象图的一部分,并在序列化包含事件的对象时被序列化。要防止它们被序列化,必须使用
    NonSerializedAttribute
    将事件属性化。但是由于
    NonSerializedAttribute
    仅适用于字段,因此必须使用属性target
    field
    对其进行标记。Yuriy,我认为委托被编译成类,在这种情况下,当委托被序列化时,委托会使用其调用列表进行序列化。在这种情况下,您需要将其设置为[NonSerialized],但它会引发编译错误,因此您需要指定field:NonSerialized。我想他们在.NET3.5中修复了它however@Jason我刚刚使用了一个XML序列化程序,但事件没有序列化。我可以看到EventHandler类如何标记为可序列化,如何为事件重现此行为?但是您将其标记为非序列化,并且事件无法序列化。Yuriy,我相信.NET3.0中的事件/委托是可序列化为类的,因此您必须将它们指定为非序列化的,请查看以下链接,您是正确的。我使用XmlSerializer来序列化该类,该类没有事件序列化。但是二进制格式化程序可以使用它。
    [field:NonSerialized]
    public event SomeEventHandler SomeEvent;