대리자 비교: 명명된 메서드 및 무명 메서드(C# 프로그래밍 가이드)Delegates with Named vs. Anonymous Methods (C# Programming Guide)

대리자는 명명된 메서드에 연결할 수 있습니다.A delegate can be associated with a named method. 명명된 메서드를 사용하여 대리자를 인스턴스화하면 메서드가 매개 변수로 전달됩니다. 예를 들면 다음과 같습니다.When you instantiate a delegate by using a named method, the method is passed as a parameter, for example:

// Declare a delegate:
delegate void Del(int x);

// Define a named method:
void DoWork(int k) { /* ... */ }

// Instantiate the delegate using the method as a parameter:
Del d = obj.DoWork;

이 코드는 명명된 메서드를 사용하여 호출됩니다.This is called using a named method. 명명된 메서드를 사용하여 생성된 대리자는 정적 메서드 또는 인스턴스 메서드를 캡슐화할 수 있습니다.Delegates constructed with a named method can encapsulate either a static method or an instance method. 명명된 메서드는 이전 버전의 C#에서 대리자를 인스턴스화할 수 있는 유일한 방법입니다.Named methods are the only way to instantiate a delegate in earlier versions of C#. 그러나 새 메서드 생성이 불필요한 오버헤드인 경우 C#에서 대리자를 인스턴스화하고 호출 시 대리자에서 처리할 코드 블록을 즉시 지정할 수 있습니다.However, in a situation where creating a new method is unwanted overhead, C# enables you to instantiate a delegate and immediately specify a code block that the delegate will process when it is called. 블록에는 람다 식 또는 무명 메서드가 포함될 수 있습니다.The block can contain either a lambda expression or an anonymous method. 자세한 내용은 무명 함수를 참조하세요.For more information, see Anonymous Functions.

설명Remarks

대리자 매개 변수로 전달하는 메서드에는 대리자 선언과 동일한 시그니처가 있어야 합니다.The method that you pass as a delegate parameter must have the same signature as the delegate declaration.

대리자 인스턴스는 정적 또는 인스턴스 메서드를 캡슐화할 수 있습니다.A delegate instance may encapsulate either static or instance method.

대리자는 out 매개 변수를 사용할 수 있지만, 멀티캐스트 이벤트 대리자의 경우 호출될 대리자를 알 수 없기 때문에 사용하지 않는 것이 좋습니다.Although the delegate can use an out parameter, we do not recommend its use with multicast event delegates because you cannot know which delegate will be called.

예제 1Example 1

다음은 대리자를 선언하고 사용하는 간단한 예제입니다.The following is a simple example of declaring and using a delegate. 대리자 Del 및 연결된 메서드 MultiplyNumbers에 동일한 시그니처가 있습니다.Notice that both the delegate, Del, and the associated method, MultiplyNumbers, have the same signature

// Declare a delegate
delegate void Del(int i, double j);

class MathClass
{
    static void Main()
    {
        MathClass m = new MathClass();

        // Delegate instantiation using "MultiplyNumbers"
        Del d = m.MultiplyNumbers;

        // Invoke the delegate object.
        System.Console.WriteLine("Invoking the delegate using 'MultiplyNumbers':");
        for (int i = 1; i <= 5; i++)
        {
            d(i, 2);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }

    // Declare the associated method.
    void MultiplyNumbers(int m, double n)
    {
        System.Console.Write(m * n + " ");
    }
}
/* Output:
    Invoking the delegate using 'MultiplyNumbers':
    2 4 6 8 10
*/

예제 2Example 2

다음 예제에서는 한 대리자가 정적 메서드와 인스턴스 메서드 모두에 매핑되며 각각의 특정 정보를 반환합니다.In the following example, one delegate is mapped to both static and instance methods and returns specific information from each.

// Declare a delegate
delegate void Del();

class SampleClass
{
    public void InstanceMethod()
    {
        System.Console.WriteLine("A message from the instance method.");
    }

    static public void StaticMethod()
    {
        System.Console.WriteLine("A message from the static method.");
    }
}

class TestSampleClass
{
    static void Main()
    {
        SampleClass sc = new SampleClass();

        // Map the delegate to the instance method:
        Del d = sc.InstanceMethod;
        d();

        // Map to the static method:
        d = SampleClass.StaticMethod;
        d();
    }
}
/* Output:
    A message from the instance method.
    A message from the static method.
*/

참고 항목See also