C# 델리게이트(delegate)

C# 2016. 6. 8. 16:53
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<intint> fooFunc = program.foo;
        System.Func<intboolstring> fooFunc2 = program.foo2;
 
        System.Console.WriteLine(fooFunc(3));
        System.Console.WriteLine(fooFunc2(3false));
    }
 
    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<intint> fooFunc = program.foo;
        System.Func<intboolstring> fooFunc2 = program.foo2;
 
        System.Console.WriteLine(fooFunc(3));
        System.Console.WriteLine(fooFunc2(3false));
        fooFunc2 += program.foo3;
        System.Console.WriteLine(fooFunc2(3false));
    }
 
    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
Posted by RPG만들기XP
,