Ich weiß, dass Attribute äußerst nützlich sind. Es gibt einige vordefinierte, mit [Browsable(false)]
denen Sie Eigenschaften auf der Registerkarte Eigenschaften ausblenden können. Hier ist eine gute Frage zur Erklärung von Attributen: Was sind Attribute in .NET?
Welche vordefinierten Attribute (und deren Namespace) verwenden Sie tatsächlich in Ihren Projekten?
c#
.net
.net-attributes
wusher
quelle
quelle
Antworten:
[DebuggerDisplay]
Dies kann sehr hilfreich sein, um die angepasste Ausgabe eines Typs schnell anzuzeigen, wenn Sie beim Debuggen mit der Maus über die Instanz des Typs fahren. Beispiel:So sollte es im Debugger aussehen:
Erwähnenswert ist auch, dass ein
[WebMethod]
Attribut mitCacheDuration
Eigenschaftssatz eine unnötige Ausführung der Webdienstmethode vermeiden kann.quelle
System.Obsolete
ist meiner Meinung nach eines der nützlichsten Attribute im Framework. Die Möglichkeit, eine Warnung über Code auszulösen, der nicht mehr verwendet werden sollte, ist sehr nützlich. Ich mag es, Entwicklern zu sagen, dass etwas nicht mehr verwendet werden sollte, und zu erklären, warum und auf die bessere / neue Art hinzuweisen, etwas zu tun.Das
Conditional attribute
ist auch ziemlich praktisch für die Debug-Verwendung. Sie können Ihrem Code Methoden für Debug-Zwecke hinzufügen, die beim Erstellen Ihrer Release-Lösung nicht kompiliert werden.Dann gibt es viele Attribute, die für Web Controls spezifisch sind und die ich nützlich finde, aber diese sind spezifischer und haben keine Verwendung außerhalb der Entwicklung von Server Controls, die ich gefunden habe.
quelle
[Flags]
ist ziemlich praktisch. Syntaktischer Zucker zwar, aber immer noch ziemlich schön.Leppie weist darauf hin , etwas , das ich nicht erkannt hatte, und die eher dämpft meine Begeisterung für dieses Attribut: es funktioniert nicht anweisen , den Compiler Bit - Kombinationen als gültige Werte für Aufzählungs Variablen zu ermöglichen, der Compiler dies unabhängig für Aufzählungen ermöglicht. Mein C ++ - Hintergrund zeigt sich durch ... seufz
quelle
[Flags]
hat eine größere Verwendung als nur syntaktischer Zucker. Während der Verwendung von Webdiensten funktioniert die Serialisierung / De-Serialisierung nicht, wenn ein Wert wie übergebenSandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jam
wird. Ohne das[Flags]
Attribut weiß der Deserializer nicht, dass der Wert eine Kombination von Flags sein kann. Ich habe das auf die harte Tour gelernt, nachdem ich ungefähr zwei Tage lang darüber nachgedacht hatte, warum meine WCF nicht funktionierte.Ich mag
[DebuggerStepThrough]
von System.Diagnostics .Dies ist sehr praktisch, um zu vermeiden, dass Sie in diese einzeiligen Do-Nothing-Methoden oder -Eigenschaften eintreten (wenn Sie gezwungen sind, in einem frühen .Net ohne automatische Eigenschaften zu arbeiten). Wenn Sie das Attribut auf eine kurze Methode oder den Getter oder Setter einer Eigenschaft setzen, fliegen Sie direkt vorbei, selbst wenn Sie im Debugger auf "step into" klicken.
quelle
Hier ist eine Liste aller .NET-Attribute . Es gibt mehrere hundert.
Ich weiß von niemand anderem, aber ich habe ernsthaftes RTFM zu tun!
quelle
Meine Stimme wäre für
Conditional
Sie können dies verwenden, um eine Funktion mit erweiterten Debugging-Funktionen hinzuzufügen. wie
Debug.Write
ist es nur genannt in Debug - Builds, und so können Sie komplexe Debug - Logik außerhalb der Hauptströmung des Programms verkapseln.quelle
Ich benutze immer das
DisplayName
,Description
undDefaultValue
Attribute über öffentliche Eigenschaften meiner Benutzersteuerungen, benutzerdefinierten Steuerelemente oder jede Klasse I durch einen Eigenschaftenraster bearbeiten werden. Diese Tags werden vom .NET PropertyGrid verwendet, um den Namen, das Beschreibungsfeld und fettgedruckte Werte zu formatieren, die nicht auf die Standardwerte festgelegt sind.Ich wünschte nur, IntelliSense von Visual Studio würde das
Description
Attribut berücksichtigen, wenn kein XML-Kommentar gefunden wird. Es würde vermeiden, denselben Satz zweimal wiederholen zu müssen.quelle
Description
bis Sie .. Es ist das hilfreichste für mich, wenn es mit Aufzählungen verwendet wird ..[Serializable]
wird ständig zum Serialisieren und Deserialisieren von Objekten zu und von externen Datenquellen wie XML oder von einem Remote-Server verwendet. Mehr dazu hier.quelle
Im Hofstadtschen Geist ist das
[Attribute]
Attribut sehr nützlich, da Sie so Ihre eigenen Attribute erstellen. Ich habe Attribute anstelle von Schnittstellen verwendet, um Plugin-Systeme zu implementieren, Beschreibungen zu Enums hinzuzufügen, mehrere Versendungen und andere Tricks zu simulieren.quelle
Hier ist der Beitrag über das interessante Attribut InternalsVisibleTo . Grundsätzlich ahmt es die Zugriffsfunktionen von C ++ - Freunden nach. Es ist sehr praktisch für Unit-Tests.
quelle
internal
die nicht öffentlich ist. Es ist in der zu testenden Assembly öffentlich und sollte Unit-getestet werden, damit andere Klassen in der Assembly die Korrekturfunktionalität übernehmen können. Wenn Sie es nicht als Unit-Test ausführen, müssen Sie seine Funktionen in allen konsumierenden Klassen testen.Ich habe festgestellt
[DefaultValue]
, dass es sehr nützlich ist.quelle
Ich würde vorschlagen
[TestFixture]
und[Test]
- aus der nUnit- Bibliothek.Unit-Tests in Ihrem Code bieten Sicherheit beim Refactoring und bei der kodifizierten Dokumentation.
quelle
Auf diese Weise können Sie (in jeder XML-Serialisierung) übergeordnete Objekte ignorieren, die sonst beim Speichern Ausnahmen verursachen würden.
quelle
Es ist nicht gut benannt, wird im Framework nicht gut unterstützt und sollte keinen Parameter erfordern, aber dieses Attribut ist ein nützlicher Marker für unveränderliche Klassen:
quelle
ImmutableObjectAttribute
Klasse zu erstellen - zumindest könnten Sie den Parameter entfernen.Ich verwende das
[ThreadStatic]
Attribut gerne in Kombination mit Thread- und Stack-basierter Programmierung. Wenn ich beispielsweise einen Wert möchte, den ich mit dem Rest einer Anrufsequenz teilen möchte, der jedoch außerhalb des Bandes ausgeführt werden soll (dh außerhalb der Aufrufparameter), kann ich so etwas verwenden.Später in meinem Code kann ich dies verwenden, um kontextbezogenen Kontextinformationen für Personen bereitzustellen, die meinem Code nachgeschaltet sind. Beispiel:
Mit dem ThreadStatic-Attribut kann ich den Aufruf nur auf den betreffenden Thread beschränken, um das unordentliche Problem des Datenzugriffs über Threads hinweg zu vermeiden.
quelle
MyContextInformation.Current
, um den aktiven Kontext auf dem Stapel abzurufen. Dies ist ein sehr gutes Konzept, das in bestimmten Fällen von unserer (meiner Firma) Engine für viele Zwecke verwendet wird.Das DebuggerHiddenAttribute , mit dem das Eindringen in Code vermieden werden kann, der nicht debuggt werden sollte.
Außerdem wird verhindert, dass Methoden in der Stapelverfolgung angezeigt werden. Dies ist nützlich, wenn eine Methode nur eine andere Methode umschließt:
Wenn Sie jetzt aufrufen
GetElementAt(new Vector2(10, 10))
und bei der umschlossenen Methode ein Fehler auftritt, zeigt der Aufrufstapel nicht die Methode an, die die Methode aufruft, die den Fehler auslöst.quelle
DesignerSerializationVisibilityAttribute
ist sehr nützlich. Wenn Sie eine Runtime-Eigenschaft in ein Steuerelement oder eine Komponente einfügen und nicht möchten, dass der Designer sie serialisiert, verwenden Sie sie wie folgt:quelle
[Browsable(false)]
ist erforderlich, um es vor dem Benutzer des Designers zu verbergen, wo[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
es erforderlich ist, damit es nicht serialisiert wird.Nur wenige Attribute erhalten Compiler-Unterstützung, aber eine sehr interessante Verwendung von Attributen ist in AOP: PostSharp verwendet Ihre maßgeschneiderten Attribute, um IL in Methoden einzufügen , sodass alle Arten von Fähigkeiten möglich sind ... log / trace sind triviale Beispiele - aber einige andere gute Beispiele sind Dinge wie die automatische INotifyPropertyChanged-Implementierung ( hier ).
Einige, die auftreten und direkt auf den Compiler oder die Laufzeit auswirken :
[Conditional("FOO")]
- Aufrufe dieser Methode (einschließlich Argumentauswertung) erfolgen nur, wenn das Symbol "FOO" während der Erstellung definiert wird[MethodImpl(...)]
- wird verwendet, um ein paar Dinge wie Synchronisation, Inlining anzuzeigen[PrincipalPermission(...)]
- wird verwendet, um Sicherheitsüberprüfungen automatisch in den Code einzufügen[TypeForwardedTo(...)]
- Wird verwendet, um Typen zwischen Assemblys zu verschieben, ohne die Aufrufer neu zu erstellenFür Dinge, die manuell durch Reflexion überprüft werden - ich bin ein großer Fan der
System.ComponentModel
Attribute; Dinge wie[TypeDescriptionProvider(...)]
,[TypeConverter(...)]
und[Editor(...)]
die das Verhalten von Typen in Datenbindungsszenarien (dh dynamische Eigenschaften usw.) vollständig ändern können.quelle
Wenn ich einen Crawl zur Codeabdeckung durchführen würde, wären diese beiden meiner Meinung nach die besten:
quelle
Ich habe das in
[DataObjectMethod]
letzter Zeit benutzt. Es beschreibt die Methode, damit Sie Ihre Klasse mit der ObjectDataSource (oder anderen Steuerelementen) verwenden können.Mehr Info
quelle
In unserem aktuellen Projekt verwenden wir
Es steuert den Zugriff eines einzelnen verwalteten Typs oder Mitglieds oder aller Typen innerhalb einer Assembly auf COM.
Mehr Info
quelle
Weist den Designer an, die Eigenschaften zu erweitern, die Klassen (Ihres Steuerelements) sind.
Weist Verschleierungswerkzeuge an, die angegebenen Aktionen für eine Baugruppe, einen Typ oder ein Element auszuführen. (Obwohl Sie normalerweise eine Assembly-Ebene verwenden
[assembly:ObfuscateAssemblyAttribute(true)]
quelle
Die Attribute, die ich am häufigsten verwende, beziehen sich auf die XML-Serialisierung.
XmlRoot
XmlElement
XmlAttribute
usw...
Sehr nützlich, wenn Sie schnell und schmutzig XML analysieren oder serialisieren möchten.
quelle
Als mittelständischer Entwickler mag ich
System.ComponentModel.EditorBrowsableAttribute
Ermöglicht es mir, Eigenschaften auszublenden, damit der UI-Entwickler nicht mit Eigenschaften überfordert ist, die er nicht sehen muss.System.ComponentModel.BindableAttribute
Einige Dinge müssen nicht datengebunden sein. Dies verringert wiederum die Arbeit, die die Benutzeroberflächenentwickler leisten müssen.Ich mag auch das
DefaultValue
, was Lawrence Johnston erwähnt hat.System.ComponentModel.BrowsableAttribute
und dieFlags
werden regelmäßig verwendet.Ich benutze
System.STAThreadAttribute System.ThreadStaticAttribute
bei Bedarf.Apropos. Ich diese sind für alle .NET Framework-Entwickler genauso wertvoll.
quelle
[EditorBrowsable(EditorBrowsableState.Never)]
Mit dieser Option können Sie Eigenschaften und Methoden in IntelliSense ausblenden, wenn sich das Projekt nicht in Ihrer Lösung befindet. Sehr hilfreich, um ungültige Flows für fließende Schnittstellen zu verbergen. Wie oft möchten Sie GetHashCode () oder Equals ()?Mit MVC
[ActionName("Name")]
können Sie eine Get-Aktion und eine Post-Aktion mit derselben Methodensignatur ausführen oder Bindestriche im Aktionsnamen verwenden, die sonst nicht möglich wären, ohne eine Route dafür zu erstellen.quelle
Ich halte es für wichtig, hier zu erwähnen, dass die folgenden Attribute ebenfalls sehr wichtig sind:
Gibt an, dass das COM-Threading-Modell für eine Anwendung Single-Threaded-Apartment (STA) ist.
Dieses Attribut wird beispielsweise in Windows Forms-Anwendungen verwendet:
Und auch ...
Unterdrückt die Meldung einer bestimmten Regelverletzung durch ein statisches Analysetool und ermöglicht die mehrfache Unterdrückung eines einzelnen Code-Artefakts.
Zum Beispiel:
quelle
Hier ist eine kurze Liste der vordefinierten Attribute, die ich tatsächlich in einem großen Projekt verwende (~ 500.000 LoCs), grob sortiert nach Verwendungshäufigkeit:
Flags, Serializable, WebMethod, COMVisible, TypeConverter, Conditional, ThreadStatic, Obsolete, InternalsVisibleTo, DebuggerStepThrough.
quelle
Ich generiere eine Datenentitätsklasse über CodeSmith und verwende Attribute für eine Validierungsroutine. Hier ist ein Beispiel:
Und ich habe eine Utility-Klasse für die Validierung basierend auf den Attributen, die an die Datenentitätsklasse angehängt sind. Hier ist der Code:
quelle
[DeploymentItem("myFile1.txt")]
MSDN Doc on DeploymentItemDies ist sehr nützlich, wenn Sie anhand einer Datei testen oder die Datei als Eingabe für Ihren Test verwenden.
quelle
[System.Security.Permissions.PermissionSetAttribute]
Ermöglicht die Anwendung von Sicherheitsaktionen für ein PermissionSet auf Code mithilfe deklarativer Sicherheit.quelle