C#의 메서드 그룹
- C#의 메서드 그룹
-
C#의
Delegates
-
C#에서
DELEGATE
를 사용한 메서드 그룹 변환 -
C#의 메서드 그룹에 대한 간단한 사용자 지정
Delegate
- C#에서 메서드 그룹에 함수 포인터 사용
이 문서에서는 C#의 메서드 그룹을 다룹니다.
C#의 메서드 그룹
함수에 둘 이상의 구현이 있을 수 있는 경우가 있습니다. 완전히 다른 매개변수 집합 또는 유형을 가진 다른 정의가 있을 수 있거나 일반적으로 오버로드된 함수로 알려져 있습니다.
통사론:
void print(int x) {
///...code
}
void print(int x, int y) {
///...code for x and y
}
이러한 기능이나 메서드를 METHOD GROUPS라고 합니다.
C#의 Delegates
DELEGATES
는 생성된 함수에 대한 포인터입니다. 함수를 가리키는 것과 함께 함수 및 해당 매개변수의 반환 유형도 정의합니다.
예를 들어 LAPTOP
라는 대리자는 반환 유형이 void이고 매개변수가 USERNAME
(문자열)일 수 있습니다. PC
라는 또 다른 함수가 있습니다. 이 함수도 LAPTOP
와 동일한 반환 유형 및 매개변수 유형을 가지고 있습니다.
이 시나리오에서 대리자 LAPTOP
에서 PC
를 호출할 수 있습니다.
코드 예:
delegate void LAPTOP(string username);
static void PC(string username) {
Console.WriteLine("USER: " + username + " has logged in!");
}
static void Main() {
LAPTOP lap1 = PC;
lap1("Hydrogen");
}
LAPTOP
인스턴스를 PC
로 인스턴스화했으며 나중에 호출하면 PC
메서드에서 전달된 사용자 이름을 인쇄하게 됩니다. 그것이 DELEGATES
가 작동하는 방식입니다.
C#에서 DELEGATE
를 사용한 메서드 그룹 변환
메서드 그룹의 가장 일반적인 용도 중 하나와 호출 시 처리 방법을 살펴보겠습니다. 메소드 그룹이 기본 메소드의 오버로드된 기능에 대해 논의했으며 DELEGATES
를 사용하여 메소드 그룹을 원하는 대로 사용할 수 있습니다.
이 예에서 DASHBOARD
, WHEEL
, LIGHTS
등과 같은 여러 다른 방법을 처리하려는 CAR
이라는 방법이 있다고 가정해 보겠습니다. 편의상 두 가지 방법만 사용합니다. ; LIGHTS
및 MIRRORS
.
코드 예:
delegate void CAR(bool start);
static void MIRROR(bool start) {
if (start)
Console.WriteLine("Mirror is now working!");
else
Console.WriteLine("Mirror is not stopped/closed");
}
static void LIGHTS(bool start) {
if (start)
Console.WriteLine("Lights are now working!");
else
Console.WriteLine("Lights have stopped/closed");
}
메서드를 정의했으므로 이제 MAIN
메서드를 구현해 보겠습니다. 여기에서 대리자를 사용하여 이러한 메서드 그룹을 처리합니다.
CAR car = MIRROR;
car(true);
car = LIGHTS;
car(false);
CAR
개체가 MIRROR
를 가리키는 것을 알 수 있지만 나중에는 LIGHTS
를 가리킵니다. 그런 다음 메서드를 호출하면 가리키는 함수가 호출됩니다.
함수의 이름은 car
개체에 할당됩니다. 그룹의 다른 메소드를 가리키도록 DELEGATE
포인터를 변경하는 것을 METHOD GROUP CONVERSION
이라고 하며 이 시나리오에서 LIGHTS
, MIRRORS
및 CAR
은 모두 동일한 메소드 그룹의 일부입니다.
C#의 메서드 그룹에 대한 간단한 사용자 지정 Delegate
METHOD GROUPS
를 가리킬 수 있는 DELEGATE
를 만드는 간단한 방법은 다음과 같습니다.
Func<string> f_test = "AA".ToString;
Console.WriteLine(f_test());
위를 호출하면 결과적으로 AA
문자열이 출력됩니다. F_TEST
는 ToString
메서드를 가리키고 호출합니다.
또한 이 함수는 함수 자체가 아니라 ToString
메서드의 주소를 가리키는 것을 알 수 있습니다. 이것이 포인터가 작동하는 방식입니다.
METHOD GROUPS
를 올바르게 이해하기 위해 아래에 또 다른 예가 제공되었습니다.
Func<string, int> f_test = Convert.ToInt32;
Console.WriteLine(f_test("435"));
통사론:
Func<param1, param2> name;
//param1 is the parameter passed in the function/method pointed to
//param 2 is the return type of that function/method that the delegate points to
Convert.ToInt32
는 INT
의 반환 유형과 18
다른 오버로드를 갖습니다. F_TEST
를 문자열 "435"
로 호출하고 PARAM2
를 STRING
으로 정의하기 때문에 매개변수 유형을 정의하는 것이 필수적입니다.
PARAM2
를 정의하는 것은 함수의 과부하가 하나만 있더라도 중요합니다. METHOD GROUPS
는 컴파일된 시간 구성이므로 단일 오버로드에 대해 선택해야 합니다. PARAM2
에 하나 이상의 과부하가 포함되어 있는지 확인하는 것이 중요합니다.
함수에서 List.Select(MethodGroup)
를 호출할 때 LINQ
에서 캐스트를 제거할 수도 있습니다. 이 기사는 METHOD GROUPS
에 초점을 맞추기 때문에 LINQ
컨텍스트에 대해 자세히 논의하지 않습니다.
C#에서 메서드 그룹에 함수 포인터 사용
대리자로부터 다른 기능을 가리키는 것은 METHOD GROUPS
에서 작업하는 경우에만 필요합니다. 이러한 상황에서 반환 유형과 매개변수가 일치하는지 확인해야 합니다.
C#은 이미 FUNC
키워드를 제공하여 다른 기능을 가리킬 수 있도록 합니다. 포인터가 객체와 변수의 주소를 가리킨 다음 호출하는 방식으로 작동하는 것처럼 대리자를 같은 방식으로 상상할 수 있습니다.
포인터는 또한 포인터가 주소를 지정하는 객체와 동일한 반환 유형을 갖는 경향이 있습니다. 대리자는 기능 요구 사항으로 인해 매개 변수도 처리해야 합니다.
함수를 가리키는 것은 배열에 함수를 저장하고 코드에 대해 동적으로 호출하거나 호출할 다른 함수에 함수를 전달하려는 경우에 필요합니다. LAMBDA
기능도 동일한 요구 사항을 충족합니다.
그러나 METHOD GROUPS
는 기본 반환 및 매개변수 유형을 따르는 오버로드된 함수가 있는 일반적인 클러스터입니다.
Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!
GitHub