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 input) { }
}
class TestGenericList
{
    private class ExampleClass { }
    static void Main()
    {
        // Declare a list of type int.
        GenericList<int> list1 = new GenericList<int>();
        list1.Add(1);

        // Declare a list of type string.
        GenericList<string> list2 = new GenericList<string>();
        list2.Add("");

        // Declare a list of type ExampleClass.
        GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
        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 Tint. 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 kelas Node 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 on T.
    private class Node
    {
        // T used in non-generic constructor.
        public Node(T t)
        {
            next = null;
            data = t;
        }

        private Node? next;
        public Node? Next
        {
            get { return next; }
            set { next = value; }
        }

        // T as private member data type.
        private T data;

        // T as return type of property.
        public T Data
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node? head;

    // constructor
    public GenericList()
    {
        head = null;
    }

    // T as method parameter type:
    public void AddHead(T t)
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }

    public IEnumerator<T> GetEnumerator()
    {
        Node? current = head;

        while (current != 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:

class TestGenericList
{
    static void Main()
    {
        // int is the type argument
        GenericList<int> list = new GenericList<int>();

        for (int x = 0; x < 10; x++)
        {
            list.AddHead(x);
        }

        foreach (int i in list)
        {
            System.Console.Write(i + " ");
        }
        System.Console.WriteLine("\nDone");
    }
}

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#.

Lihat juga