Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Atribut menyediakan cara yang kuat untuk mengaitkan metadata, atau informasi deklaratif, dengan kode (rakitan, jenis, metode, properti, dan sebagainya). Setelah mengaitkan atribut dengan entitas program, Anda dapat memeriksa atribut pada waktu proses dengan menggunakan teknik yang disebut refleksi.
Atribut memiliki properti berikut:
- Atribut menambahkan metadata ke program Anda. Metadata adalah informasi tentang jenis yang ditentukan dalam program. Semua rakitan .NET berisi sekumpulan metadata tertentu yang menjelaskan jenis dan jenis anggota yang ditentukan dalam rakitan. Anda dapat menambahkan atribut kustom untuk menentukan informasi lain yang diperlukan.
- Atribut dapat diterapkan ke seluruh rakitan, modul, atau elemen program yang lebih kecil, seperti kelas dan properti.
- Atribut dapat menerima argumen dengan cara yang sama seperti metode dan properti.
- Atribut memungkinkan sebuah program untuk memeriksa metadata miliknya sendiri atau metadata di program lain dengan menggunakan refleksi.
Bekerja dengan renungan
API Refleksi yang disediakan oleh Type menjelaskan assembly, modul, dan tipe. Anda dapat menggunakan pantulan untuk membuat instans jenis secara dinamis, mengikat jenis ke objek yang ada, atau mendapatkan jenis dari objek yang ada dan memanggil metodenya atau mengakses bidang dan propertinya. Saat Anda menggunakan atribut dalam kode, pantulan memungkinkan Anda mengaksesnya. Untuk informasi selengkapnya, lihat atribut .
Berikut adalah contoh refleksi sederhana dengan GetType() metode . Semua jenis dari Object kelas dasar mewarisi metode ini, yang digunakan untuk mendapatkan jenis variabel:
Nota
Pastikan Anda menambahkan using System; pernyataan dan using System.Reflection; di bagian atas file kode C# (.cs).
// Using GetType to obtain type information:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);
Output itu menunjukkan jenis:
System.Int32
Contoh berikut menggunakan refleksi untuk mendapatkan nama lengkap dari rakitan yang dimuat.
// Using Reflection to get information of an Assembly:
Assembly info = typeof(int).Assembly;
Console.WriteLine(info);
Outputnya mirip dengan contoh berikut:
System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
Perbedaan kata kunci untuk IL
Kata kunci protected C# dan internal tidak memiliki arti dalam Bahasa Perantara (IL) dan tidak digunakan dalam API pantulan. Istilah yang sesuai dalam IL adalah Family dan Assembly. Berikut beberapa cara untuk menggunakan istilah-istilah ini:
- Untuk mengidentifikasi metode
internaldengan menggunakan refleksi, gunakan properti IsAssembly. - Untuk mengidentifikasi metode
protected internal, gunakan IsFamilyOrAssembly.
Bekerja dengan atribut
Atribut dapat ditempatkan pada hampir semua deklarasi, meskipun atribut tertentu mungkin membatasi jenis deklarasi yang valid. Di C#, Anda menentukan atribut dengan menempatkan nama atribut yang diapit tanda kurung siku ([]) di atas deklarasi entitas yang diterapkannya.
Dalam contoh ini, Anda menggunakan SerializableAttribute atribut untuk menerapkan karakteristik tertentu ke kelas:
[Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}
Anda dapat mendeklarasikan metode dengan DllImportAttribute atribut :
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
Anda dapat menempatkan beberapa atribut pada deklarasi:
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
Beberapa atribut dapat ditentukan lebih dari sekali untuk entitas tertentu. Contoh berikut menunjukkan beberapa penggunaan ConditionalAttribute atribut:
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}
Nota
Menurut konvensi, semua nama atribut diakhiri dengan akhiran "Atribut" untuk membedakannya dari jenis lain di pustaka .NET. Namun, Anda tidak perlu menentukan akhiran atribut saat menggunakan atribut dalam kode. Misalnya, [DllImport] deklarasi setara dengan [DllImportAttribute] deklarasi, tetapi DllImportAttribute merupakan nama aktual kelas di Pustaka Kelas .NET.
Parameter atribut
Banyak atribut memiliki parameter, yang dapat berupa posisi, tidak bernama, atau bernama. Tabel berikut ini menjelaskan cara bekerja dengan atribut bernama dan posisi:
Parameter posisi
Parameter konstruktor atribut:
Parameter dengan nama
Properti atau bidang atribut:
- Harus menentukan, tidak boleh dihilangkan
- Selalu tentukan terlebih dahulu
- Tentukan dalam urutan tertentu
- Selalu opsional, hilangkan ketika salah
- Tentukan setelah parameter posisional
- Tentukan dalam urutan apa pun
Misalnya, kode berikut menunjukkan tiga atribut yang setara DllImport :
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
Parameter pertama, nama DLL, bersifat posisional dan selalu menjadi yang utama. Instans lain diberi nama parameter. Dalam skenario ini, kedua parameter bernama secara default bernilai false, sehingga dapat dihilangkan. Lihat dokumentasi atribut individual untuk informasi tentang nilai parameter default. Untuk informasi selengkapnya tentang jenis parameter yang diizinkan, lihat bagian Atribut spesifikasi bahasa C#.
Sasaran atribut
Target dari atribut adalah entitas yang dikenai oleh atribut. Misalnya, atribut dapat berlaku untuk kelas, metode, atau rakitan. Secara default, atribut berlaku untuk elemen yang mengikutinya. Tetapi Anda juga dapat secara eksplisit mengidentifikasi elemen yang akan dikaitkan, seperti metode, parameter, atau nilai pengembalian.
Untuk mengidentifikasi target atribut secara eksplisit, gunakan sintaks berikut:
[target : attribute-list]
Tabel berikut ini memperlihatkan daftar kemungkinan target nilai.
| Nilai target | Berlaku untuk |
|---|---|
assembly |
Seluruh rakitan |
module |
Modul perakitan saat ini |
field |
Kolom di kelas atau struktur |
event |
Peristiwa |
method |
Metode akses properti atau get dan set |
param |
Parameter metode atau parameter aksesor properti set |
property |
Harta benda |
return |
Mengembalikan nilai metode, pengindeks properti, atau aksesor properti get |
type |
Struktur, kelas, antarmuka, enum, atau delegasi |
Anda dapat menentukan field nilai target untuk menerapkan atribut ke bidang backing yang dibuat untuk properti yang diimplementasikan secara otomatis.
Contoh berikut menunjukkan cara menerapkan atribut ke rakitan dan modul. Untuk informasi selengkapnya, lihat Atribut umum (C#).
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
Contoh berikut menunjukkan cara menerapkan atribut ke metode, parameter metode, dan nilai pengembalian metode di 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; }
Nota
Terlepas dari target di mana ValidatedContract atribut didefinisikan valid, return target harus ditentukan, bahkan jika ValidatedContract atribut didefinisikan untuk diterapkan hanya untuk mengembalikan nilai. Dengan kata lain, pengompilasi tidak menggunakan AttributeUsage informasi untuk mengatasi target atribut ambigu. Untuk informasi selengkapnya, lihat AttributeUsage.
Meninjau cara menggunakan atribut
Berikut adalah beberapa cara umum untuk menggunakan atribut dalam kode:
- Tandai metode pengontrol yang merespons pesan POST dengan menggunakan
HttpPostatribut . Untuk informasi selengkapnya, lihat kelas HttpPostAttribute. - Jelaskan cara mengatur parameter metode ketika berinteraksi dengan kode asli. Untuk informasi selengkapnya, lihat kelas MarshalAsAttribute.
- Menjelaskan properti Model Objek Komponen (COM) untuk kelas, metode, dan antarmuka.
- Panggil kode yang tidak dikelola dengan menggunakan DllImportAttribute kelas .
- Gambarkan assembly Anda dalam hal judul, versi, deskripsi, atau merek dagang.
- Jelaskan anggota kelas mana yang akan diserialisasikan untuk persistensi.
- Menjelaskan cara memetakan antara anggota kelas dan node XML untuk serialisasi XML.
- Menjelaskan persyaratan keamanan untuk metode.
- Tentukan karakteristik yang digunakan untuk memberlakukan keamanan.
- Kontrol pengoptimalan dengan kompilator just-in-time (JIT) sehingga kode tetap mudah di-debug.
- Dapatkan informasi tentang pemanggil ke metode .
Meninjau skenario refleksi
Refleksi berguna dalam skenario berikut:
- Akses atribut dalam metadata program Anda. Untuk informasi selengkapnya, lihat Mengambil informasi yang disimpan dalam atribut.
- Periksa dan buat instans jenis dalam rakitan.
- Buat tipe baru saat runtime dengan menggunakan kelas di System.Reflection.Emit namespace.
- Lakukan pengikatan terlambat dan metode akses pada jenis yang dibuat pada waktu proses. Untuk informasi selengkapnya, lihat Memuat dan menggunakan jenis secara dinamis.