Generics C# Dijelaskan: Kode Fleksibel dan Aman Tipe untuk Setiap Tipe Data
Generics memungkinkan Anda menentukan spesifikasi tipe data elemen pemrograman dalam kelas atau metode, sampai digunakan sebenarnya dalam program. Dengan kata lain, generics memungkinkan Anda menulis kelas atau metode yang dapat bekerja dengan setiap tipe data.
Anda menulis spesifikasi untuk kelas atau metode, dengan parameter pengganti untuk tipe data. Ketika compiler menemukan konstruktor untuk kelas atau panggilan fungsi untuk metode, ia menghasilkan kode untuk menangani tipe data spesifik. Contoh sederhana akan membantu memahami konsep ini −
Live Demo
using System; using System.Collections.Generic; namespace GenericApplication { public class MyGenericArray<T> { private T[] array; public MyGenericArray(int size) { array = new T[size + 1]; } public T getItem(int index) { return array[index]; } public void setItem(int index, T value) { array[index] = value; } } class Tester { static void Main(string[] args) { //declaring an int array MyGenericArray<int> intArray = new MyGenericArray<int>(5); //setting values for (int c = 0; c < 5; c++) { intArray.setItem(c, c*5); } //retrieving the values for (int c = 0; c < 5; c++) { Console.Write(intArray.getItem(c) + " "); } Console.WriteLine(); //declaring a character array MyGenericArray<char> charArray = new MyGenericArray<char>(5); //setting values for (int c = 0; c < 5; c++) { charArray.setItem(c, (char)(c+97)); } //retrieving the values for (int c = 0; c< 5; c++) { Console.Write(charArray.getItem(c) + " "); } Console.WriteLine(); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah sebagai berikut −
0 5 10 15 20 a b c d e
Fitur Generics
Generics adalah teknik yang memperkaya program Anda dengan cara berikut −
Membantu Anda memaksimalkan penggunaan ulang kode, keamanan tipe, dan performa.
Anda dapat membuat kelas koleksi generik. Pustaka kelas .NET Framework berisi beberapa kelas koleksi generik baru dalam namespace System.Collections.Generic. Anda dapat menggunakan kelas koleksi generik ini sebagai ganti kelas koleksi dalam namespace System.Collections.
Anda dapat membuat antarmuka generik, kelas, metode, event, dan delegasi Anda sendiri.
Anda dapat membuat kelas generik yang dibatasi untuk mengaktifkan akses ke metode pada tipe data tertentu.
Anda dapat mendapatkan informasi tentang tipe yang digunakan dalam tipe data generik pada waktu eksekusi melalui refleksi.
Metode Generik
Pada contoh sebelumnya, kami telah menggunakan kelas generik; kami dapat mendeklarasikan metode generik dengan parameter tipe. Program berikut menggambarkan konsep ini −
Live Demo
using System; using System.Collections.Generic; namespace GenericMethodAppl { class Program { static void Swap<T>(ref T lhs, ref T rhs) { T temp; temp = lhs; lhs = rhs; rhs = temp; } static void Main(string[] args) { int a, b; char c, d; a = 10; b = 20; c = 'I'; d = 'V'; //display values before swap: Console.WriteLine("Int values before calling swap:"); Console.WriteLine("a = {0}, b = {1}", a, b); Console.WriteLine("Char values before calling swap:"); Console.WriteLine("c = {0}, d = {1}", c, d); //call swap Swap<int>(ref a, ref b); Swap<char>(ref c, ref d); //display values after swap: Console.WriteLine("Int values after calling swap:"); Console.WriteLine("a = {0}, b = {1}", a, b); Console.WriteLine("Char values after calling swap:"); Console.WriteLine("c = {0}, d = {1}", c, d); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah sebagai berikut −
Int values before calling swap: a = 10, b = 20 Char values before calling swap: c = I, d = V Int values after calling swap: a = 20, b = 10 Char values after calling swap: c = V, d = I
Delegasi Generik
Anda dapat mendefinisikan delegasi generik dengan parameter tipe. Misalnya −
delegate T NumberChanger<T>(T n);
Contoh berikut menunjukkan penggunaan delegasi ini −
Live Demo
using System; using System.Collections.Generic; delegate T NumberChanger<T>(T n); namespace GenericDelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { //create delegate instances NumberChanger<int> nc1 = new NumberChanger<int>(AddNum); NumberChanger<int> nc2 = new NumberChanger<int>(MultNum); //calling the methods using the delegate objects nc1(25); Console.WriteLine("Value of Num: {0}", getNum()); nc2(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah sebagai berikut −
Value of Num: 35 Value of Num: 175