Kelas dan metode generik
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 kelas tunggal yang dapat digunakan kode klien lain tanpa menimbulkan biaya atau risiko transmisi runtime atau operasi pengemasan, 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 koleksi dan metode yang beroperasi pada mereka. Namespace layanan System.Collections.Generic berisi beberapa kelas koleksi berbasis generik. Koleksi nongenerik, seperti ArrayList tidak direkomendasikan dan hanya dipertahankan untuk tujuan kompatibilitas. Untuk informasi selengkapnya, lihat Generik dalam .NET.
Anda juga dapat membuat jenis dan metode generik kustom untuk memberikan 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 yang List<T> disediakan oleh .NET alih-alih membuat kelas Anda sendiri.) Parameter T
jenis digunakan di beberapa lokasi di mana jenis beton biasanya akan digunakan untuk menunjukkan jenis item yang disimpan dalam daftar:
- Sebagai jenis parameter metode dalam metode
AddHead
. - Sebagai jenis pengembalian properti
Data
di kelasNode
berlapis. - Sebagai jenis anggota privat
data
di kelas berlapis.
T
tersedia untuk kelas Node
berlapis. Ketika GenericList<T>
dibuat dengan jenis beton, misalnya sebagai GenericList<int>
, setiap kemunculan 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 GenericList<T>
generik 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");
Catatan
Jenis generik tidak terbatas pada kelas. Contoh sebelumnya menggunakan class
jenis, tetapi Anda dapat menentukan jenis dan struct
generikinterface
, termasuk record
jenis.
Gambaran umum generik
- Gunakan jenis generik untuk memaksimalkan penggunaan kembali kode, keamanan jenis, dan performa.
- Penggunaan generik yang paling umum adalah untuk membuat kelas koleksi.
- Pustaka kelas .NET berisi beberapa kelas koleksi generik di namespace layanan System.Collections.Generic. Koleksi generik harus digunakan jika memungkinkan alih-alih kelas seperti ArrayList di namespace layanan System.Collections.
- 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 pada waktu proses pada jenis yang digunakan dalam jenis data generik dengan menggunakan pantulan.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#.