2022. 1. 5. 22:37ㆍC#/수업 내용
--------------------본 블로그는 개인 공부 기록용이기에 잘못된 내용이 있을 확률 50000%-----------------
메서드 중 하나라도 메서드 내에서 catch되지 않은 예외를 throw하면 해당 예외가 대리자의 호출자에게 해당 예외가 전달되며 호출 목록의 후속 메서드는 호출되지 않습니다. 반환 값 및/또는 out 매개 변수를 포함하는 대리자는 마지막으로 호출한 메서드의 반환 값과 매개 변수를 반환합니다.
delegate 형식 변수에 반환값을 가진 메서드가 여럿 있을 경우 마지막 메서드의 반환값만 출력이 된다.
대리자가 참조 매개 변수를 사용하는 경우 참조는 각 3개 메서드에 순서대로 전달되며 메서드 하나의 변경 내용은 다음 메서드에도 표시됩니다
delegate 형식 변수를 호출할 때 매개변수로 값형식 변수의 참조를 넣은 다음, 동작하는 과정을 살펴보자.
같은 delegate 형식 끼리 연산이 가능하다.
Delegate1 deleg1 = new Delegate1(method1);
Delegate1 deleg2 = new Delegate1(method2);
Delegate1 deleg3 = deleg1 + deleg2;
대리자 지원
Action<인수 16개까지 지원>
Func<인수 16개까지, 반환값>
이하 수업내용 -------------------------------------------------------------------------------------
하이템플러 2개를 합쳐 아칸 하나를 만들어보자
1) delegate를 이용해서
2) System.Action을 이용해서
3) Action과 무명함수를 이용해서
>>>
1) delegate를 이용해서
using System;
using System.Collections.Generic;
using System.Text;
namespace helloworldConsoleApp1
{
class App
{
public delegate void deleg1(Archon arc);
public App()
{
deleg1 del1 = ArchonMethod1;
HighTempler ht1 = new HighTempler();
HighTempler ht2 = new HighTempler();
MergeToArchon(ref ht1, ref ht2, del1);
}
public void ArchonMethod1(Archon arc)
{
Console.WriteLine(arc);
Console.WriteLine(arc.name);
}
public void MergeToArchon(ref HighTempler ht1, ref HighTempler ht2, deleg1 archon)
{
ht1 = null;
ht2 = null;
archon(new Archon("첫번째 아칸"));
}
}
}
코드의 스토리는
1) 아콘 클래스를 매개변수로 받는 void형 델리게이트 타입 선언
2) 대리자 변수에 래핑할 용도로 아콘 클래스를 매개변수로 받는 void형 함수 선언
3) 1)에서 선언한 delegate타입으로 대리자 변수를 선언함과 동시에 2)에서 만든 함수를 래핑해 값 할당
4) 하이템플러 클래스 객체 2개와 대리자를 받은 후 그 대리자에 래핑된 함수들을 미리 지정한 매개변수로 콜백한다.
2) System.Action을 이용해서
using System;
using System.Collections.Generic;
using System.Text;
namespace helloworldConsoleApp1
{
class App
{
public Action<Archon> act1;
public App()
{
act1 = ArchonMethod1;
HighTempler ht1 = new HighTempler();
HighTempler ht2 = new HighTempler();
MergeToArchon(ref ht1, ref ht2, act1);
}
public void ArchonMethod1(Archon arc)
{
Console.WriteLine(arc);
Console.WriteLine(arc.name);
}
public void MergeToArchon(ref HighTempler ht1, ref HighTempler ht2, Action<Archon> archon)
{
ht1 = null;
ht2 = null;
archon(new Archon("첫번째 아칸"));
}
}
}
대리자를 쓴 것에서 System.Action을 쓴 것으로 바뀌었을 뿐, 실행 결과는 같다.
3) Action과 무명함수를 이용해서
using System;
using System.Collections.Generic;
using System.Text;
namespace helloworldConsoleApp1
{
class App
{
public App()
{
HighTempler ht1 = new HighTempler();
HighTempler ht2 = new HighTempler();
MergeToArchon(ref ht1, ref ht2, (x) => { Console.WriteLine(x); Console.WriteLine(x.name); });
}
public void MergeToArchon(ref HighTempler ht1, ref HighTempler ht2, Action<Archon> archon)
{
ht1 = null;
ht2 = null;
archon(new Archon("첫번째 아칸"));
}
}
}
이 코드의 실행결과 또한 위와 같다.
MergeToArchon함수를 호출할 때 매개변수로 무명함수가 들어가고,
이 무명함수는 매개변수로 들어가는 과정에서 자연스럽게 Action<Archon> 타입으로 캐스팅된다.
왜냐하면 MergeToArchon함수를 만들 때 받을 매개변수의 타입을 그렇게 지정했기 때문이다.
'C# > 수업 내용' 카테고리의 다른 글
22.01.11 싱글턴 패턴 (0) | 2022.01.11 |
---|---|
22.01.08 Dictionary 키값쌍과 JSON 연동 (0) | 2022.01.08 |
22.01.04 대리자 delegate (0) | 2022.01.04 |
22.01.03 인벤토리에서 아이템 꺼내오기, 다시 넣기 (0) | 2022.01.03 |
22.01.01 캐리어 (2) | 2022.01.01 |