2009-01-21 13 views
5

Mir wurde gesagt, dass in C# -Attribute auf den automatisch implementierten Eigenschaften nicht erlaubt sind. Ist das wahr? Wenn ja warum?Unterstützen automatisch implementierte Eigenschaften Attribute?

EDIT: Ich habe diese Informationen aus einem populären Buch über LINQ und konnte es nicht glauben! EDIT: Siehe Seite 34 von LINQ Unleashed von Paul Kimmel, wo er sagt: „Attribute nicht auf automatisch implementierte Eigenschaften erlaubt werden, so dass Ihre eigene Rolle, wenn Sie ein Attribut benötigen“

+0

Können Sie sagen * genau * was die Information ist? (Ich denke, es wäre fair, den Namen und die Referenz für das Buch zu geben, btw.) –

+0

Gewöhnen Sie sich daran zu glauben - in Text und in Tools. Wir alle machen Fehler. Ich erinnere mich an den Tag, an dem der Turbo C++ 1.0-Compiler einen internen Speicherverlust im Kopierkonstruktor hatte (oder etwas, das damit zusammenhängt). Ich konnte nicht glauben, dass es der Fehler des Compilers war und kein Fehler im Quellcode, bis ich es bewiesen habe. Sie haben es in der nächsten Version behoben. –

Antwort

7

Der einfachste Weg, das ist falsch zu beweisen, ist es einfach zu testen:

using System; 
using System.ComponentModel; 
using System.Reflection; 

class Test 
{ 
    [Description("Auto-implemented property")] 
    public static string Foo { get; set; } 

    static void Main(string[] args) 
    { 
     var property = typeof(Test).GetProperty("Foo"); 
     var attributes = property.GetCustomAttributes 
       (typeof(DescriptionAttribute), false); 

     foreach (DescriptionAttribute description in attributes) 
     { 
      Console.WriteLine(description.Description); 
     } 
    } 
} 

Ich schlage vor, Sie den Autor per E-Mail, damit er es als Erratum veröffentlichen. Wenn er meint, dass Sie kein Attribut auf das Feld anwenden können, wird dies ihm eine Chance geben, genauer zu erklären.

12

Sie können Attribute auf automatische Eigenschaften gelten ohne ein Problem.

Zitat von MSDN:

Attribute sind erlaubt auf automatisch implementierte Eigenschaften aber offensichtlich nicht auf den Träger Felder da diese nicht zugänglich sind aus Ihren Quellcode. Wenn Sie ein -Attribut für das Hintergrundfeld einer -Eigenschaft verwenden müssen, erstellen Sie einfach eine reguläre -Eigenschaft.

1

Beachten Sie auch, dass für jede automatische Eigenschaft das CompilerGeneratedAttribute angewendet wird.

3

Ich denke, der Autor meinte, dass Sie benutzerdefinierte Attribute nicht auf private Backing-Feld anwenden können. Zum Beispiel, wenn Sie die automatische Eigenschaft als nicht serialisiert markieren möchten, können Sie dies nicht tun:

[Serializable] 
public class MyClass 
{ 
    [field:NonSerializedAttribute()] 
    public int Id 
    { 
     get; 
     private set; 
    } 
} 

Dieser Code kompiliert, aber es funktioniert nicht. Sie können Attribut auf Eigenschaft selbst anwenden, aber Sie kann nicht gelten es für die Unterstützung Feld.

+0

Das ist nicht das Beste. Wir haben sogar schon die Anweisung 'field:'! –

+0

Kann den Kommentar nicht bekommen :) Wir haben eine 'Feld;' - Anweisung, aber diese Direktive wird nichts für die Eigenschaft mit Hintergrundfeld tun. –

+1

Entschuldigung! Ich meinte, dass ich wünsche, dass die Syntax in Ihrem Beispiel funktioniert :) –

Verwandte Themen