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.
Generik memperkenalkan konsep parameter jenis ke .NET. Generik memungkinkan untuk merancang kelas dan metode yang menugur spesifikasi satu atau beberapa parameter jenis sampai Anda menggunakan kelas atau metode dalam kode Anda. Misalnya, dengan menggunakan parameter jenis generik T
, Anda dapat menulis satu kelas yang dapat digunakan oleh kode klien lain tanpa menimbulkan biaya atau risiko penggunaan casting saat runtime atau operasi boxing, seperti yang ditunjukkan di sini.
// Declare the generic class.
public class GenericList<T>
{
public void Add(T item) { }
}
public class ExampleClass { }
class TestGenericList
{
static void Main()
{
// Create a list of type int.
GenericList<int> list1 = new();
list1.Add(1);
// Create a list of type string.
GenericList<string> list2 = new();
list2.Add("");
// Create a list of type ExampleClass.
GenericList<ExampleClass> list3 = new();
list3.Add(new ExampleClass());
}
}
Kelas dan metode generik menggabungkan penggunaan kembali, keamanan jenis, dan efisiensi dengan cara yang tidak dapat digunakan oleh rekan nongenerik mereka. Parameter jenis generik diganti dengan argumen jenis selama kompilasi. Dalam contoh sebelumnya, pengkompilasi mengganti dengan T
int
. Generik paling sering digunakan dengan kumpulan dan metode yang mengoperasikannya. Namespace System.Collections.Generic berisi beberapa kelas koleksi berbasis generik. Koleksi nongenerik, seperti ArrayList tidak direkomendasikan dan hanya dipertahankan untuk tujuan kompatibilitas. Untuk informasi lebih lanjut, lihat Generik .NET di .
Anda juga dapat membuat jenis dan metode generik kustom untuk menyediakan solusi umum dan pola desain Anda sendiri yang aman dan efisien. Contoh kode berikut menunjukkan kelas daftar tertaut generik sederhana untuk tujuan demonstrasi. (Dalam kebanyakan kasus, Anda harus menggunakan kelas List<T> yang disediakan oleh .NET daripada membuat kelas Anda sendiri.) Jenis parameter T
digunakan di beberapa lokasi di mana jenis konkret biasanya akan digunakan untuk menunjukkan jenis item yang disimpan dalam daftar:
- Sebagai tipe parameter dalam metode
AddHead
. - Sebagai jenis
Data
pengembalian properti di kelas berlapisNode
. - Sebagai jenis anggota
data
privat di kelas berlapis.
T
tersedia untuk kelas berlapis Node
. Ketika GenericList<T>
diinstansiasi dengan tipe konkret, misalnya sebagai GenericList<int>
, setiap kejadian T
diganti dengan int
.
// Type parameter T in angle brackets.
public class GenericList<T>
{
// The nested class is also generic, and
// holds a data item of type T.
private class Node(T t)
{
// T as property type.
public T Data { get; set; } = t;
public Node? Next { get; set; }
}
// First item in the linked list
private Node? head;
// T as parameter type.
public void AddHead(T t)
{
Node n = new(t);
n.Next = head;
head = n;
}
// T in method return type.
public IEnumerator<T> GetEnumerator()
{
Node? current = head;
while (current is not null)
{
yield return current.Data;
current = current.Next;
}
}
}
Contoh kode berikut menunjukkan bagaimana kode klien menggunakan kelas generik GenericList<T>
untuk membuat daftar bilangan bulat. Jika Anda mengubah argumen jenis, kode berikut membuat daftar string atau jenis kustom lainnya:
// A generic list of int.
GenericList<int> list = new();
// Add ten int values.
for (int x = 0; x < 10; x++)
{
list.AddHead(x);
}
// Write them to the console.
foreach (int i in list)
{
Console.WriteLine(i);
}
Console.WriteLine("Done");
Nota
Jenis generik tidak terbatas pada kelas. Contoh sebelumnya menggunakan jenis class
, tetapi Anda dapat menentukan jenis interface
dan struct
generik, termasuk jenis record
.
Gambaran umum generik
- Gunakan jenis generik untuk memaksimalkan penggunaan kembali kode, keamanan jenis, dan performa.
- Penggunaan generik yang paling umum adalah membuat kelas koleksi.
- Pustaka kelas .NET berisi beberapa kelas koleksi generik di System.Collections.Generic namespace. Koleksi generik harus digunakan jika memungkinkan alih-alih kelas seperti ArrayList di System.Collections namespace.
- Anda dapat membuat antarmuka generik, kelas, metode, peristiwa, dan delegasi Anda sendiri.
- Kelas generik dapat dibatasi untuk mengaktifkan akses ke metode pada jenis data tertentu.
- Anda dapat memperoleh informasi saat waktu eksekusi tentang tipe-tipe yang digunakan dalam jenis data generik dengan menggunakan refleksi.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#.