Atributy (C#)
Atributy poskytují výkonnou metodu přidružení metadat nebo deklarativních informací ke kódu (sestavení, typy, metody, vlastnosti atd.). Jakmile je atribut přidružený k entitě programu, lze atribut dotazovat za běhu pomocí techniky nazývané reflexe. Další informace najdete v tématu Reflexe (C#).
Atributy mají následující vlastnosti:
- Atributy přidávají metadata do programu. Metadata jsou informace o typech definovaných v programu. Všechna sestavení .NET obsahují zadanou sadu metadat popisující typy a členy typu definované v sestavení. Můžete přidat vlastní atributy a zadat další požadované informace. Další informace najdete v tématu Vytváření vlastních atributů (C#).
- Jeden nebo více atributů lze použít na celá sestavení, moduly nebo menší prvky programu, jako jsou třídy a vlastnosti.
- Atributy mohou přijímat argumenty stejným způsobem jako metody a vlastnosti.
- Program může pomocí reflexe zkoumat vlastní metadata nebo metadata v jiných programech. Další informace najdete v tématu Přístup k atributům pomocí reflexe (C#).
Použití atributů
Atributy lze umístit na téměř jakoukoli deklaraci, i když konkrétní atribut může omezit typy deklarací, na kterých je platný. V jazyce C# zadáte atribut umístěním názvu atributu v hranatých závorkách ([]) nad deklaraci entity, na kterou se vztahuje.
V tomto příkladu SerializableAttribute se atribut používá k použití konkrétní charakteristiky na třídu:
[Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}
Metoda s atributem DllImportAttribute je deklarována jako v následujícím příkladu:
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
V deklaraci lze umístit více než jeden atribut, jak ukazuje následující příklad:
using System.Runtime.InteropServices;
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
Některé atributy lze pro danou entitu zadat více než jednou. Příkladem takového atributu multiuse je ConditionalAttribute :
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}
Poznámka
Podle konvence končí všechny názvy atributů slovem "Atribut", aby se odlišili od ostatních položek v knihovnách .NET. Při použití atributů v kódu však není nutné zazadat příponu atributu. Například je ekvivalentní s , ale je skutečný název atributu [DllImport] [DllImportAttribute] v DllImportAttribute knihovně tříd .NET.
Parametry atributu
Mnoho atributů má parametry, které mohou být poziční, nepojmenované nebo pojmenované. Poziční parametry musí být zadány v určitém pořadí a nelze je vynechat. Pojmenované parametry jsou volitelné a lze je zadat v libovolném pořadí. Nejprve jsou zadány poziční parametry. Například tyto tři atributy jsou ekvivalentní:
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
První parametr, název knihovny DLL, je poziční a vždy je na prvním místě. Ostatní jsou pojmenovány. V tomto případě mají oba pojmenované parametry výchozí hodnotu false, takže je můžete vynechat. Poziční parametry odpovídají parametrům konstruktoru atributu. Pojmenované nebo volitelné parametry odpovídají buď vlastnostem, nebo polím atributu. Informace o výchozích hodnotách parametrů najdete v dokumentaci k jednotlivým atributům.
Další informace o povolených typech parametrů najdete v části Atributy specifikace jazyka C#.
Cíle atributů
Cílem atributu je entita, na kterou se atribut vztahuje. Například atribut může platit pro třídu, konkrétní metodu nebo celé sestavení. Ve výchozím nastavení se atribut vztahuje na element, který ho následuje. Můžete ale také explicitně identifikovat, například zda je atribut použit na metodu, nebo na její parametr nebo na její návratovou hodnotu.
Pokud chcete explicitně identifikovat cíl atributu, použijte následující syntaxi:
[target : attribute-list]
Seznam možných target hodnot je uveden v následující tabulce.
| Cílová hodnota | Platí pro |
|---|---|
assembly |
Celé sestavení |
module |
Aktuální modul sestavení |
field |
Pole ve třídě nebo struktury |
event |
Událost |
method |
Metoda nebo get a set přístupové objekty vlastností |
param |
Parametry metody nebo set parametry přístupového objektu vlastnosti |
property |
Vlastnost |
return |
Návratová hodnota metody, indexeru vlastností nebo get přístupového objektu vlastnosti |
type |
Struktura, třída, rozhraní, výčet nebo delegát |
Zadáte cílovou hodnotu pro použití atributu na field zálohovací pole vytvořené pro automaticky implementované vlastnosti.
Následující příklad ukazuje, jak použít atributy na sestavení a moduly. Další informace najdete v tématu Běžné atributy (C#).
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
Následující příklad ukazuje, jak použít atributy na metody, parametry metody a návratové hodnoty metody v jazyce C#.
// default: applies to method
[ValidatedContract]
int Method1() { return 0; }
// applies to method
[method: ValidatedContract]
int Method2() { return 0; }
// applies to parameter
int Method3([ValidatedContract] string contract) { return 0; }
// applies to return value
[return: ValidatedContract]
int Method4() { return 0; }
Poznámka
Bez ohledu na cíle, u kterých je definována platnost, je nutné zadat cíl, a to i v případě, že byly definovány tak, aby se vztahují pouze ValidatedContract return na vrácené ValidatedContract hodnoty. Jinými slovy, kompilátor nebude informace používat k řešení AttributeUsage nejednoznačných cílů atributů. Další informace najdete v tématu AttributeUsage (C#).
Běžná použití atributů
Následující seznam obsahuje několik běžných použití atributů v kódu:
- Metody označení používající atribut ve webových službách k označení, že metoda by měla
WebMethodbýt volatelná přes protokol SOAP. Další informace naleznete v tématu WebMethodAttribute. - Popis způsobu zařazování parametrů metody při spolupráci s nativním kódem. Další informace naleznete v tématu MarshalAsAttribute.
- Popis vlastností modelu COM pro třídy, metody a rozhraní.
- Volání nespravovaného kódu pomocí DllImportAttribute třídy .
- Popis sestavení z hlediska názvu, verze, popisu nebo ochranné známky.
- Popis, které členy třídy k serializaci pro trvalost.
- Popis mapování mezi členy třídy a uzly XML pro serializaci XML.
- Popis požadavků na zabezpečení pro metody
- Určení vlastností používaných k vynucení zabezpečení
- Řízení optimalizací kompilátorem JIT (Just-in-Time), aby se kód i nadále snadno ladí.
- Získávání informací o volajícím metodě.
Související oddíly
Další informace naleznete v tématu:
- Vytváření vlastních atributů (C#)
- Přístup k atributům pomocí reflexe (C#)
- Jak vytvořit sjednocené jazyce C/C++ pomocí atributů (C#)
- Běžné atributy (C#)
- Informace o volajícím (C#)