2010-01-07 5 views
16

no puedo encontrar "campo" aparece como C# palabra clave en cualquier lugar. ¿Alguien sabe los antecedentes sobre esto?¿Por qué necesito "campo:" en mi declaración de atributo "[field: NonSerialized]"?

+0

Se puede publicar un poco más de código? ¿Dónde intentas crear un nuevo atributo o estás aplicando el atributo en alguna parte? Más contexto ayudaría. – Nick

+3

Me olvidé de esos. He actualizado mi lista de palabras clave de C# para incluirlas. ¡Gracias! Consulte http://blogs.msdn.com/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx para obtener más información. –

Respuesta

6

El compilador de C# generalmente no tiene problemas para averiguar a qué parte de una declaración se aplica el atributo. Puedo pensar en tres casos donde puede usarlo:

  1. Atributos que se aplican al ensamblaje. Muy visible en AssemblyInfo.cs
  2. Un atributo aplicado al valor de retorno de una declaración P/Invocar, [return: MarshalAs]
  3. Tener el atributo aplicado a la variable de respaldo de una propiedad o evento sin descriptores de acceso. Tu caso.
0

El NonSerializedAttribute sólo es aplicable a los campos, se puede utilizar de la siguiente manera:

[NonSerialized] 
public string myString; 
+1

y propiedades ... –

+2

No solo campos. –

+0

Estoy parado corregido. –

12

Esto es necesario, por ejemplo, si se está marcando un evento como no serializable. Especifica el objetivo al que se aplica el atributo.

Es parte de la sintaxis de atributo target. Desde el specification:

attribute-target: 
    field 
    event 
    method 
    param 
    property 
    return 
    type 

Véase también la documentación para NonSerializedAttribute:

Para aplicar la clase NonSerializedAttribute a un evento, establecer la ubicación de atributo para el campo, como se muestra en el siguiente código C#.

[field:NonSerializedAttribute()]

public event ChangedEventHandler Changed;

+0

bien no se puede serializar un evento, y la NonSerializedAttribute sólo es aplicable a los campos, por lo que no entiende lo que [field: NonSerializedAttribute()] lo hace, también estoy sorprendido que compila. –

+2

El punto es que los objetos que se suscriben al evento serán consideradas como parte del gráfico de objetos y serializado cuando se serializa el objeto que contiene el evento. Para evitar que se serialicen, debe atribuir el evento con 'NonSerializedAttribute'.Pero como 'NonSerializedAttribute' solo se aplica a los campos, debe marcarlo con el atributo' target 'field'. – jason

+0

Yuriy, creo que los delegados se compilan en clases, en cuyo caso cuando se serializan se serializan con su lista de invocación. En este caso, debe configurarlo como [NonSerialized] pero arroja un error de compilación, por lo que debe especificar el campo: NonSerialized. Creo que lo arreglaron en .NET 3.5, sin embargo, –

5

Esto se hace para que pueda configurar NonSerialized atributo en los campos, esto es útil en la serialización de eventos.

Por ejemplo esto le dará un error de compilación

[NonSerialized] 
public event SomeEventHandler SomeEvent; 

Para solucionar este problema, tiene que usar field:

[field:NonSerialized] 
public event SomeEventHandler SomeEvent; 

Más sobre esto aquí - Delegates and Serialization

+0

Pero lo está marcando como NonSerialized, y los eventos no se pueden serializar. –

+0

Yuriy, creo en .NET 3.0 eventos/delegados fueron serializables como clases, por lo que tuvo que especificarlos como NonSerialized –

+0

Yuriy, consulte el siguiente enlace http://msdn.microsoft.com/en-us/ magazine/cc163902.aspx # S1 –

Cuestiones relacionadas