Saya tahu bahwa atribut sangat berguna. Ada beberapa yang sudah ditentukan sebelumnya [Browsable(false)]
yang memungkinkan Anda untuk menyembunyikan properti di tab properti. Berikut adalah pertanyaan yang menjelaskan atribut: Apa itu atribut di .NET?
Apa atribut yang telah ditentukan (dan namespace mereka) yang Anda gunakan dalam proyek Anda?
c#
.net
.net-attributes
bijaksana
sumber
sumber
Jawaban:
[DebuggerDisplay]
dapat sangat membantu untuk dengan cepat melihat output kustom dari Tipe ketika Anda mengarahkan mouse pada instance Type selama debugging. contoh:Beginilah seharusnya terlihat di debugger:
Juga, perlu disebutkan bahwa
[WebMethod]
atribut denganCacheDuration
set properti dapat menghindari eksekusi yang tidak perlu dari metode layanan web.sumber
System.Obsolete
adalah salah satu atribut paling berguna dalam kerangka kerja, menurut saya. Kemampuan untuk meningkatkan peringatan tentang kode yang seharusnya tidak lagi digunakan sangat berguna. Saya suka memiliki cara untuk memberi tahu pengembang bahwa sesuatu tidak boleh lagi digunakan, serta memiliki cara untuk menjelaskan mengapa dan menunjukkan cara yang lebih baik / baru dalam melakukan sesuatu.Ini
Conditional attribute
juga cukup berguna untuk penggunaan debug. Ini memungkinkan Anda untuk menambahkan metode dalam kode Anda untuk tujuan debug yang tidak akan dikompilasi ketika Anda membangun solusi Anda untuk rilis.Lalu ada banyak atribut khusus untuk Kontrol Web yang menurut saya berguna, tetapi lebih spesifik dan tidak memiliki kegunaan di luar pengembangan kontrol server dari apa yang saya temukan.
sumber
[Flags]
cukup berguna. Gula sintaksis sudah pasti, tetapi masih agak bagus.Leppie menunjukkan sesuatu yang tidak saya sadari, dan yang agak mengurangi antusiasme saya untuk atribut ini: ia tidak memerintahkan kompiler untuk mengizinkan kombinasi bit sebagai nilai valid untuk variabel enumerasi, kompiler memungkinkan ini untuk enumerasi terlepas. Latar belakang C ++ saya menunjukkan melalui ... menghela napas
sumber
[Flags]
memang memiliki penggunaan yang lebih besar daripada sekadar gula sintaksis. Saat menggunakan layanan web, serialisasi / de-serialisasi tidak akan berfungsi jika nilai sukaSandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jam
dilewatkan. Tanpa[Flags]
atribut deserializer tidak akan tahu bahwa nilainya dapat berupa kombinasi flag. Belajar ini dengan cara yang sulit setelah menghabiskan sekitar dua hari untuk memikirkan mengapa WCF saya tidak berfungsi.Saya suka
[DebuggerStepThrough]
dari System.Diagnostics .Ini sangat berguna untuk menghindari melangkah ke metode atau properti do-nothing satu baris (jika Anda dipaksa untuk bekerja di .Net awal tanpa properti otomatis). Letakkan atribut pada metode pendek atau pengambil atau penyetel properti, dan Anda akan terbang tepat saat menekan "step into" di debugger.
sumber
Untuk apa nilainya, berikut adalah daftar semua atribut .NET . Ada beberapa ratus.
Saya tidak tahu tentang orang lain tetapi saya memiliki beberapa RTFM yang serius untuk dilakukan!
sumber
Pilihan saya adalah untuk
Conditional
Anda dapat menggunakan ini untuk menambahkan fungsi dengan fitur debugging canggih; seperti
Debug.Write
, ini hanya disebut dalam debug build, dan dengan demikian memungkinkan Anda untuk merangkum logika debug kompleks di luar aliran utama program Anda.sumber
Saya selalu menggunakan
DisplayName
,Description
danDefaultValue
atribut atas properti publik dari kontrol pengguna saya, kontrol khusus atau kelas apa pun yang saya akan edit melalui kisi properti. Tag ini digunakan oleh .NET PropertyGrid untuk memformat nama, panel deskripsi, dan nilai tebal yang tidak disetel ke nilai default.Saya hanya berharap Visual Studio's IntelliSense akan mempertimbangkan
Description
atribut jika tidak ada komentar XML ditemukan. Itu akan menghindari harus mengulangi kalimat yang sama dua kali.sumber
Description
sampai Anda .. Ini yang paling membantu bagi saya ketika digunakan dengan enum ..[Serializable]
digunakan sepanjang waktu untuk serialisasi dan deserializing objek ke dan dari sumber data eksternal seperti xml atau dari server jauh. Lebih lanjut di sini.sumber
Dalam semangat Hofstadtian,
[Attribute]
atributnya sangat berguna, karena itulah cara Anda membuat atribut Anda sendiri. Saya telah menggunakan atribut alih-alih antarmuka untuk mengimplementasikan sistem plugin, menambahkan deskripsi ke Enums, mensimulasikan banyak pengiriman dan trik lainnya.sumber
Berikut adalah postingan tentang atribut menarik InternalsVisibleTo . Pada dasarnya apa yang dilakukannya meniru fungsi akses teman-teman C ++. Ini sangat berguna untuk pengujian unit.
sumber
internal
tidak publik. Ini publik dalam majelis yang sedang diuji dan harus diuji unit sehingga kelas-kelas lain dalam majelis dapat menganggap fungsi koreksi itu. Jika Anda tidak mengujinya, Anda harus menguji fungsinya di semua kelas konsumsi.Saya menemukan
[DefaultValue]
cukup berguna.sumber
Saya akan menyarankan
[TestFixture]
dan[Test]
- dari perpustakaan nUnit .Tes unit dalam kode Anda memberikan keamanan dalam refactoring dan dokumentasi terkodifikasi.
sumber
karena ini memungkinkan Anda untuk mengabaikan (dalam serialisasi xml apa saja) objek 'induk' yang jika tidak akan menyebabkan pengecualian saat menyimpan.
sumber
Itu tidak bernama, tidak didukung dalam kerangka kerja, dan seharusnya tidak memerlukan parameter, tetapi atribut ini adalah penanda yang berguna untuk kelas yang tidak dapat diubah:
sumber
ImmutableObjectAttribute
kelas Anda sendiri - setidaknya Anda bisa menghilangkan parameter.Saya suka menggunakan
[ThreadStatic]
atribut dalam kombinasi dengan pemrograman berbasis thread dan stack. Misalnya, jika saya ingin nilai yang ingin saya bagikan dengan sisa urutan panggilan, tetapi saya ingin melakukannya di luar jalur (yaitu di luar parameter panggilan), saya mungkin menggunakan sesuatu seperti ini.Kemudian dalam kode saya, saya dapat menggunakan ini untuk memberikan informasi kontekstual dari band kepada orang-orang di hilir dari kode saya. Contoh:
Atribut ThreadStatic memungkinkan saya untuk membatasi panggilan hanya ke utas yang dimaksud menghindari masalah berantakan dari akses data di utas.
sumber
MyContextInformation.Current
untuk mendapatkan konteks aktif di stack. Ini adalah sesuatu yang merupakan konsep yang sangat baik dalam kasus-kasus tertentu, mesin kami (perusahaan saya) menggunakannya untuk banyak tujuan.The DebuggerHiddenAttribute yang memungkinkan untuk menghindari langkah ke dalam kode yang tidak harus debugged.
Itu juga mencegah menampilkan metode dalam jejak stack, berguna ketika memiliki metode yang hanya membungkus metode lain:
Jika sekarang Anda memanggil
GetElementAt(new Vector2(10, 10))
dan terjadi kesalahan pada metode terbungkus, tumpukan panggilan tidak menunjukkan metode yang memanggil metode yang melempar kesalahan.sumber
DesignerSerializationVisibilityAttribute
sangat bermanfaat. Saat Anda meletakkan properti runtime pada kontrol atau komponen, dan Anda tidak ingin perancang untuk membuat serial, Anda menggunakannya seperti ini:sumber
[Browsable(false)]
diperlukan untuk menyembunyikannya dari pengguna perancang, di mana[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
diperlukan agar tidak diserialisasi.Hanya beberapa atribut yang mendapatkan dukungan kompiler, tetapi satu penggunaan atribut yang sangat menarik adalah di AOP: PostSharp menggunakan atribut yang dipesan lebih dahulu untuk menyuntikkan IL ke dalam metode, memungkinkan segala macam kemampuan ... mencatat / melacak menjadi contoh sepele - tetapi beberapa contoh bagus lainnya adalah hal-hal seperti implementasi INotifyPropertyChanged otomatis (di sini ).
Beberapa yang terjadi dan berdampak langsung ke kompiler atau runtime :
[Conditional("FOO")]
- panggilan ke metode ini (termasuk evaluasi argumen) hanya terjadi jika simbol "FOO" didefinisikan selama pembuatan[MethodImpl(...)]
- Digunakan untuk menunjukkan beberapa hal seperti sinkronisasi, inlining[PrincipalPermission(...)]
- Digunakan untuk menyuntikkan pemeriksaan keamanan ke dalam kode secara otomatis[TypeForwardedTo(...)]
- Digunakan untuk memindahkan tipe antar majelis tanpa membangun kembali peneleponUntuk hal-hal yang diperiksa secara manual melalui refleksi - Saya penggemar
System.ComponentModel
atribut; hal-hal seperti[TypeDescriptionProvider(...)]
,,[TypeConverter(...)]
dan[Editor(...)]
yang sepenuhnya dapat mengubah perilaku tipe dalam skenario pengikatan data (yaitu properti dinamis, dll).sumber
Jika saya akan melakukan merangkak cakupan kode, saya pikir keduanya akan menjadi teratas:
sumber
Saya telah menggunakan
[DataObjectMethod]
akhir - akhir ini. Ini menjelaskan metode sehingga Anda dapat menggunakan kelas Anda dengan ObjectDataSource (atau kontrol lainnya).Info lebih lanjut
sumber
Dalam proyek kami saat ini, kami menggunakan
Ini mengontrol aksesibilitas tipe atau anggota yang dikelola perorangan, atau semua tipe dalam suatu majelis, ke COM.
Info lebih lanjut
sumber
Memberitahu desainer untuk memperluas properti yang merupakan kelas (dari kendali Anda)
Menginstruksikan alat kebingungan untuk mengambil tindakan yang ditentukan untuk pertemuan, jenis, atau anggota. (Meskipun biasanya Anda menggunakan level Majelis
[assembly:ObfuscateAssemblyAttribute(true)]
sumber
Atribut yang paling saya gunakan adalah yang terkait dengan Serialisasi XML.
XmlRoot
XmlElement
XmlAttribute
dll ...
Sangat berguna saat melakukan parsing atau serialisasi XML yang cepat dan kotor.
sumber
Menjadi pengembang tingkat menengah yang saya sukai
System.ComponentModel.EditorBrowsableAttribute
Mengizinkan saya menyembunyikan properti sehingga pengembang UI tidak kewalahan dengan properti yang tidak perlu mereka lihat.System.ComponentModel.BindableAttribute
Beberapa hal tidak perlu menjadi basis data. Sekali lagi, kurangi pekerjaan yang harus dilakukan pengembang UI.Saya juga suka
DefaultValue
yang disebutkan oleh Lawrence Johnston.System.ComponentModel.BrowsableAttribute
danFlags
digunakan secara teratur.saya menggunakan
System.STAThreadAttribute System.ThreadStaticAttribute
saat dibutuhkan.Ngomong-ngomong. Saya ini sama berharganya untuk semua pengembang .Net framework.
sumber
[EditorBrowsable(EditorBrowsableState.Never)]
memungkinkan Anda untuk menyembunyikan properti dan metode dari IntelliSense jika proyek tidak ada dalam solusi Anda. Sangat membantu untuk menyembunyikan aliran yang tidak valid untuk antarmuka yang lancar. Seberapa sering Anda ingin GetHashCode () atau Equals ()?Untuk MVC
[ActionName("Name")]
memungkinkan Anda untuk memiliki tindakan Dapatkan dan Posting tindakan dengan metode tanda tangan yang sama, atau menggunakan tanda hubung dalam nama tindakan, yang jika tidak tidak mungkin tanpa membuat rute untuk itu.sumber
Saya menganggap penting untuk disebutkan di sini bahwa atribut berikut ini juga sangat penting:
Mengindikasikan bahwa model threading COM untuk suatu aplikasi adalah apartemen single-threaded apartment (STA).
Misalnya atribut ini digunakan dalam Aplikasi Formulir Windows:
Dan juga ...
Menekan pelaporan pelanggaran aturan alat analisis statis tertentu, yang memungkinkan beberapa penindasan pada artefak kode tunggal.
Sebagai contoh:
sumber
Dari atas kepala saya, di sini adalah daftar cepat, kira-kira diurutkan berdasarkan frekuensi penggunaan, atribut yang telah ditentukan yang sebenarnya saya gunakan dalam proyek besar (~ 500k LoCs):
Bendera, Serializable, WebMethod, COMVisible, TypeConverter, Conditional, ThreadStatic, Usang, InternalVisibleTo, DebuggerStepThrough.
sumber
Saya menghasilkan kelas entitas data melalui CodeSmith dan saya menggunakan atribut untuk beberapa rutin validasi. Berikut ini sebuah contoh:
Dan saya mendapat kelas utilitas untuk melakukan validasi berdasarkan atribut yang melekat pada kelas entitas data. Ini kodenya:
sumber
[DeploymentItem("myFile1.txt")]
MSDN Doc on DeploymentItemIni sangat berguna jika Anda menguji file atau menggunakan file sebagai input untuk pengujian Anda.
sumber
[System.Security.Permissions.PermissionSetAttribute]
memungkinkan tindakan keamanan untuk PermissionSet diterapkan ke kode menggunakan keamanan deklaratif.sumber