Atrybuty C# i ich zastosowania

Naprawdę Nie wiem zbyt wiele o atrybutach w ogóle w C#, widziałem je w użyciu na wiele różnych sposobów/miejsc, ale chyba nie widzę znaczenia niektórych z nich. Niektóre z nich mają zdecydowanie znaczenie, ponieważ zapewniają zauważalną funkcję, taką jak [Serializable]. Jednak inne nie wydają się tak ważne, jak na przykład jeden, którego mój współpracownik używa do oznaczania właściwości za pomocą [DataMember].

Przypuszczam, że moje pytanie brzmi, co to są atrybuty i jak są one przydatne? Czy istnieje sposób na stworzenie własnego atrybuty i jak mogę stwierdzić, czy pola / metody/klasy / cokolwiek mają określone atrybuty lub jakie wartości są ustawione w tych atrybutach?

Author: Corey Ogburn, 2010-07-07

4 answers

Czym są atrybuty?

Atrybuty umożliwiają osadzenie informacji o typie lub metodzie w metadanych opisujących ten typ lub metodę.

Zazwyczaj chcesz używać atrybutów do opisywania faktów dotyczących mechanizmutypu lub metody, a nie znaczenia typu lub metody. na przykład, załóżmy, że masz pracownika typu. Faktem o znaczeniu pracownika jest to, że jest to rodzaj osoby, że Pracownik ma menedżera i tak dalej. Faktem jest, że mechanizm pracownika może być celem powiązania danych, albo może być serializowany na dysk, czy cokolwiek innego. Pracownik nie może być serializowany na dysk, ale Klasa pracownik może być. Atrybuty pozwalają oddzielić informacje o szczegółach technicznych od modelu semantycznego.

Czy istnieje sposób na tworzenie własnych atrybutów?

Tak. Utwórz klasę, która rozszerza atrybut. By convention you nazwijmy to "FooAttribute". Jeśli to zrobisz, możesz użyć składni [Foo] lub [FooAttribute] według własnego uznania.

Jak mogę stwierdzić, czy pola / metody/klasy / cokolwiek mają określone atrybuty lub jakie wartości są ustawione w tych atrybutach?

Użyj metody GetCustomAttributes na obiektach odbiciowych.

Gdzie powinienem przeczytać więcej informacji?

Zacznij od atrybutów tutorial:

Http://msdn.microsoft.com/en-us/library/aa288454 (VS. 71). aspx

A następnie Przeczytaj cały rozdział 17 specyfikacji C#.

 21
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-07 19:54:50

Atrybuty są sposobem, za pomocą którego można powiązać metadane z typami w .NET. pozwala to sprawdzić typ i uzyskać informacje o nim, które są oddzielone od informacji typu "runtime".

To może być bardzo przydatne. Wspomniałeś o [Serializable], ale inne proste przykłady obejmują wiele typów System.ComponentModel, takich jak Description , który jest używany przez siatkę właściwości do "opisywania" właściwości podczas pracy z nimi w Projektancie. Od "opisu" właściwość nie jest tak naprawdę związana z zachowaniem typu w programie (w czasie wykonywania), nie należy do klasy. Jest to jednak bardzo przydatne, gdy przechodzisz do edycji kontrolki w Projektancie wizualnym, na przykład, aby zobaczyć opis (lub kategorię itp.) właściwości. Atrybuty są środkami, za pomocą których jest to obsługiwane.
 7
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-07 17:29:06

Myślę, że odpowiedź na poniższe pytanie dostarczy Ci pewnego wglądu w twoje pytania.

Jak działają klasy atrybutów?

Oto repost mojej odpowiedzi.

Atrybuty to zasadniczo metadane, które można dołączyć do różnych fragmentów kodu. Te metadane mogą się wtedy wzajemnie przenikać i wpływać na zachowanie niektórych opresji.

Atrybuty mogą być stosowane do prawie każdego aspektu kodu. Na przykład atrybuty mogą być powiązane na poziomie złożenia, podobnie jak atrybuty AssemblyVersion i AssemblyFileVersion, które regulują numery wersji związane z złożeniem.

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Następnie atrybut Serializowalny może być zastosowany do deklaracji typu, aby oznaczyć Typ jako wspierający serializację. W rzeczywistości ten atrybut ma specjalne znaczenie w CLR i jest faktycznie przechowywany jako specjalna dyrektywa bezpośrednio na typie w IL, jest to zoptymalizowane do przechowywania jako znacznik bitowy, który może być przetwarzane znacznie wydajniej, istnieje kilka atrybutów o tej naturze, które są znane jako pseudo niestandardowe atrybuty.

Jeszcze inne atrybuty mogą być stosowane do metod, właściwości, pól, enum, zwracanych wartości itp. Możesz uzyskać wyobrażenie o możliwych celach, do których można zastosować atrybut, patrząc na ten link http://msdn.microsoft.com/en-us/library/system.attributetargets (VS. 90). aspx

Dalej można zdefiniować własne atrybuty, które mogą następnie zastosuj do odpowiednich celów, dla których przeznaczone są twoje atrybuty. Następnie w czasie wykonywania kod może odzwierciedlać wartości zawarte w niestandardowych atrybutach i podejmować odpowiednie działania.

Na dość naiwny przykład, a to tylko dla przykładu :) Możesz chcieć napisać silnik trwałości, który automatycznie mapuje klasy do tabel w bazie danych i mapuje właściwości klasy do kolumn tabeli. Można zacząć od zdefiniowania dwóch niestandardowych atrybuty

TableMappingAttribute
ColumnMappingAttribute

Które możesz następnie zastosować do swoich klas, jako przykład mamy klasę Person

[TableMapping("People")]
public class Person
{
  [ColumnMapping("fname")]
  public string FirstName {get; set;}

  [ColumnMapping("lname")]
  public string LastName {get; set;}
}

Podczas kompilacji, poza faktem, że kompilator emituje dodatkowe metadane zdefiniowane przez atrybuty niestandardowe, wpływ na to ma niewiele więcej. Można jednak teraz napisać Menedżer PersistanceManager, który może dynamicznie sprawdzać atrybuty instancji klasy Person i wstawiać dane do tabeli People, mapując dane we właściwości FirstName na kolumna fname i właściwość LastName do kolumny lname.

Jeśli chodzi o twoje pytanie dotyczące instancji atrybutów, instancja atrybutu nie jest tworzona dla każdej instancji twojej klasy. Wszystkie instancje osób będą współdzielić tę samą instancję TableMappingAttribute i ColumnMappingAttributes. W rzeczywistości instancje atrybutów są tworzone tylko wtedy, gdy faktycznie zapytasz o atrybuty za pierwszym razem.

 6
Author: Chris Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:12

C# zapewnia mechanizm definiowania znaczników deklaratywnych, zwanych atrybutami, które można umieścić na pewnych encjach w kodzie źródłowym, aby określić dodatkowe informacje. Informacje zawarte w atrybutach mogą być pobierane w czasie wykonywania przez odbicie. Możesz użyć predefiniowanych atrybutów lub zdefiniować własne atrybuty niestandardowe.

Http://msdn.microsoft.com/en-us/library/aa288059%28v=VS.71%29.aspx

 0
Author: TrustyCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-07 17:30:42