C #-제네릭

Generics프로그램에서 실제로 사용될 때까지 클래스 또는 메서드에서 프로그래밍 요소의 데이터 유형 사양을 정의 할 수 있습니다. 즉, 제네릭을 사용하면 모든 데이터 유형과 함께 작동 할 수있는 클래스 또는 메서드를 작성할 수 있습니다.

데이터 유형에 대한 대체 매개 변수를 사용하여 클래스 또는 메소드에 대한 스펙을 작성합니다. 컴파일러가 클래스에 대한 생성자 또는 메서드에 대한 함수 호출을 발견하면 특정 데이터 유형을 처리하는 코드를 생성합니다. 간단한 예는 개념을 이해하는 데 도움이됩니다.

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();
      }
   }
}

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

0 5 10 15 20
a b c d e

제네릭의 특징

Generics는 다음과 같은 방식으로 프로그램을 풍부하게하는 기술입니다.

  • 코드 재사용, 형식 안전성 및 성능을 최대화하는 데 도움이됩니다.

  • 일반 컬렉션 클래스를 만들 수 있습니다. .NET Framework 클래스 라이브러리에는 System.Collections.Generic 네임 스페이스 에 몇 가지 새로운 일반 컬렉션 클래스가 포함되어 있습니다 . System.Collections 네임 스페이스 의 컬렉션 클래스 대신 이러한 제네릭 컬렉션 클래스를 사용할 수 있습니다 .

  • 고유 한 일반 인터페이스, 클래스, 메서드, 이벤트 및 대리자를 만들 수 있습니다.

  • 특정 데이터 유형의 메서드에 액세스 할 수 있도록 제한된 제네릭 클래스를 만들 수 있습니다.

  • 리플렉션을 통해 런타임에 제네릭 데이터 유형에 사용되는 유형에 대한 정보를 얻을 수 있습니다.

일반 방법

이전 예에서는 일반 클래스를 사용했습니다. 타입 매개 변수로 제네릭 메소드를 선언 할 수 있습니다. 다음 프로그램은 개념을 설명합니다-

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();
      }
   }
}

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

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

일반 대리인

형식 매개 변수를 사용하여 일반 대리자를 정의 할 수 있습니다. 예를 들면-

delegate T NumberChanger<T>(T n);

다음 예제는이 대리자의 사용을 보여줍니다-

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();
      }
   }
}

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Value of Num: 35
Value of Num: 175