무명 메서드(C# 프로그래밍 가이드)Anonymous Methods (C# Programming Guide)

2.0 이전의 C# 버전에서 delegate를 선언하는 유일한 방법은 명명된 메서드를 사용하는 것이었습니다.In versions of C# before 2.0, the only way to declare a delegate was to use named methods. C# 2.0에서는 무명 메서드가 도입되었고, C# 3.0 이상에서는 람다 식이 인라인 코드를 작성하는 기본 방법으로 무명 메서드를 대체합니다.C# 2.0 introduced anonymous methods and in C# 3.0 and later, lambda expressions supersede anonymous methods as the preferred way to write inline code. 그러나 이 항목의 무명 메서드 관련 정보는 람다 식에도 적용됩니다.However, the information about anonymous methods in this topic also applies to lambda expressions. 무명 메서드가 람다 식에서 찾을 수 없는 기능을 제공하는 한 가지 경우가 있습니다.There is one case in which an anonymous method provides functionality not found in lambda expressions. 무명 메서드를 사용하여 매개 변수 목록을 생략할 수 있습니다.Anonymous methods enable you to omit the parameter list. 즉, 무명 메서드를 여러 시그니처를 가진 대리자로 변환할 수 있습니다.This means that an anonymous method can be converted to delegates with a variety of signatures. 람다 식에서는 이 작업이 불가능합니다.This is not possible with lambda expressions. 람다 식에 대한 자세한 내용은 람다 식을 참조하세요.For more information specifically about lambda expressions, see Lambda Expressions.

무명 메서드를 만드는 것은 기본적으로 코드 블록을 대리자 매개 변수로 전달하는 방법 중 하나입니다.Creating anonymous methods is essentially a way to pass a code block as a delegate parameter. 다음 두 가지 예제를 살펴보세요.Here are two examples:

// Create a handler for a click event.
button1.Click += delegate(System.Object o, System.EventArgs e)
                   { System.Windows.Forms.MessageBox.Show("Click!"); };
// Create a delegate.
delegate void Del(int x);

// Instantiate the delegate using an anonymous method.
Del d = delegate(int k) { /* ... */ };

무명 메서드를 사용하면 별도 메서드를 만들 필요가 없기 때문에 대리자를 인스턴스화하는 코딩 오버헤드가 줄어듭니다.By using anonymous methods, you reduce the coding overhead in instantiating delegates because you do not have to create a separate method.

예를 들어 메서드를 만드는 것이 불필요한 오버헤드처럼 보일 수도 있는 경우 대리자 대신 코드 블록을 지정하는 것이 유용할 수 있습니다.For example, specifying a code block instead of a delegate can be useful in a situation when having to create a method might seem an unnecessary overhead. 좋은 예로 새 스레드를 시작하는 경우를 들 수 있습니다.A good example would be when you start a new thread. 이 클래스는 스레드를 만들며, 대리자에 대한 추가 메서드를 만들지 않고 스레드에서 실행하는 코드도 포함합니다.This class creates a thread and also contains the code that the thread executes without creating an additional method for the delegate.

void StartThread()
{
    System.Threading.Thread t1 = new System.Threading.Thread
      (delegate()
            {
                System.Console.Write("Hello, ");
                System.Console.WriteLine("World!");
            });
    t1.Start();
}

주의Remarks

무명 메서드의 매개 변수 범위는 무명 메서드 블록입니다.The scope of the parameters of an anonymous method is the anonymous-method-block.

대상이 블록 외부에 있을 경우 goto, break, continue 등의 점프 문을 무명 메서드 블록 내부에 사용하는 것은 오류입니다.It is an error to have a jump statement, such as goto, break, or continue, inside the anonymous method block if the target is outside the block. 대상이 블록 내부에 있을 경우 goto, break, continue 등의 점프 문을 무명 메서드 블록 외부에 사용하는 것도 오류입니다.It is also an error to have a jump statement, such as goto, break, or continue, outside the anonymous method block if the target is inside the block.

범위에 무명 메서드 선언이 포함된 지역 변수 및 매개 변수를 무명 메서드의 외부 변수라고 합니다.The local variables and parameters whose scope contains an anonymous method declaration are called outer variables of the anonymous method. 예를 들어 다음 코드 세그먼트에서 n은 외부 변수입니다.For example, in the following code segment, n is an outer variable:

int n = 0;
Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };

외부 변수 n에 대한 참조는 대리자를 만들 때 캡처됩니다.A reference to the outer variable n is said to be captured when the delegate is created. 지역 변수와 달리 캡처된 변수의 수명은 무명 메서드를 참조하는 대리자가 가비지 수집에 적격할 때까지 연장됩니다.Unlike local variables, the lifetime of a captured variable extends until the delegates that reference the anonymous methods are eligible for garbage collection.

무명 메서드는 외부 범위의 in, ref 또는 out 매개 변수에 액세스할 수 없습니다.An anonymous method cannot access the in, ref or out parameters of an outer scope.

안전하지 않은 코드는 무명 메서드 블록 내에서 액세스할 수 없습니다.No unsafe code can be accessed within the anonymous-method-block.

is 연산자의 왼쪽에는 무명 메서드를 사용할 수 없습니다.Anonymous methods are not allowed on the left side of the is operator.

예제Example

다음 예제에서는 대리자를 인스턴스화하는 다음 두 가지 방법을 보여 줍니다.The following example demonstrates two ways of instantiating a delegate:

  • 무명 메서드에 대리자 연결Associating the delegate with an anonymous method.

  • 명명된 메서드(DoWork)에 대리자 연결Associating the delegate with a named method (DoWork).

각각의 경우 대리자를 호출할 때 메시지가 표시됩니다.In each case, a message is displayed when the delegate is invoked.

// Declare a delegate.
delegate void Printer(string s);

class TestClass
{
    static void Main()
    {
        // Instantiate the delegate type using an anonymous method.
        Printer p = delegate(string j)
        {
            System.Console.WriteLine(j);
        };

        // Results from the anonymous delegate call.
        p("The delegate using the anonymous method is called.");

        // The delegate instantiation using a named method "DoWork".
        p = DoWork;

        // Results from the old style delegate call.
        p("The delegate using the named method is called.");
    }

    // The method associated with the named delegate.
    static void DoWork(string k)
    {
        System.Console.WriteLine(k);
    }
}
/* Output:
    The delegate using the anonymous method is called.
    The delegate using the named method is called.
*/

참고 항목See also