C# Attribute: Metadaten für Compiler & Runtime
Was sind Attribute?
Attribute sind deklarative Tags ([AttributeName]), die Metadaten an Code-Elemente (Klassen, Methoden, Properties, Assemblys, …) anhängen. Sie werden zur Kompilierzeit in die Assembly-Metadaten geschrieben und können zur Laufzeit via Reflection ausgewertet werden.
Syntax
[AttributeName(PositionalParam, NamedParam = Value)]
public class MyClass { ... }
- Positionale Parameter – Entsprechen Konstruktor-Parametern (Pflicht).
- Benannte Parameter – Setzen öffentliche Properties/Fields (Optional).
Vordefinierte Attribute
1. [Obsolete] – Veraltet markieren
[Obsolete("Use NewMethod instead", true)] // true = Compiler-Error
public void OldMethod() { }
public void NewMethod() { }
Bei Aufruf von OldMethod(): Compiler-Fehler mit Nachricht.
2. [Conditional("SYMBOL")] – Bedingte Kompilierung von Methodenaufrufen
Methode wird nur aufgerufen, wenn Symbol definiert ist (sonst Aufruf + Argumente komplett entfernt).
[Conditional("DEBUG")]
public static void Log(string msg) => Console.WriteLine($"[LOG] {msg}");
// In Release-Build (ohne DEBUG) wird Log("test") komplett eliminiert.
3. [AttributeUsage] – Steuert, wo Custom-Attribute angewendet werden dürfen
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public class MyAttribute : Attribute { }
Eigene (Custom) Attribute erstellen
- Klasse von
System.Attributeableiten. [AttributeUsage]anwenden.- Konstruktor für positionale Parameter.
- Properties für benannte Parameter.
Beispiel: DebugInfo Attribute
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
public class DebugInfo : Attribute
{
public int BugNumber { get; }
public string Developer { get; }
public string LastReview { get; }
public string Message { get; set; } // benannter Parameter
public DebugInfo(int bugNo, string dev, string review)
{
BugNumber = bugNo; Developer = dev; LastReview = review;
}
}
Attribute anwenden
[DebugInfo(45, "Zara Ali", "12/8/2023", Message = "Return type mismatch")]
[DebugInfo(49, "Nuha Ali", "10/10/2023", Message = "Unused variable")]
public class Rectangle
{
public double Length { get; set; }
public double Width { get; set; }
[DebugInfo(55, "Zara Ali", "19/10/2023", Message = "Return type mismatch")]
public double Area => Length * Width;
}
Attribute zur Laufzeit auslesen (Reflection)
Siehe nächstes Kapitel Reflection. Kurz:
var attrs = typeof(Rectangle).GetCustomAttributes(inherit: false);
foreach (var a in attrs) Console.WriteLine($"Bug {a.BugNumber}: {a.Message}");
C Sprache
- Java 8 Optional meistern: Praktischer Leitfaden für null-sicheren Code
- C# Nullable Types: Sicherer Umgang mit Null-Werten
- Ferro-Titanit® Cromoni – Hochfeste, nichtmagnetische Titanlegierung
- AgCu20 Legierung: Umfassende mechanische & thermische Eigenschaften bei 23 °C
- Legierung 15CDV6 (DIN 1.7734) – Hohe Festigkeit, Zähigkeit und leichte Schweißbarkeit
- DIN 1.7734 15CDV6 Legierung – Hohe Festigkeit, Zähigkeit und ausgezeichnete Schweißbarkeit
- 15CDV6 Legierung (DIN 1.7734) – Höchste Festigkeit, einfache Schweißbarkeit, überlegene Zähigkeit
- PtNi10 Legierung: Umfassende mechanische & thermische Eigenschaften
- PtIr10 Platin-Iridium-Legierung: Hochfestes Hochtemperatur-Material
- Corroplast Platte – Hochleistungs-Korrosionsbeständiger Stahl für Präzisionsbearbeitung