C # - Generik

Genericsmemungkinkan Anda untuk menentukan spesifikasi tipe data elemen pemrograman di kelas atau metode, hingga benar-benar digunakan dalam program. Dengan kata lain, obat generik memungkinkan Anda untuk menulis kelas atau metode yang dapat bekerja dengan tipe data apa pun.

Anda menulis spesifikasi untuk kelas atau metode, dengan parameter pengganti untuk tipe data. Ketika kompilator menemukan konstruktor untuk kelas atau panggilan fungsi untuk metode tersebut, ia menghasilkan kode untuk menangani tipe data tertentu. Contoh sederhana akan membantu memahami konsep -

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 dijalankan, itu menghasilkan hasil sebagai berikut -

0 5 10 15 20
a b c d e

Fitur Generik

Generik adalah teknik yang memperkaya program Anda dengan cara berikut -

  • Ini membantu Anda memaksimalkan penggunaan ulang kode, keamanan jenis, dan kinerja.

  • Anda dapat membuat kelas koleksi umum. Pustaka kelas .NET Framework berisi beberapa kelas koleksi generik baru di ruang nama System.Collections.Generic . Anda dapat menggunakan kelas koleksi generik ini daripada kelas koleksi di ruang nama System.Collections .

  • Anda dapat membuat antarmuka, kelas, metode, acara, dan delegasi generik Anda sendiri.

  • Anda dapat membuat kelas generik yang dibatasi untuk mengaktifkan akses ke metode pada tipe data tertentu.

  • Anda mungkin mendapatkan informasi tentang tipe yang digunakan dalam tipe data generik pada waktu proses melalui refleksi.

Metode Generik

Dalam contoh sebelumnya, kami telah menggunakan kelas generik; kita dapat mendeklarasikan metode umum dengan parameter tipe. Program berikut menggambarkan konsep -

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 dijalankan, itu menghasilkan hasil 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 Umum

Anda dapat menentukan delegasi umum dengan parameter tipe. Misalnya -

delegate T NumberChanger<T>(T n);

Contoh berikut menunjukkan penggunaan delegasi ini -

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 dijalankan, itu menghasilkan hasil sebagai berikut -

Value of Num: 35
Value of Num: 175