Kebutuhan akan tipe metadata. Perbedaan antara data dan metadata. Anotasi Data untuk Pemetaan Properti

Metode ini.

Kompiler bahasa .NET membuat metadata dan menyimpannya dalam rakitan yang berisi CIL. Ketika runtime bahasa umum mengeksekusi CIL, ia memeriksa apakah metadata dari metode yang dipanggil cocok dengan metadata yang disimpan dalam metode pemanggil. Hal ini memastikan bahwa metode dapat dipanggil dengan jumlah parameter dan tipe parameter yang benar.

Atribut

Pengembang dapat menambahkan metadata ke kode mereka berkat atribut. Ada dua jenis (dua bentuk) atribut: atribut yang didefinisikan dalam runtime bahasa umum (CLR). atribut khusus semu), dan atribut khusus (eng. atribut khusus), dibuat oleh pengguna untuk ditambahkan ke kode informasi tambahan. Dari sudut pandang pengembang, kedua tipe tersebut memiliki sintaksis yang sama. Atribut dalam kode pada dasarnya adalah pesan kepada kompiler untuk membuat metadata. Di CIL, metadata (seperti pengubah warisan, pengubah cakupan) dan hampir semua hal yang bukan opcode atau aliran juga ditandai sebagai atribut.

Atribut khusus adalah kelas reguler yang mewarisi kelas Atribut. Atribut tersebut dapat digunakan pada metode, properti, kelas, atau seluruh perakitan apa pun menggunakan sintaks berikut: [ Nama Atribut(opsional parameter, pasangan tambahan nama=nilai)]. Misalnya:

Atribut khusus digunakan cukup luas di platform. Kerangka BERSIH. Kerangka Komunikasi Windows menggunakan atribut untuk menentukan kontrak layanan, ASP.NET menggunakannya untuk mengekspos metode sebagai layanan web, LINQ ke SQL menggunakannya untuk mengikat kelas ke skema relasional yang mendasarinya, Visual Studio menggunakannya untuk mengelompokkan properti objek, pengembang kelas menentukan kategori untuk kelas objek menggunakan atribut khusus. Atribut khusus diproses oleh kode aplikasi, bukan CLR. Ketika kompiler menemukan atribut khusus, ia menciptakan metadata khusus yang tidak dikenali oleh CLR. Pengembang harus menerapkan kode untuk membaca dan memproses metadata. Sebagai contoh, atribut yang ditunjukkan pada contoh di atas dapat diproses dengan kode berikut:

kelas CustomAttribute: Atribut ( private int paramNumber = 0; private string comment = ""; public CustomAttribute() ( ) public CustomAttribute(int number) ( paramNumber = num; ) public String Comment ( set ( comment = value; ) ) )

Nama kelas dikaitkan dengan nama atribut. Kompiler Visual C# IDE secara otomatis menambahkan string "Atribut" di akhir setiap nama atribut. Sebagai konsekuensinya, setiap nama atribut kelas harus diakhiri dengan baris seperti itu, namun mendefinisikan atribut tanpa akhiran Attribute dapat diterima. Saat menambahkan atribut ke suatu elemen, kompiler mencari nama yang ditentukan dan nama dengan kata Attribute di akhir, yaitu, jika Anda menulis , kompiler akan mencari Custom dan CustomAttribute . Jika keduanya ada, kompiler akan melaporkan kesalahan. Untuk menghindari ambiguitas, nama atribut mungkin diawali dengan "@", menyebabkan [@Custom] berbeda dari CustomAttribute. Menggunakan atribut akan memanggil konstruktor kelas, dan konstruktor yang kelebihan beban juga didukung. Pasangan nama-nilai terikat pada properti, dengan “nama” menunjukkan nama properti dan “nilai” menunjukkan nilai yang ditetapkan pada properti.

Terkadang ada kebingungan mengenai penambahan atribut. Misalnya, di kode berikut Tidak jelas apa sebenarnya yang dimaksud dengan “oranye”:

DI DALAM dalam hal ini"oranye" dapat berarti metode pengujian ContohMetode, nilai kembaliannya, atau keseluruhan rakitan. Dalam hal ini, kompiler secara default akan mencoba memperlakukan atribut tersebut sebagai atribut metode. Jika hal ini tidak dimaksudkan oleh penulis kode, atau penulis hanya ingin membuat kode lebih mudah dimengerti, maka diperbolehkan untuk menunjukkan target atribut. Ejaannya akan menunjukkan bahwa nilai yang dikembalikan akan menjadi “oranye”, yang menunjukkan seluruh perakitan. Target yang valid adalah perakitan, bidang, peristiwa, metode, modul, param, properti, pengembalian, dan tipe.

Atribut yang telah ditentukan sebelumnya digunakan dengan cara yang sama seperti atribut biasa, tetapi atribut tersebut tidak memiliki pengendali khusus, karena kompiler sudah berisi deskripsi bawaan dari atribut tersebut dan memproses kode bergantung pada label yang ditetapkan. Atribut seperti Serializable dan Obsolete diimplementasikan sebagai atribut yang telah ditentukan sebelumnya. Atribut yang telah ditentukan sebelumnya tidak boleh digunakan oleh assembler ILASM, karena ia memiliki sintaksisnya sendiri untuk mendeskripsikan metadata.

Penyimpanan metadata

Rakitan berisi tabel metadata yang dijelaskan dalam spesifikasi CIL. Tabel metadata dapat memiliki nol atau lebih entri (entri), dengan posisi entri menentukan indeksnya. Ketika kode CIL menggunakan metadata, ia melakukannya dengan tag metadata. Ini adalah nilai 32-bit yang 8 bit pertama berisi data yang mengidentifikasi tabel metadata terkait, dan 24 bit sisanya menentukan indeks metadata dalam tabel. Platform SDK berisi contoh yang disebut metainfo (Rus. informasi meta), yang mencantumkan tabel metadata di rakitan. Namun informasi ini jarang digunakan oleh pengembang. Metadata dalam rakitan dapat dilihat menggunakan utilitas ILDASM (Intermediate Language Disassembler) yang disediakan sebagai bagian dari .NET Framework SDK.

Cerminan

Refleksi adalah antarmuka pemrograman aplikasi (API) yang digunakan untuk membaca metadata .NET. API refleksi menyediakan kemampuan untuk mengimplementasikan penelusuran metadata yang logis, bukan penelusuran tepat yang disediakan oleh alat seperti metainfo. Refleksi dalam versi 1.1 platform .NET dapat digunakan untuk memeriksa deklarasi kelas dan anggotanya, serta pemanggilan metode. Namun, ini tidak mengizinkan runtime untuk mengakses CIL demi metode ini. Platform versi 2.0 memungkinkan Anda mendapatkan metode dari CIL.

Alat lain untuk bekerja dengan metadata

Selain namespace System.Reflection, ada juga alat lain yang dapat digunakan untuk bekerja dengan metadata. Microsoft .NET Framework dikirimkan dengan perpustakaan manipulasi metadata CLR asli. Metadata juga dapat digunakan untuk mengekstrak dan memanipulasi alat pihak ketiga, seperti dan .

Tulis ulasan tentang artikel "Metadata di .NET"

Catatan

Lihat juga

Tautan

  • (Rusia)
  • (Rusia)

Kutipan yang menjelaskan Metadata di .NET

- Tidak, mereka pergi.
“Bagaimana mungkin saya tidak bertanggung jawab atas keterlambatan ini! Sayang sekali! - pikir petugas itu. Dia berkeliling ke seluruh kamp. Ada yang bilang mereka melihat Yermolov pergi ke suatu tempat bersama jenderal lain, ada yang bilang dia mungkin sudah pulang lagi. Petugas tanpa makan siang melakukan penggeledahan hingga pukul enam sore. Ermolov tidak ada dimana-mana dan tidak ada yang tahu di mana dia berada. Petugas itu segera makan camilan dengan kawannya dan kembali ke barisan depan menuju Miloradovich. Miloradovich juga tidak ada di rumah, tetapi kemudian dia diberitahu bahwa Miloradovich ada di pesta Jenderal Kikin, dan Yermolov juga harus ada di sana.
- Dimana itu?
“Di sana, di Echkino,” kata petugas Cossack sambil menunjuk ke rumah seorang pemilik tanah yang jauh.
- Bagaimana rasanya di balik rantai itu?
- Mereka mengirim dua resimen kami ke dalam rantai, ada pesta pora yang terjadi di sana sekarang, ini bencana! Dua musik, tiga paduan suara penulis lagu.
Petugas itu pergi ke belakang rantai ke Echkin. Dari jauh, saat mendekati rumah, ia mendengar suara nyanyian prajurit yang ramah dan ceria.
“Di padang rumput, ah... di padang rumput!..” - dia mendengarnya bersiul dan berdenting, sesekali tenggelam oleh teriakan suara-suara. Petugas itu merasakan kegembiraan dalam jiwanya karena suara-suara ini, tetapi pada saat yang sama dia takut bahwa dialah yang harus disalahkan karena tidak menyampaikan perintah penting yang dipercayakan kepadanya begitu lama. Saat itu sudah jam sembilan. Dia turun dari kudanya dan memasuki teras dan pintu masuk sebuah rumah bangsawan besar yang masih utuh, terletak di antara Rusia dan Prancis. Di dapur dan di lorong, para bujang sibuk membawa anggur dan piring. Ada buku nyanyian di bawah jendela. Perwira itu digiring melewati pintu, dan dia tiba-tiba melihat semua jenderal terpenting angkatan darat berkumpul, termasuk sosok Ermolov yang besar dan mencolok. Semua jenderal mengenakan mantel rok yang tidak dikancing, dengan wajah merah bersemangat dan tertawa terbahak-bahak, berdiri membentuk setengah lingkaran. Di tengah aula, seorang jenderal pendek tampan berwajah merah dengan cerdik dan cekatan membuat mesin pencacah.
- Ha ha ha! Oh ya Nikolai Ivanovich! ha ha ha!..
Petugas itu merasa bahwa dengan masuk saat ini dengan perintah penting, dia merasa bersalah ganda, dan dia ingin menunggu; tetapi salah satu jenderal melihatnya dan, setelah mengetahui tujuannya, memberi tahu Ermolov. Ermolov, dengan wajah cemberut, pergi menemui petugas itu dan, setelah mendengarkan, mengambil kertas itu darinya tanpa memberitahunya apa pun.
- Apa menurutmu dia pergi secara tidak sengaja? - seorang kawan staf berkata kepada seorang perwira kavaleri tentang Ermolov malam itu. - Ini adalah hal-hal yang disengaja. Berikan tumpangan pada Konovnitsyn. Lihat, betapa kacaunya besok!

Keesokan harinya, pagi-pagi sekali, Kutuzov yang jompo bangun, berdoa kepada Tuhan, berpakaian, dan dengan kesadaran yang tidak menyenangkan bahwa dia harus memimpin pertempuran yang tidak dia setujui, dia naik kereta dan pergi dari Letashevka. , lima mil di belakang Tarutin, ke tempat tiang-tiang yang maju akan dipasang. Kutuzov berkuda, tertidur dan bangun dan mendengarkan apakah ada tembakan di sebelah kanan, apakah bisnis telah dimulai? Tapi semuanya masih sepi. Fajar di musim gugur yang lembap dan berawan baru saja dimulai. Mendekati Tarutin, Kutuzov memperhatikan pasukan kavaleri menuntun kuda mereka ke air di seberang jalan yang dilalui kereta itu. Kutuzov melihat lebih dekat pada mereka, menghentikan kereta dan bertanya resimen yang mana? Pasukan kavaleri berasal dari barisan yang seharusnya berada jauh di depan dalam penyergapan. “Itu mungkin sebuah kesalahan,” pikir panglima tertinggi itu. Namun, setelah berkendara lebih jauh, Kutuzov melihat resimen infanteri, senjata di tiang penyangga, tentara dengan bubur dan kayu bakar, dengan celana dalam. Seorang petugas dipanggil. Petugas melaporkan bahwa tidak ada perintah untuk pindah.
“Bagaimana mungkin kamu tidak…” Kutuzov memulai, tetapi segera terdiam dan memerintahkan perwira senior itu dipanggil kepadanya. Setelah turun dari gerbong, dengan kepala tertunduk dan terengah-engah, menunggu dalam diam, dia berjalan mondar-mandir. Ketika petugas Staf Umum yang diminta Eichen muncul, wajah Kutuzov berubah menjadi ungu, bukan karena petugas ini bersalah atas kesalahannya, tetapi karena dia adalah subjek yang layak untuk mengungkapkan kemarahan. Dan, gemetar, terengah-engah, lelaki tua itu, setelah memasuki keadaan marah yang bisa dia alami ketika dia berguling-guling di tanah karena marah, dia menyerang Eichen, mengancam dengan tangannya, berteriak dan mengumpat dengan kata-kata vulgar. kata-kata. Orang lain yang muncul, Kapten Brozin, yang tidak bersalah atas apa pun, mengalami nasib yang sama.
- Bajingan macam apa ini? Tembak bajingan itu! – dia berteriak dengan suara serak, melambaikan tangannya dan terhuyung-huyung. Dia kesakitan secara fisik. Dia, panglima tertinggi, yang paling termasyhur, yang semua orang yakini bahwa tidak ada seorang pun di Rusia yang pernah memiliki kekuatan seperti dia, dia ditempatkan dalam posisi ini - diejek di depan seluruh tentara. “Sia-sia aku bersusah payah berdoa untuk hari ini, sia-sia aku tidak tidur di malam hari dan memikirkan segalanya! - dia memikirkan dirinya sendiri. “Saat aku masih menjadi perwira saat masih kecil, tidak ada yang berani mengolok-olokku seperti itu… Tapi sekarang!” Dia mengalami penderitaan fisik, seperti hukuman fisik, dan mau tidak mau mengungkapkannya dengan tangisan marah dan menyakitkan; tetapi segera kekuatannya melemah, dan dia, melihat sekeliling, merasa bahwa dia telah mengatakan banyak hal buruk, naik ke kereta dan diam-diam berkendara kembali.
Kemarahan yang tercurah tidak lagi kembali, dan Kutuzov, mengedipkan matanya dengan lemah, mendengarkan alasan dan kata-kata pembelaan (Ermolov sendiri tidak muncul di hadapannya sampai hari berikutnya) dan desakan Bennigsen, Konovnitsyn dan Tol untuk membuat gerakan gagal yang sama keesokan harinya. Dan Kutuzov harus setuju lagi.

Keesokan harinya, pasukan berkumpul di tempat yang telah ditentukan pada malam hari dan berangkat pada malam hari. Saat itu malam musim gugur dengan awan hitam keunguan, tapi tidak ada hujan. Tanahnya basah, tetapi tidak ada lumpur, dan pasukan berbaris tanpa suara, hanya sesekali terdengar dentingan artileri. Mereka melarang berbicara dengan suara keras, merokok pipa, menyalakan api; kuda-kuda dicegah agar tidak meringkik. Misteri perusahaan meningkatkan daya tariknya. Orang-orang berjalan dengan riang. Beberapa barisan berhenti, menaruh senjata di tiang penyangga dan berbaring di tanah yang dingin, percaya bahwa mereka telah datang ke tempat yang tepat; beberapa (sebagian besar) tiang berjalan sepanjang malam dan, jelas, pergi ke tempat yang salah.
Pangeran Orlov Denisov dengan Cossack (detasemen paling tidak penting dari yang lainnya) sendirian berakhir di tempat dan waktu mereka. Detasemen ini berhenti di ujung hutan, di jalan dari desa Stromilova ke Dmitrovskoe.
Sebelum fajar, Count Orlov, yang tertidur, terbangun. Mereka membawa seorang pembelot dari kamp Prancis. Ini adalah bintara korps Poniatowski Polandia. Perwira bintara ini menjelaskan dalam bahasa Polandia bahwa dia membelot karena dia telah dianiaya dalam pelayanannya, bahwa dia seharusnya menjadi perwira sejak lama, bahwa dia lebih berani daripada orang lain dan oleh karena itu meninggalkan mereka dan ingin menghukum mereka. Dia mengatakan bahwa Murat bermalam satu mil jauhnya dari mereka dan jika mereka memberinya seratus orang sebagai pengawal, dia akan membawanya hidup-hidup. Count Orlov Denisov berkonsultasi dengan rekan-rekannya. Tawaran itu terlalu bagus untuk ditolak. Semua orang mengajukan diri untuk pergi, semua orang menyarankan saya untuk mencoba. Setelah banyak perselisihan dan pertimbangan, Mayor Jenderal Grekov dengan dua resimen Cossack memutuskan untuk pergi dengan seorang bintara.
“Baiklah, ingat,” kata Count Orlov Denisov kepada bintara itu sambil melepaskannya, “jika kamu berbohong, aku akan menggantungmu seperti anjing, tetapi kenyataannya adalah seratus dukat.”
Perwira non-komisioner dengan tatapan tegas tidak menjawab kata-kata ini, duduk di atas kuda dan pergi bersama Grekov, yang dengan cepat berkumpul. Mereka menghilang ke dalam hutan. Count Orlov, gemetar karena kesegaran pagi yang mulai menyingsing, bersemangat dengan apa yang telah dia mulai atas tanggung jawabnya sendiri, setelah mengantar Grekov pergi, keluar dari hutan dan mulai melihat sekeliling kamp musuh, yang sekarang terlihat. menipu dalam terang awal pagi dan api yang padam. Di sebelah kanan Count Orlov Denisov, di sepanjang lereng terbuka, tiang kami seharusnya muncul. Count Orlov melihat ke sana; namun meskipun terlihat dari jauh, kolom-kolom ini tidak terlihat. Di kamp Prancis, menurut pandangan Pangeran Orlov Denisov, dan terutama menurut ajudannya yang sangat waspada, mereka mulai bergerak.

Menurut skema yang dipertimbangkan untuk mengembangkan dan menjalankan aplikasi .NET, penyusun bahasa pemrograman sumber yang digunakan oleh pengembang mengkompilasi aplikasi bukan ke dalam kode mesin untuk tujuan tertentu. sistem operasi dan prosesor, dan menjadi kode perantara di MSIL. File yang dapat dieksekusi yang diperoleh dengan cara ini, selain kode aplikasi itu sendiri, juga berisi metadata - informasi layanan tentang aplikasi tersebut. Seperti file yang dapat dieksekusi disebut rakitan dan dianalogikan dengan file EXE dan DLL untuk aplikasi biasa. Kemudian, saat aplikasi dijalankan, rakitan dimuat oleh lingkungan operasi .NET Framework dan dikompilasi ke dalam kode mesin di sana. Skema eksekusi aplikasi dalam arsitektur .NET memberikan keuntungan yang signifikan:

Aplikasi .NET tidak bergantung pada platform selama varian sistem operasi yang sesuai tersedia untuk sistem operasi tersebut.

Metadata yang dikompilasi ke dalam kode aplikasi memungkinkan Anda menyingkirkan perpustakaan tipe yang rumit dan registrasi registri sistem, yang mana aplikasi COM dikritik dengan tepat. Aplikasi .NET siap digunakan.

Kombinasi informasi overhead dalam metadata dan mekanisme terkait di runtime CLR memberikan hal-hal berguna seperti kontrol versi.

Namun tentu saja pendekatan ini juga memiliki kelemahan. Pengembang Microsoft, tentu saja, mengetahui hal ini dan berusaha menghilangkan atau meminimalkan sebagian besar masalah.

Yang paling jelas di antaranya:

Arsitekturnya rumit - diperlukan lingkungan operasi untuk menjalankan aplikasi.

Kebutuhan untuk mengkompilasi ke kode mesin memperlambat eksekusi aplikasi.

Kode MSIL tahan terhadap kerusakan - setiap rakitan yang tidak terenkripsi dapat dimodifikasi oleh siapa pun.

Komposisi perakitan

Pertama-tama (Gbr. 3), rakitan menyertakan manifes - metadata yang mencakup informasi tentang rakitan:

1. versi aplikasi, terdiri dari empat nomor;

2. daftar nama file yang membentuk perakitan, serta checksum untuk setiap file dari daftar;

3. daftar nama dan versi majelis lain yang digunakan oleh majelis ini;

4. daftar jenis dan sumber daya. Mereka dibagi menjadi dua jenis menurut ketersediaannya: hanya di dalam majelis (internal) dan di luar majelis (publik);

5. informasi tentang perlindungan majelis: hak peluncuran, informasi perizinan.

Selain file rakitan itu sendiri, manifes dapat berisi nama file lain yang diperlukan untuk aplikasi, misalnya: file gambar, dokumen XML, halaman HTML dll.

Versi perakitan terdiri dari dua bagian dan empat nomor. Bagian utama mencakup versi aplikasi utama (mayor) dan tambahan (minor). Bagian tambahan berisi nomor pembuatan aplikasi (build) dan nomor revisi (revisi). Saat mencari perakitan berdasarkan nomor versi, bagian utama harus sesuai dengan yang Anda cari, dan kemudian perakitan dengan bagian tambahan maksimum dipilih.

Gambar 3. Jenis majelis

Selanjutnya, rakitan menyertakan metadata - informasi tentang aplikasi yang diperlukan untuk dijalankan di runtime CLR, sumber daya yang dikompilasi, dll. Dan terakhir, rakitan menyertakan kode aplikasi aktual, yang dibuat dalam bahasa perantara MSIL.

Karena adanya manifes dan metadata, aplikasi .NET disebut self-describing, yaitu aplikasi “membawa” semua informasi yang diperlukan tentang dirinya sendiri. Dan ini merupakan keuntungan yang sangat penting. Jika Anda ingat aplikasi COM, perpustakaan tipe digunakan untuk memperoleh informasi tentang aplikasi tersebut, dan aplikasi itu sendiri harus terdaftar di registri sistem. Tanpa ini, aplikasi COM tidak akan berfungsi! Dan di .NET, aplikasi siap digunakan segera setelah ditransfer ke komputer.

Saat mendeskripsikan manifes, kami berbicara tentang daftar rakitan yang digunakan. Artinya suatu aplikasi dapat berisi kumpulan aplikasi lain yang diperbolehkan untuk dibagikan. Berdasarkan hal ini, majelis dapat terdiri dari dua jenis: pribadi dan bersama.

Majelis pribadi hanya tersedia dalam aplikasi pemilik. Majelis bersama - untuk semua aplikasi yang tertarik. Rakitan tersebut harus disimpan dalam cache rakitan global khusus. Biasanya terletak di folder .WINNT\Assembly. Namun untuk majelis bersama, aturan penamaan yang unik harus dipatuhi. Jika suatu aplikasi ingin menggunakan rakitan bersama, aplikasi tersebut tidak boleh berisi rakitan dengan nama yang sama.

Metadata

Ketika kompiler .NET menghasilkan kode MSIL, ia juga menghasilkan metadata yang disertakan dalam file perakitan aplikasi. Metadata berisi semua informasi tentang aplikasi yang diperlukan agar dapat berjalan di runtime CLR. Penting bagian integral metadata adalah manifes yang telah ditinjau. Namun selain itu, metadata juga mencakup informasi lain:

nama aplikasi;

kunci publik;

mengetik informasi;

atribut;

Kunci publik diperlukan dalam keamanan runtime CLR untuk mendekripsi rakitan terenkripsi.

Informasi jenis menentukan jenis mana yang diekspor oleh aplikasi. Ini mencakup nama tipe, ketersediaannya, kelas dasar, dan anggota tipe (bidang, metode, peristiwa).

Atribut perakitan adalah sekumpulan elemen khusus. Pengembang dapat menambahkan elemennya sendiri di sini dengan informasi apa pun yang diperlukan tentang perakitan atau tipe yang diekspor. Jika rakitan berisi metadata, maka kode aplikasi dikelola - cocok untuk dieksekusi dalam runtime CLR. Jika tidak, kode tersebut disebut tidak terkelola. Delphi, C#, kompiler Visual Basic menghasilkan kode terkelola. Kompiler C++, bergantung pada pengaturannya, dapat menghasilkan kedua jenis kode. Jika aplikasi .NET dijalankan pada server COM mana pun, aplikasi tersebut menggunakan kode yang tidak dikelola.

Terakhir diperbarui: 31/10/2015

Saat bekerja dengan model di MVC, metadata memainkan peran yang lebih penting. Mereka mengizinkan Anda menentukan beberapa informasi tambahan tentang suatu objek, misalnya, cara menampilkan propertinya dalam tampilan, atau cara memvalidasi data masukan.

Anotasi Data untuk Pemetaan Properti

Anotasi data adalah atribut yang dapat Anda temukan di namespace System.ComponentModel.DataAnnotations (walaupun beberapa atribut ditentukan di ruang lain).

Atribut tampilan

Jadi, misalkan kita mempunyai beberapa model Buku:

Buku kelas publik ( Id int virtual publik ( get; set; ) string virtual publik Nama ( get; set; ) string virtual publik Penulis ( get; set; ) int virtual publik Tahun ( get; set; ) )

Dan kami mencoba untuk mendapatkan satu objek model ini dari database:

HomeController kelas publik: Pengontrol ( private BookContext db = new BookContext(); public ActionResult Index() ( var firstBook = db.Books.ToList ().Pertama(); return View (Buku pertama);

) )

Dengan menggunakan helper yang sesuai, kami menampilkan model ini dalam tampilan: @Html.DisplayForModel() :"; } @Html.DisplayForModel() !}

@model DataAnnotations.Models.Book @( ViewBag.Title = "Book

Kode normal, tapi di sini kita mengalami masalah:

Seperti yang Anda lihat, judul properti sama persis dengan nama properti, sehingga sangat tidak nyaman. Lagi pula, kita bisa menyebut properti itu apa pun yang kita inginkan. Selain itu, kami tidak ingin nama di situs berbahasa Rusia menggunakan bahasa Inggris. Tentu saja, dalam hal ini kita dapat menggunakan @Html.LabelFor untuk menetapkan nama untuk masing-masing properti, tetapi dalam kasus ini jumlah kode akan bertambah beberapa kali lipat, dan kita tidak akan dapat menampilkan semua informasi tentang model di satu baris. Selain itu, Anda mungkin perlu menampilkan informasi tentang model dalam beberapa tampilan. Itu sebabnya pendekatan ini

tidak maksimal.

Dan di sini anotasi data membantu kami, yaitu atribut Display. Kita hanya perlu memperbaiki model dengan menentukan parameter tampilannya:

Menggunakan System.ComponentModel.DataAnnotations; ................................................... Buku kelas publik ( public virtual int Id ( get; set; ) string virtual publik Nama ( get; set; ) string virtual publik Penulis ( get; set; ) int virtual publik Tahun ( get; set; ) )

Properti Nama dari atribut Tampilan berisi string yang akan ditampilkan alih-alih nama properti. Kita tidak perlu mengubah apa pun. Mari kita luncurkan dan lihat nama-nama baru:

Atribut Input Tersembunyi

Menggunakan System.ComponentModel.DataAnnotations; menggunakan Sistem.Web.Mvc; ................................................... Buku kelas publik ( public virtual int Id ( get; set; ) string virtual publik Nama ( get; set; ) string virtual publik Penulis ( get; set; ) int virtual publik Tahun ( get; set; ) )

Properti DisplayValue=false menunjukkan bahwa bidang ini harus disembunyikan. Akibatnya, Anda tidak akan melihatnya:

Saat menggunakan pembantu pengeditan (Html.EditorFor/Html.EditorForModel) untuk dari properti ini bidang tersembunyi akan dihasilkan:

Atribut ScaffoldColumn

Saat mengedit model, atribut HiddenInput tidak sepenuhnya menyembunyikan bidang, karena kita dapat melihatnya kode sumber halaman dan temukan bidang yang sesuai. Untuk sepenuhnya menyembunyikan properti dari pembantu, gunakan atribut ScaffoldColumn:

Id int virtual publik ( dapatkan; set; )

Sekarang pembantu pengeditan tidak akan melihat properti ini dan bahkan tidak akan membuat bidang tersembunyi di halaman.

Atribut Tipe Data

Atribut DataType memungkinkan Anda memberikan informasi kepada runtime tentang penggunaan properti. Misalnya, kita memiliki properti Kata Sandi:

Kata sandi string publik ( dapatkan; setel; )

Untuk properti dengan atribut DataType.Password, pembantu HTML membuat elemen input yang atribut type-nya disetel ke "password". Kemudian di browser Anda tidak akan melihat karakter yang dimasukkan saat memasukkan data:

Pencacahan DataType dapat mengambil beberapa nilai berbeda:

Atribut UIHint

Atribut ini menentukan template tampilan mana yang akan digunakan saat membuat penandaan html untuk properti tertentu. Templat mengontrol bagaimana properti akan dirender pada halaman.

Templat bawaan berikut tersedia:

    Boolean

    Edit pembantu membuat kotak centang untuk nilai boolean.

    Untuk nilai bertipe bool? (nullable) membuat elemen pilihan dengan parameter Benar, Salah, dan Tidak Ditetapkan

    Pembantu tampilan menghasilkan elemen html yang sama dengan pembantu edit, hanya dengan atribut yang dinonaktifkan

    Koleksi

    Templat yang sesuai digunakan untuk merender setiap elemen dalam koleksi. Selain itu, elemennya bisa dari jenis yang berbeda.

    Desimal

    Edit pembantu membuat bidang teks satu baris - elemen masukan

    Alamat Email

    Masukan Tersembunyi

    Bidang tersembunyi dibuat - elemen masukan tersembunyi

    HTML

    Edit pembantu membuat bidang teks satu baris.

    Tampilan pembantu hanya menampilkan teks

    Teks Multibaris

    Edit pembantu membuat bidang teks multiline (elemen textarea)

    Pembantu mempelajari properti suatu objek dan memilih templat yang paling sesuai untuknya.

    Kata sandi

    Edit pembantu membuat bidang teks untuk memasukkan karakter menggunakan topeng

    Tampilan pembantu menunjukkan kata sandi apa adanya, tanpa menggunakan topeng

    Rangkaian

    Edit pembantu membuat bidang teks satu baris

    Edit pembantu membuat bidang teks

Misalnya, mari kita gunakan template Url terakhir:

Buku kelas publik ( Id int virtual publik ( get; set; ) string virtual publik Nama ( get; set; ) string virtual publik Penulis ( get; set; ) int virtual publik Tahun ( get; set; ) )

menggunakan Sistem; menggunakan Sistem.Refleksi; menggunakan Sistem.Teks; menggunakan Sistem.CodeDom.Compiler; menggunakan Microsoft.CSharp; ruang nama DynUnloop ( // Periksa dalam lingkaran kelas SearchLooping ( public int Search(int a, int b) ( int count = 0; foreach (int i in b) ( foreach (int j in a) ( if (i == j) ( count++; break ; ) ) ) jumlah pengembalian; ) ) // Periksa dengan saklar yang dihasilkan antarmuka publik IChecker ( bool Check(int valMax); ) class SearchFlat ( IChecker WriteCode(int a) ( StringBuilder code = new StringBuilder(); code.Append("\n namespace DynUnloop" ); code.Append( "\n (Pemeriksa kelas: IChecker"); kode.Tambahkan("\n ( bool IChecker.Periksa(int n)" ); code.Append("\n ( switch (n)" ); code.Append("\n (" ); foreach (int j dalam a) code.Append("\n case " +j+":" ); kode.Tambahkan("\n kembalikan nilai true;" ); hasil++; ) mengembalikan hasil;) Kode IChecker = null; ) Tes kelas ( static void Utama(string args) ( int a = (// Hitung kemunculan angka-angka ini dalam array arr2. //////////////////////////////////////////// 74, 97, 93, 86, 2, 78, 48, 14, 21, 58, 60, 5, 39, 4, 66, 9, 31, 15, 69, 27, 37, 46, 62, 61, 81, 17, 88, 19, 44, 8);< countIterations; it++) count = searchLoop.Search(a, b); TimeSpan span = DateTime.Now - start; Console.WriteLine(ke dalam b = (// Dalam array ini kita mencari angka-angka yang terdapat dalam arr1. /////////////////////////////////////////// 98, 53, 79, 47, 0, 39, 28, 18, 39, 49, 56, 17, 33, 19, 72, 13, 28, 48, 21, 80, 10, 3, 67, 76, 83, 6, 40, 58, 23, 74, 81, 88, 13, 48, 59, 83, 47, 1, 38, 63, 70, 21, 23, 30, 86, 71, 15, 25, 32, 73, 23, 55, 52, 19, 90, 95, 84, 2, 63, 93, 98, 69, 93, 64, 66, 66, 3, 84, 58, 88, 64, 26, 9, 56, 9, 88, 78, 37, 88, 11, 89, 14, 26, 49, 50, 26, 36, 93, 56, 63, 97, 44, 37, 44, 64, 1, 26, 58, 62, 19, 68, 30, 66, 42, 9, 96, 45, 94, 9, 2, 17, 46, 12, 51, 3, 83, 43, 44, 14, 40, 30, 9, 27, 94, 90, 19, 87, 64, 91, 8, 61, 20, 74, 69, 42, 59, 47, 82, 40, 52, 80, 41, 83, 54, 45, 50, 31, 85, 41, 80, 56, 80, 44, 22, 88, 58, 3, 70, 51, 88, 8, 80, 2, 1, 39, 96, 71, 42, 8, 43, 35, 59, 4, 60, 59, 88, 25, 72, 48, 39, 86, 1, 23, 11, 50, 79, 74, 52, 79, 83, 56, 75, 31, 50, 43, 0, 38, 82, 14, 48, 78, 88, 77, 97, 44, 96, 76, 83, 61, 0, 32, 30, 22, 12, 1, 7, 56, 90, 49, 58, 21, 18, 62, 23, 85, 58, 28, 52, 16, 58, 49, 42, 57, 98, 59, 97, 23, 25, 65, 53, 3, 90, 89, 79, 50, 25, 53, 18, 49, 36, 42, 47, 33, 54, 27, 59);< countIterations; it++) count2 = searchFlat.Search(a, b); TimeSpan span2 = DateTime.Now - start2; Console.WriteLine(const int hitunganIterasi = 200000; SearchLooping searchLoop = SearchLooping baru();

Atribut

Pengembang dapat menambahkan metadata ke kode mereka berkat atribut. Ada dua jenis (dua bentuk) atribut: atribut yang didefinisikan dalam runtime bahasa umum (CLR). atribut khusus semu), dan atribut khusus (eng. atribut khusus TanggalWaktu mulai = TanggalWaktu.Sekarang;

Atribut khusus adalah kelas reguler yang mewarisi kelas Atribut. Atribut tersebut dapat digunakan pada metode, properti, kelas, atau seluruh perakitan apa pun menggunakan sintaks berikut: [ Nama Atribut(opsional parameter int hitungan = 0; nama=nilai)]. Misalnya:

Atribut khusus banyak digunakan di .NET Framework. Kerangka Komunikasi Windows menggunakan atribut untuk menentukan kontrak layanan, ASP.NET menggunakannya untuk mengekspos metode sebagai layanan web, LINQ ke SQL menggunakannya untuk mengikat kelas ke kelas yang mendasarinya. skema relasional,Visual Studio menggunakannya untuk mengelompokkan properti suatu objek, pengembang kelas menentukan kategori untuk kelas objek menggunakan atribut ,custom. Atribut khusus diproses oleh kode aplikasi, bukan CLR. Ketika kompiler menemukan atribut khusus, ia menciptakan metadata khusus yang tidak dikenali oleh CLR. Pengembang harus menerapkan kode untuk membaca dan memproses metadata. Sebagai contoh, atribut yang ditunjukkan pada contoh di atas dapat diproses dengan kode berikut:

Kelas CustomAttribute : Atribut ( private int paramNumber = 0 ; private string comment = "" ; public CustomAttribute() ( ) public CustomAttribute(int num) ( paramNumber = num; ) public String Comment ( set ( comment = value ; ) ) )

Nama kelas dikaitkan dengan nama atribut. Kompiler Visual C# IDE secara otomatis menambahkan string "Atribut" di akhir setiap nama atribut. Sebagai konsekuensinya, setiap nama atribut kelas harus diakhiri dengan baris seperti itu, namun mendefinisikan atribut tanpa akhiran Attribute dapat diterima. Saat menambahkan atribut ke suatu elemen, kompiler mencari nama yang ditentukan dan nama dengan kata Attribute di akhir, yaitu, jika Anda menulis , kompiler akan mencari Custom dan CustomAttribute . Jika keduanya ada, kompiler akan melaporkan kesalahan. Untuk menghindari ambiguitas, nama atribut mungkin diawali dengan "@", menyebabkan [@Custom] berbeda dari CustomAttribute. Menggunakan atribut akan memanggil konstruktor kelas, dan konstruktor yang kelebihan beban juga didukung. Pasangan nama-nilai terikat pada properti, dengan “nama” menunjukkan nama properti dan “nilai” menunjukkan nilai yang ditetapkan pada properti.

Terkadang ada kebingungan mengenai penambahan atribut. Misalnya pada kode berikut ini tidak jelas apa sebenarnya yang dimaksud dengan “oranye”:

Dalam hal ini, "oranye" dapat berarti beberapa metode pengujian ContohMetode , nilai kembaliannya, atau keseluruhan rakitan. Dalam hal ini, kompiler secara default akan mencoba memperlakukan atribut tersebut sebagai atribut metode. Jika hal ini tidak dimaksudkan oleh penulis kode, atau penulis hanya ingin membuat kode lebih mudah dimengerti, maka diperbolehkan untuk menunjukkan target atribut. Ejaannya akan menunjukkan bahwa nilai yang dikembalikan akan menjadi “oranye”, yang menunjukkan seluruh perakitan. Target yang valid adalah perakitan, bidang, peristiwa, metode, modul, param, properti, pengembalian, dan tipe.

Atribut yang telah ditentukan sebelumnya digunakan dengan cara yang sama seperti atribut biasa, tetapi atribut tersebut tidak memiliki pengendali khusus, karena kompiler sudah berisi deskripsi bawaan dari atribut tersebut dan memproses kode bergantung pada label yang ditetapkan. Atribut seperti Serializable dan Obsolete diimplementasikan sebagai atribut yang telah ditentukan sebelumnya. Atribut yang telah ditentukan sebelumnya tidak boleh digunakan oleh assembler ILASM, karena ia memiliki sintaksisnya sendiri untuk mendeskripsikan metadata.

Penyimpanan metadata

Rakitan berisi tabel metadata yang dijelaskan dalam spesifikasi CIL. Tabel metadata dapat memiliki nol atau lebih entri (entri), dengan posisi entri menentukan indeksnya. Ketika kode CIL menggunakan metadata, ia melakukannya dengan tag metadata. Ini adalah nilai 32-bit yang 8 bit pertama berisi data yang mengidentifikasi tabel metadata terkait, dan 24 bit sisanya menentukan indeks metadata dalam tabel. Platform SDK berisi contoh yang disebut metainfo (Rus. informasi meta), yang mencantumkan tabel metadata di rakitan. Namun informasi ini jarang digunakan oleh pengembang. Metadata dalam rakitan dapat dilihat menggunakan utilitas ILDASM, yang disediakan sebagai bagian dari .NET Framework SDK.

Cerminan

Catatan

Lihat juga

  • Anotasi di Jawa

Tautan

  • Atribut dalam C# (Rusia)
  • Metadata di lingkungan .Net (Rusia)

Yayasan Wikimedia.

  • 2010.

    semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat