2010-01-07 18 views
16

Nie mogę znaleźć "pola" wymienionego jako słowo kluczowe C# w dowolnym miejscu. Czy ktoś wie, na czym polega tło?Dlaczego potrzebuję "pole:" w mojej deklaracji atrybutu "[field: NonSerialized]"?

+0

Czy możesz dodać trochę więcej kodu? Gdzie próbujesz utworzyć nowy atrybut lub gdzieś stosujesz atrybut. Lepszy byłby kontekst. – Nick

+3

Zapomniałem o nich. Zaktualizowałem listę słów kluczowych w języku C#, aby je uwzględnić. Dzięki! Szczegółowe informacje można znaleźć na stronie http://blogs.msdn.com/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx. –

Odpowiedz

6

kompilator C# zwykle nie ma problemu z określeniem, do której części deklaracji ma zastosowanie atrybut. Mogę wymyślić trzy przypadki, w których można go użyć:

  1. Atrybuty dotyczące zespołu. Bardzo widoczne w AssemblyInfo.cs
  2. Atrybut zastosowany do zwracanej wartości deklaracji P/Invoke, [return: MarshalAs]
  3. Posiadanie tego atrybutu stosuje się do zmiennej wewnętrznej właściwości lub zdarzenia bez akcesorów. Twój przypadek.
0

NonSerializedAttribute ma zastosowanie wyłącznie do pól, można go używać w następujący sposób:

[NonSerialized] 
public string myString; 
+1

i właściwości ... –

+2

Nie tylko pola. –

+0

Stoję poprawione. –

12

Jest to konieczne, na przykład, jeśli oznaczenie zdarzenia jako non-serializacji. Określa cel, do którego odnosi się atrybut.

Jest to część składni celu atrybutu. Z specification:

attribute-target: 
    field 
    event 
    method 
    param 
    property 
    return 
    type 

Zobacz również dokumentacji dla NonSerializedAttribute:

Aby zastosować klasę NonSerializedAttribute do zdarzenia, należy ustawić położenie atrybutu na polu, jak pokazano w poniższym kodzie C#.

[field:NonSerializedAttribute()]

public event ChangedEventHandler Changed;

+0

Cóż, nie można serializować zdarzenia, a atrybut NonSerializedAttribute ma zastosowanie tylko do pól, więc nie rozumiem, co robi [pole: NonSerializedAttribute()], ale jestem także zaskoczony, że się kompiluje. –

+2

Chodzi o to, że obiekty, które subskrybują to wydarzenie, będą traktowane jako część wykresu obiektów i serializowane, gdy obiekt zawierający zdarzenie zostanie zserializowany. Aby zapobiec ich serializacji, musisz przypisać zdarzenie z atrybutem "NonSerializedAttribute".Ale ponieważ 'NonSerializedAttribute' odnosi się tylko do pól, musisz oznaczyć go atrybutem target' target'. – jason

+0

Yuriy, wierzę, że delegaci są wkomponowane w klasy, w którym to przypadku ich serializowanie powoduje ich szeregowanie za pomocą listy inwokacji. W tym przypadku musisz ustawić go jako [NonSerialized], ale spowoduje to błąd kompilacji, więc musisz określić pole: NonSerialized. Myślę, że naprawili to w .NET 3.5 jednak –

5

Ma to pozwala na ustawienie NonSerialized atrybut na polach, to jest przydatne w szeregowania zdarzeń.

Na przykład byłoby to daje błąd kompilacji

[NonSerialized] 
public event SomeEventHandler SomeEvent; 

Do tego trzeba użyć field:

[field:NonSerialized] 
public event SomeEventHandler SomeEvent; 

Więcej o tym tutaj Fix - Delegates and Serialization

+0

Ale oznaczasz to jako NonSerialized, a zdarzenia nie mogą być serializowane. –

+0

Yuriy, wierzę w wydarzenia/delegacje .NET 3.0, które można szeregować jako klasy, więc musieliście podać je jako nieskonfigurowane –

+0

Yuriy, proszę spojrzeć na poniższy link http://msdn.microsoft.com/en-us/ magazine/cc163902.aspx # S1 –

Powiązane problemy