1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Program { delegate void FuncDelegate(); static void Main(string[] args) { Program program = new Program(); FuncDelegate fooFunc = new FuncDelegate(program.foo); FuncDelegate fooFunc2 = program.foo; fooFunc(); fooFunc2(); } void foo() { Console.WriteLine("Hello, World!"); } } | cs |
실행 결과:
Hello, World!
Hello, World!
C++에서의 std::function처럼 사용할 수 있다.
C# 1.0에서는 FuncDelegate fooFunc = new FuncDelegate(program.foo); 형태로 다소 복잡하게 사용하여야 했지만,
C# 2.0부터는 FuncDelegate fooFunc2 = program.foo; 형태로 쉽게 사용할 수 있다.
따라서 7,8번 라인은 동일한 역할을 수행하며, 9,10번 라인도 동일한 역할을 수행한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class Program { static void Main(string[] args) { Program program = new Program(); System.Func<int, int> fooFunc = program.foo; System.Func<int, bool, string> fooFunc2 = program.foo2; System.Console.WriteLine(fooFunc(3)); System.Console.WriteLine(fooFunc2(3, false)); } int foo(int var) { return 2 * var; } string foo2(int var1, bool var2) { return var1.ToString() + var2.ToString(); } } | cs |
실행 결과 :
6
3False
System.Func<>를 이용하면 더 편리하게 사용할 수 있다.
하지만 반환값이 void인 메소드는 System.Func<>를 이용할 수 없다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class Program { static void Main(string[] args) { Program program = new Program(); System.Func<int, int> fooFunc = program.foo; System.Func<int, bool, string> fooFunc2 = program.foo2; System.Console.WriteLine(fooFunc(3)); System.Console.WriteLine(fooFunc2(3, false)); fooFunc2 += program.foo3; System.Console.WriteLine(fooFunc2(3, false)); } int foo(int var) { return 2 * var; } string foo2(int var1, bool var2) { return var1.ToString() + var2.ToString(); } string foo3(int var1, bool var2) { return var1.ToString() + var2.ToString() + "here is foo3"; } } | cs |
실행 결과 :
6
3False
3Falsehere is foo3
여러 메소드를 조합해서 하나의 delegate로 만들 수도 있다.
내부적으로 Combine()을 이용해 동작하며, 조합한 순서대로 호출 순서가 보장된다.
'C#' 카테고리의 다른 글
C# 인터페이스 - IEnumerable, IEnumerator 인터페이스 (0) | 2016.06.09 |
---|---|
C# 인터페이스(interface) (0) | 2016.06.09 |
C# 추상 클래스 (0) | 2016.06.08 |
C# 연산자 오버로딩 (0) | 2016.06.08 |
C# 클래스 - Object 클래스 (0) | 2016.06.08 |