Action<T1,T2,T3> 대리자

정의

매개 변수가 3개이고 값을 반환하지 않는 메서드를 캡슐화합니다.Encapsulates a method that has three parameters and does not return a value.

generic <typename T1, typename T2, typename T3>
public delegate void Action(T1 arg1, T2 arg2, T3 arg3);
public delegate void Action<in T1,in T2,in T3>(T1 arg1, T2 arg2, T3 arg3);
public delegate void Action<T1,T2,T3>(T1 arg1, T2 arg2, T3 arg3);
type Action<'T1, 'T2, 'T3> = delegate of 'T1 * 'T2 * 'T3 -> unit
Public Delegate Sub Action(Of In T1, In T2, In T3)(arg1 As T1, arg2 As T2, arg3 As T3)
Public Delegate Sub Action(Of T1, T2, T3)(arg1 As T1, arg2 As T2, arg3 As T3)

형식 매개 변수

T1

이 대리자로 캡슐화되는 메서드의 첫 번째 매개 변수 형식입니다.The type of the first parameter of the method that this delegate encapsulates.

이 형식 매개 변수는 반공변(Contravariant)입니다. 즉, 지정한 형식이나 더 적게 파생된 모든 형식을 사용할 수 있습니다. 공변성(Covariance) 및 반공변성(Contravariance)에 대한 자세한 내용은 제네릭의 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.
T2

이 대리자로 캡슐화되는 메서드의 두 번째 매개 변수 형식입니다.The type of the second parameter of the method that this delegate encapsulates.

이 형식 매개 변수는 반공변(Contravariant)입니다. 즉, 지정한 형식이나 더 적게 파생된 모든 형식을 사용할 수 있습니다. 공변성(Covariance) 및 반공변성(Contravariance)에 대한 자세한 내용은 제네릭의 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.
T3

이 대리자로 캡슐화되는 메서드의 세 번째 매개 변수 형식입니다.The type of the third parameter of the method that this delegate encapsulates.

이 형식 매개 변수는 반공변(Contravariant)입니다. 즉, 지정한 형식이나 더 적게 파생된 모든 형식을 사용할 수 있습니다. 공변성(Covariance) 및 반공변성(Contravariance)에 대한 자세한 내용은 제네릭의 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.

매개 변수

arg1
T1

이 대리자로 캡슐화되는 메서드의 첫 번째 매개 변수입니다.The first parameter of the method that this delegate encapsulates.

arg2
T2

이 대리자로 캡슐화되는 메서드의 두 번째 매개 변수입니다.The second parameter of the method that this delegate encapsulates.

arg3
T3

이 대리자로 캡슐화되는 메서드의 세 번째 매개 변수입니다.The third parameter of the method that this delegate encapsulates.

설명

대리자를 사용 하 여 Action<T1,T2,T3> 사용자 지정 대리자를 명시적으로 선언 하지 않고 메서드를 매개 변수로 전달할 수 있습니다.You can use the Action<T1,T2,T3> delegate to pass a method as a parameter without explicitly declaring a custom delegate. 캡슐화 된 메서드에이 대리자에 의해 정의 되는 메서드 시그니처와 일치 해야 합니다.The encapsulated method must correspond to the method signature that is defined by this delegate. 즉, 캡슐화 된 메서드에는 모두 값으로 전달 되는 세 개의 매개 변수가 있어야 하 고 값을 반환 하지 않아야 합니다.This means that the encapsulated method must have three parameters that are all passed to it by value, and it must not return a value. (C#에서는 메서드 반환 해야 void합니다.(In C#, the method must return void. Visual Basic의 경우에서 정의 되어야 합니다는 Sub...End SubIn Visual Basic, it must be defined by the SubEnd Sub 구문입니다.construct. 또한 수 무시 되는 값을 반환 하는 메서드입니다.) 일반적으로 이러한 메서드는 작업을 수행 하는 합니다.It can also be a method that returns a value that is ignored.) Typically, such a method is used to perform an operation.

참고

3 개의 매개 변수가 있으며 값을 반환 하는 메서드를 참조 하려면 제네릭 Func<T1,T2,T3,TResult> 대리자를 대신 사용 합니다.To reference a method that has three parameters and returns a value, use the generic Func<T1,T2,T3,TResult> delegate instead.

대리자를 사용 하는 경우 Action<T1,T2,T3> 세 개의 매개 변수를 사용 하 여 메서드를 캡슐화 하는 대리자를 명시적으로 정의할 필요가 없습니다.When you use the Action<T1,T2,T3> delegate, you do not have to explicitly define a delegate that encapsulates a method with three parameters. 예를 들어 다음 코드는 라는 대리자를 명시적으로 선언 하 StringCopy 고 메서드에 대 한 참조를 CopyStrings 해당 대리자 인스턴스에 할당 합니다.For example, the following code explicitly declares a delegate named StringCopy and assigns a reference to the CopyStrings method to its delegate instance.

using System;

delegate void StringCopy(string[] stringArray1,
                         string[] stringArray2,
                         int indexToStart);

public class TestDelegate
{
   public static void Main()
   {
      string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth"};
      string[] copiedOrdinals = new string[ordinals.Length];
      StringCopy copyOperation = CopyStrings;
      copyOperation(ordinals, copiedOrdinals, 3);
      foreach (string ordinal in copiedOrdinals)
         Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
   }

   private static void CopyStrings(string[] source, string[] target, int startPos)
   {
      if (source.Length != target.Length)
         throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

      for (int ctr = startPos; ctr <= source.Length - 1; ctr++)
         target[ctr] = String.Copy(source[ctr]);
   }
}
Delegate Sub StringCopy(stringArray1() As String, _
                        stringArray2() As String, _
                        indexToStart As Integer)

Module TestDelegate
   Public Sub Main()
      Dim ordinals() As String = {"First", "Second", "Third", "Fourth", "Fifth"}
      Dim copiedOrdinals(ordinals.Length - 1) As String
      Dim copyOperation As StringCopy = AddressOf CopyStrings
      copyOperation(ordinals, copiedOrdinals, 3)
      For Each ordinal As String In copiedOrdinals
         Console.WriteLine(ordinal)
      Next    
   End Sub
   
   Private Sub CopyStrings(source() As String, target() As String, startPos As Integer)
      If source.Length <> target.Length Then 
         Throw New IndexOutOfRangeException("The source and target arrays must have the same number of elements.")
      End If
      For ctr As Integer = startPos to source.Length - 1
         target(ctr) = String.Copy(source(ctr))
      Next
   End Sub
End Module

다음 예제에서는 인스턴스화하여이 코드를 간소화는 Action<T1,T2,T3> 명시적으로 새 대리자를 정의 하 고 명명된 된 메서드를 할당 하는 대신 대리자입니다.The following example simplifies this code by instantiating the Action<T1,T2,T3> delegate instead of explicitly defining a new delegate and assigning a named method to it.

using System;

public class TestAction3
{
   public static void Main()
   {
      string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth"};
      string[] copiedOrdinals = new string[ordinals.Length];
      Action<string[], string[], int> copyOperation = CopyStrings;
      copyOperation(ordinals, copiedOrdinals, 3);
      foreach (string ordinal in copiedOrdinals)
         Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
   }

   private static void CopyStrings(string[] source, string[] target, int startPos)
   {
      if (source.Length != target.Length)
         throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

      for (int ctr = startPos; ctr <= source.Length - 1; ctr++)
         target[ctr] = String.Copy(source[ctr]);
   }
}
Module TestAction3
   Public Sub Main()
      Dim ordinals() As String = {"First", "Second", "Third", "Fourth", "Fifth"}
      Dim copiedOrdinals(ordinals.Length - 1) As String
      Dim copyOperation As Action(Of String(), String(), Integer) = AddressOf CopyStrings
      copyOperation(ordinals, copiedOrdinals, 3)
      For Each ordinal As String In copiedOrdinals
         Console.WriteLine(ordinal)
      Next    
   End Sub
   
   Private Sub CopyStrings(source() As String, target() As String, startPos As Integer)
      If source.Length <> target.Length Then 
         Throw New IndexOutOfRangeException("The source and target arrays must have the same number of elements.")
      End If
      For ctr As Integer = startPos to source.Length - 1
         target(ctr) = String.Copy(source(ctr))
      Next
   End Sub
End Module

사용할 수도 있습니다는 Action<T1,T2,T3> 다음 예제와 같이 C#에서는 무명 메서드로 위임 합니다.You can also use the Action<T1,T2,T3> delegate with anonymous methods in C#, as the following example illustrates. (소개 무명 메서드를 참조 하세요 무명 메서드.)(For an introduction to anonymous methods, see Anonymous Methods.)

using System;

public class TestAnon
{
   public static void Main()
   {
      string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth"};
      string[] copiedOrdinals = new string[ordinals.Length];
      Action<string[], string[], int> copyOperation = delegate(string[] s1,
                                                               string[] s2,
                                                               int pos)
                                      { CopyStrings(s1, s2, pos); };
      copyOperation(ordinals, copiedOrdinals, 3);
      foreach (string ordinal in copiedOrdinals)
         Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
   }

   private static void CopyStrings(string[] source, string[] target, int startPos)
   {
      if (source.Length != target.Length)
         throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

      for (int ctr = startPos; ctr <= source.Length - 1; ctr++)
         target[ctr] = String.Copy(source[ctr]);
   }
}

람다 식을 할당할 수도 있습니다는 Action<T1,T2,T3> 다음 예제와 같이 인스턴스를 위임 합니다.You can also assign a lambda expression to an Action<T1,T2,T3> delegate instance, as the following example illustrates. (람다 식에 대 한 소개를 참조 하세요 람다 식.)(For an introduction to lambda expressions, see Lambda Expressions.)

using System;

public class TestLambda
{
   public static void Main()
   {
      string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth"};
      string[] copiedOrdinals = new string[ordinals.Length];
      Action<string[], string[], int> copyOperation = (s1, s2, pos) =>
                                      CopyStrings(s1, s2, pos);
      copyOperation(ordinals, copiedOrdinals, 3);
      foreach (string ordinal in copiedOrdinals)
         Console.WriteLine(ordinal == string.Empty ? "<None>" : ordinal);
   }

   private static void CopyStrings(string[] source, string[] target, int startPos)
   {
      if (source.Length != target.Length)
         throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");

      for (int ctr = startPos; ctr <= source.Length - 1; ctr++)
         target[ctr] = String.Copy(source[ctr]);
   }
}
Public Module TestLambda
   Public Sub Main()
      Dim ordinals() As String = {"First", "Second", "Third", "Fourth", "Fifth"}
      Dim copiedOrdinals(ordinals.Length - 1) As String           
      Dim copyOperation As Action(Of String(), String(), Integer) = _
                           Sub(s1, s2, pos) CopyStrings(s1, s2, pos) 
      copyOperation(ordinals, copiedOrdinals, 3)
      For Each ordinal As String In copiedOrdinals
         If String.IsNullOrEmpty(ordinal) Then
            Console.WriteLine("<None>")
         Else
            Console.WriteLine(ordinal)
         End If      
      Next   
   End Sub

   Private Function CopyStrings(source() As String, target() As String, startPos As Integer) As Integer
      If source.Length <> target.Length Then 
         Throw New IndexOutOfRangeException("The source and target arrays must have the same number of elements.")
      End If
      
      For ctr As Integer = startPos To source.Length - 1 
         target(ctr) = String.Copy(source(ctr))
      Next
      Return source.Length - startPos 
   End Function
End Module
' The example displays the following output:
'       Fourth
'       Fifth

확장 메서드

GetMethodInfo(Delegate)

지정된 대리자가 나타내는 메서드를 나타내는 개체를 가져옵니다.Gets an object that represents the method represented by the specified delegate.

적용 대상

추가 정보