Wiem, że atrybuty są niezwykle przydatne. Istnieją pewne predefiniowane, takie jak takie, [Browsable(false)]
które pozwalają ukryć właściwości na karcie właściwości. Oto dobre pytanie wyjaśniające atrybuty: Co to są atrybuty w .NET?
Jakie są predefiniowane atrybuty (i ich przestrzeń nazw), których faktycznie używasz w swoich projektach?
c#
.net
.net-attributes
wusher
źródło
źródło
Odpowiedzi:
[DebuggerDisplay]
może być naprawdę pomocny, aby szybko zobaczyć niestandardowe wyjście typu, gdy najedziesz myszką na wystąpienie typu podczas debugowania. przykład:Tak powinno to wyglądać w debuggerze:
Warto również wspomnieć, że
[WebMethod]
atrybut zCacheDuration
zestawem właściwości może uniknąć niepotrzebnego wykonania metody usługi sieciowej.źródło
System.Obsolete
jest, moim zdaniem, jednym z najbardziej użytecznych atrybutów w ramach. Bardzo przydatna jest możliwość ostrzeżenia o kodzie, który nie powinien już być używany. Uwielbiam mieć sposób, aby powiedzieć programistom, że coś nie powinno być dłużej używane, a także mieć sposób, aby wyjaśnić, dlaczego i wskazać lepszy / nowy sposób robienia czegoś.Jest
Conditional attribute
to również bardzo przydatne do debugowania. Pozwala na dodawanie do kodu metod do celów debugowania, które nie zostaną skompilowane po zbudowaniu rozwiązania do wydania.Następnie istnieje wiele atrybutów specyficznych dla Kontrolek WWW, które uważam za przydatne, ale są one bardziej szczegółowe i nie mają żadnego zastosowania poza opracowaniem kontrolek serwera z tego, co znalazłem.
źródło
[Flags]
jest całkiem przydatny. Z pewnością cukier syntaktyczny, ale wciąż całkiem przyjemny.Leppie wskazuje na coś, czego nie zdawałem sobie sprawy, a to raczej tłumi mój entuzjazm dla tego atrybutu: nie instruuje kompilatora, aby zezwalał na kombinacje bitów jako prawidłowe wartości zmiennych wyliczeniowych, kompilator pozwala na to niezależnie od wyliczeń. Moje tło w C ++ pokazano przez ... westchnienie
źródło
[Flags]
ma większe zastosowanie niż tylko cukier syntaktyczny. Podczas korzystania z usług sieciowych serializacja / deserializacja nie będzie działać, jeśliSandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jam
zostanie przekazana podobna wartość . Bez[Flags]
atrybutu deserializator nie będzie wiedział, że wartość może być kombinacją flag. Nauczyłem się tego na własnej skórze po spędzeniu około dwóch dni na zastanawianiu się, dlaczego mój WCF nie działa.Lubię
[DebuggerStepThrough]
z System.Diagnostics .Jest to bardzo przydatne, aby uniknąć wchodzenia w te jednowierszowe metody lub właściwości „nic nie rób” (jeśli jesteś zmuszony do pracy we wczesnej wersji .Net bez właściwości automatycznych). Umieść atrybut na krótkiej metodzie lub narzędziu pobierającym lub ustawiającym właściwość, a będziesz latać tuż obok, nawet po wciśnięciu przycisku „wejdź” do debuggera.
źródło
Oto, co warto, oto lista wszystkich atrybutów .NET . Jest ich kilkaset.
Nie wiem o nikim innym, ale mam poważne RTFM do zrobienia!
źródło
Mój głos byłby za
Conditional
Możesz użyć tego, aby dodać funkcję z zaawansowanymi funkcjami debugowania; na przykład
Debug.Write
, jest wywoływany tylko w kompilacjach debugowania, a zatem pozwala na enkapsulację złożonej logiki debugowania poza głównym przepływem programu.źródło
Zawsze używać
DisplayName
,Description
aDefaultValue
przypisuje się właściwości publiczne moich własnych kontroli użytkowników, kontroli lub dowolnej klasy będę edytować poprzez siatkę nieruchomości. Znaczniki te są używane przez .NET PropertyGrid do formatowania nazwy, panelu opisu i pogrubionych wartości, które nie są ustawione na wartości domyślne.Chciałbym tylko, żeby IntelliSense z Visual Studio wziął ten
Description
atrybut pod uwagę, gdyby nie znaleziono komentarza XML. Pozwoliłoby to uniknąć powtarzania tego samego zdania dwa razy.źródło
Description
aż was .. Jego najbardziej pomocne dla mnie, gdy używana z teksty stałe ..[Serializable]
jest używany przez cały czas do serializacji i deserializacji obiektów do i z zewnętrznych źródeł danych, takich jak xml lub ze zdalnego serwera. Więcej o tym tutaj.źródło
W duchu Hofstadtian ten
[Attribute]
atrybut jest bardzo przydatny, ponieważ jest to sposób tworzenia własnych atrybutów. Użyłem atrybutów zamiast interfejsów do implementacji systemów wtyczek, dodawania opisów do Enums, symulacji wielu wysyłek i innych sztuczek.źródło
Oto post o interesującym atrybucie InternalsVisibleTo . Zasadniczo to, co robi, naśladuje funkcjonalność dostępu znajomych w C ++. Jest bardzo przydatny do testowania jednostkowego.
źródło
internal
nie jest publiczne. Jest publicznie testowany w zespole i powinien być testowany jednostkowo, aby inne klasy w zespole mogły przyjąć jego funkcję korekcji. Jeśli nie przetestujesz go jednostkowo, będziesz musiał przetestować jego funkcje we wszystkich klasach konsumujących.Stwierdziłem,
[DefaultValue]
że jest całkiem przydatny.źródło
Sugerowałbym
[TestFixture]
i[Test]
- z biblioteki nUnit .Testy jednostkowe w kodzie zapewniają bezpieczeństwo w refaktoryzacji i skodyfikowanej dokumentacji.
źródło
ponieważ pozwala to zignorować (w dowolnej serializacji xml) obiekty „nadrzędne”, które w przeciwnym razie spowodowałyby wyjątki podczas zapisywania.
źródło
Nie jest dobrze nazwany, nie jest dobrze obsługiwany w środowisku i nie powinien wymagać parametru, ale ten atrybut jest przydatnym markerem dla niezmiennych klas:
źródło
ImmutableObjectAttribute
klasę - przynajmniej możesz wyeliminować parametr.Lubię używać tego
[ThreadStatic]
atrybutu w połączeniu z programowaniem opartym na wątkach i stosach. Na przykład, jeśli chcę wartość, którą chcę podzielić z resztą sekwencji wywołania, ale chcę to zrobić poza pasmem (tj. Poza parametrami wywołania), mogę zastosować coś takiego.Później w moim kodzie mogę tego użyć, aby przekazać informacje kontekstowe poza pasmem osobom znajdującym się poniżej mojego kodu. Przykład:
Atrybut ThreadStatic pozwala mi zawęzić wywołanie tylko do danego wątku, unikając bałaganu związanego z dostępem do danych w wątkach.
źródło
MyContextInformation.Current
aby uzyskać aktywny kontekst na stosie. To jest bardzo dobra koncepcja w niektórych przypadkach, nasz silnik (mojej firmy) używa go do wielu celów.DebuggerHiddenAttribute co pozwala na uniknięcie krok do kodu, który nie powinien być debugowane.
Zapobiega także wyświetlaniu metod w stosie śledzenia, co jest przydatne, gdy metoda zawiera tylko inną metodę:
Jeśli teraz wywołujesz,
GetElementAt(new Vector2(10, 10))
a błąd jest zawijany w metodzie opakowanej, stos wywołań nie pokazuje metody, która wywołuje metodę zgłaszającą błąd.źródło
DesignerSerializationVisibilityAttribute
jest bardzo przydatne. Gdy umieścisz właściwość środowiska wykonawczego w formancie lub komponencie i nie chcesz, aby projektant serializował ją, używasz jej w następujący sposób:źródło
[Browsable(false)]
jest wymagana, aby ukryć ją przed użytkownikiem projektanta, gdzie[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
jest wymagana, aby nie została serializowana.Tylko kilka atrybutów jest wspieranych przez kompilator, ale jedno bardzo interesujące użycie atrybutów znajduje się w AOP: PostSharp używa twoich niestandardowych atrybutów do wstrzykiwania IL do metod, pozwalając na wszystkie możliwości ... log / trace są trywialnymi przykładami - ale kilka innych dobrych przykładów są rzeczy takie jak automatyczna implementacja INotifyPropertyChanged ( tutaj ).
Niektóre z nich mają bezpośredni wpływ na kompilator lub środowisko wykonawcze :
[Conditional("FOO")]
- wywołania tej metody (w tym oceny argumentów) występują tylko wtedy, gdy podczas kompilacji zdefiniowano symbol „FOO”[MethodImpl(...)]
- używany do wskazania kilku rzeczy, takich jak synchronizacja, wstawianie[PrincipalPermission(...)]
- używane do automatycznego wprowadzania kontroli bezpieczeństwa do kodu[TypeForwardedTo(...)]
- służy do przenoszenia typów między złożeniami bez odbudowywania wywołującychW przypadku rzeczy, które są sprawdzane ręcznie przez odbicie - jestem wielkim fanem
System.ComponentModel
atrybutów; rzeczy takie jak[TypeDescriptionProvider(...)]
,[TypeConverter(...)]
i[Editor(...)]
które mogą całkowicie zmienić zachowanie typów w scenariuszach wiązania danych (tj. właściwości dynamiczne itp.).źródło
Gdybym miał wykonać indeksowanie pokrycia kodu, myślę, że te dwa byłyby najlepsze:
źródło
I zostały z wykorzystaniem
[DataObjectMethod]
ostatnio. Opisuje metodę, dzięki której możesz używać swojej klasy z ObjectDataSource (lub innymi kontrolkami).Więcej informacji
źródło
W naszym obecnym projekcie korzystamy
Kontroluje dostępność pojedynczego zarządzanego typu lub elementu lub wszystkich typów w zespole do modelu COM.
Więcej informacji
źródło
Mówi projektantowi, aby rozwinął właściwości, które są klasami (twojej kontroli)
Nakazuje narzędziom zaciemniającym wykonanie określonych działań dla złożenia, typu lub elementu. (Chociaż zwykle używasz poziomu asemblera
[assembly:ObfuscateAssemblyAttribute(true)]
źródło
Atrybuty, których najczęściej używam, to te związane z serializacją XML.
XmlRoot
XmlElement
XmlAttribute
itp...
Niezwykle przydatny podczas szybkiego i brudnego analizowania lub serializacji XML.
źródło
Jako programista średniego poziomu lubię
System.ComponentModel.EditorBrowsableAttribute
Pozwala mi ukrywać właściwości, aby programista interfejsu użytkownika nie był przytłoczony właściwościami, których nie muszą widzieć.System.ComponentModel.BindableAttribute
Niektóre rzeczy nie muszą być danymi. Ponownie zmniejsza pracę, którą muszą wykonać programiści interfejsu użytkownika.Podoba mi się także wspomniany
DefaultValue
przez Lawrence'a Johnstona.System.ComponentModel.BrowsableAttribute
iFlags
są używane regularnie.Używam w
System.STAThreadAttribute System.ThreadStaticAttribute
razie potrzeby.Tak poza tym. I są one tak samo cenne dla wszystkich programistów .NET Framework.
źródło
[EditorBrowsable(EditorBrowsableState.Never)]
pozwala ukryć właściwości i metody przed IntelliSense, jeśli projekt nie jest w twoim rozwiązaniu. Bardzo pomocne w ukrywaniu nieprawidłowych przepływów dla płynnych interfejsów. Jak często chcesz GetHashCode () lub Equals ()?Dla MVC
[ActionName("Name")]
pozwala mieć akcję Get i Post z tą samą sygnaturą metody lub użycie myślników w nazwie akcji, co w innym przypadku nie byłoby możliwe bez utworzenia dla niej trasy.źródło
Uważam, że należy tutaj wspomnieć, że następujące atrybuty są również bardzo ważne:
Wskazuje, że model wątkowania COM dla aplikacji to jedno-wątkowy apartament (STA).
Na przykład ten atrybut jest używany w aplikacjach Windows Forms:
I również ...
Pomija zgłaszanie naruszenia określonych reguł narzędzia analizy statycznej, umożliwiając wielokrotne pomijanie pojedynczego artefaktu kodu.
Na przykład:
źródło
Z góry mojej głowy znajduje się krótka lista, z grubsza posortowana według częstotliwości użycia, predefiniowanych atrybutów, których faktycznie używam w dużym projekcie (~ 500 tys. LoC):
Flagi, Serializable, WebMethod, COMVisible, TypeConverter, Conditional, ThreadStatic, Przestarzałe, InternalsVisibleTo, DebuggerStepThrough.
źródło
Generuję klasę danych za pomocą CodeSmith i używam atrybutów do niektórych procedur sprawdzania poprawności. Oto przykład:
Mam klasę narzędziową do sprawdzania poprawności na podstawie atrybutów dołączonych do klasy encji danych. Oto kod:
źródło
[DeploymentItem("myFile1.txt")]
Dokument MSDN na DeploymentItemJest to bardzo przydatne, jeśli testujesz plik lub używasz go jako danych wejściowych do testu.
źródło
[System.Security.Permissions.PermissionSetAttribute]
zezwala na stosowanie działań zabezpieczających dla pakietu PermissionSet do kodu przy użyciu deklaratywnych zabezpieczeń.źródło