대리자 Action, Func 프로그래밍/C#2016. 7. 8. 18:42
대리자 Action, Func
https://msdn.microsoft.com/ko-kr/library/system(v=vs.110).aspx
대리자 | 설명 | |
---|---|---|
![]() | Action | 매개 변수가 없으며 값을 반환하지 않는 메서드를 캡슐화합니다. |
![]() | Action<T> | 매개 변수가 하나이고 값을 반환하지 않는 메서드를 캡슐화합니다. 이 유형에 대 한.NET Framework 소스 코드를 찾아보려면 참조는 Reference Source합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> | 10 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> | 11 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> | 12 개의 매개 변수가 있으며 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> | 13 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> | 14 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> | 15 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> | 16 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다. |
![]() | Action<T1, T2> | 2개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다. |
![]() | Action<T1, T2, T3> | 3개의 매개 변수가 있으며 반환하지 않는 메서드를 캡슐화합니다. |
![]() | Action<T1, T2, T3, T4> | 4개의 매개 변수가 있으며 반환하지 않는 메서드를 캡슐화합니다. |
![]() | Action<T1, T2, T3, T4, T5> | 5개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6> | 6개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7> | 7개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7, T8> | 8개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다. |
![]() | Action<T1, T2, T3, T4, T5, T6, T7, T8, T9> | 9개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다. |
![]() | AppDomainInitializer | 응용 프로그램 도메인이 초기화 될 때 호출할 콜백 메서드를 나타냅니다. |
![]() | AssemblyLoadEventHandler | 처리 하는 메서드를 나타내는 AssemblyLoad 의 이벤트는 AppDomain합니다. |
![]() | AsyncCallback | 해당 비동기 작업을 완료할 때 호출되는 메서드를 참조합니다. |
![]() | Comparison<T> | 동일한 형식의 두 개체를 비교하는 메서드를 나타냅니다. |
![]() | ConsoleCancelEventHandler | CancelKeyPress의 System.Console 이벤트를 처리할 메서드를 나타냅니다. |
![]() | Converter<TInput, TOutput> | 개체의 형식을 다른 형식으로 변환 하는 메서드를 나타냅니다. |
![]() | CrossAppDomainDelegate | 사용 하는 DoCallBack 대 한 응용 프로그램 간 도메인 호출 합니다. |
![]() | EventHandler | 이벤트 데이터가 없는 이벤트를 처리할 메서드를 나타냅니다. |
![]() | EventHandler<TEventArgs> | 이벤트에서 데이터를 제공하는 경우 이벤트를 처리할 메서드를 나타냅니다. |
![]() | Func<TResult> | 매개 변수가 없으며 TResult 매개 변수에서 지정한 형식의 값을 반환하는 메서드를 캡슐화합니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult> | 9 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult> | 10 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는TResult 매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TResult> | 11 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TResult> | 12 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TResult> | 13 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TResult> | 14 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult> | 15 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult> | 매개 변수가 16 개이고 하 여 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다. |
![]() | Func<T, TResult> | 매개 변수가 하나이고 TResult 매개 변수에 지정된 형식의 값을 반환하는 메서드를 캡슐화합니다. 이 유형에 대 한.NET Framework 소스 코드를 찾아보려면 참조는 Reference Source합니다. |
![]() | Func<T1, T2, TResult> | 2개의 매개 변수가 있으며 TResult 매개 변수에서 지정한 형식의 값을 반환하는 메서드를 캡슐화합니다. |
![]() | Func<T1, T2, T3, TResult> | 3개의 매개 변수가 있으며 TResult 매개 변수에서 지정한 형식의 값을 반환하는 메서드를 캡슐화합니다. |
![]() | Func<T1, T2, T3, T4, TResult> | 4개의 매개 변수가 있으며 TResult 매개 변수에서 지정한 형식의 값을 반환하는 메서드를 캡슐화합니다. |
![]() | Func<T1, T2, T3, T4, T5, TResult> | 5 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, TResult> | 6 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, TResult> | 7 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다. |
![]() | Func<T1, T2, T3, T4, T5, T6, T7, T8, TResult> | 8 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다. |
Action 대리자
1. 매개 변수가 없고 값을 반환하지 않는 메서드를 캡슐화합니다.
<구문>
public delegate void Action()
<설명>
1. 이 대리자를 사용하면 사용자 지정 대리자를 명시적으로 선언하지 않고 메서드를 매개변수에 전달할 수 있습니다.
2. 캡슐화된 메서드는 이 대리자에 의해 정의된 메서드 시그니처와 일치해야(correspond to) 합니다.
3. 즉, 캡슐화된 메서드가 매개 변수가 없고 반환 값이 없어야 합니다.
4. C#의 경우 이 메서드는 void를 반환해야 합니다.
5. 비주얼 베이직의 경우 Sub...End Sub 구문을 사용하여 정의해야 합니다.
6. 무시되는 값을 반환하는 메서드일 수도 있습니다.
7. 일반적으로(Typically) 이러한 메서드는 작업(a operation)을 수행하는 데 사용됩니다.
![]() |
---|
매개 변수가 없고 값을 반환하는 메서드를 참조하려면 제네릭 Func<TResult> 대리자를 대신 사용합니다. |
8. Action 대리자를 사용하는 경우에는 매개 변수가 없는 프로시저를 캡슐화하는 대리자를 명시적으로 정의할 필요가 없습니다.
9. 예를 들어 다음 코드에서는 ShowValue라는 대리자를 명시적으로 선언하고 Name.DisplayToWindow 인스턴스 메서드에 대한 참조를 해당 대리자 인스턴스에 할당합니다.
using System; using System.Windows.Forms; public delegate void ShowValue(); public class Name { private string instanceName; public Name(string name) { this.instanceName = name; } public void DisplayToConsole() { Console.WriteLine(this.instanceName); } public void DisplayToWindow() { MessageBox.Show(this.instanceName); } } public class testTestDelegate { public static void Main() { Name testName = new Name("Koani"); ShowValue showMethod = testName.DisplayToWindow; showMethod(); } }
10. 다음 예제에서는 새 대리자를 명시적으로 명명된 메서드를 할당하는 대신 Action 대리자를 인스턴스화하여 이 코드를 간소화합니다(simplify).
using System; using System.Windows.Forms; public class Name { private string instanceName; public Name(string name) { this.instanceName = name; } public void DisplayToConsole() { Console.WriteLine(this.instanceName); } public void DisplayToWindow() { MessageBox.Show(this.instanceName); } } public class testTestDelegate { public static void Main() { Name testName = new Name("Koani"); Action showMethod = testName.DisplayToWindow; showMethod(); } }
11. C#에서는 다음 에제와 같이 Action 대리자를 무명 메서드와 함께 사용할 수도 있습니다.
12. 무명 메서드에 대한 소개는 무명 메서드(C# 프로그래밍 가이드)를 참조하십시오.
using System; using System.Windows.Forms; public class Name { private string instanceName; public Name(string name) { this.instanceName = name; } public void DisplayToConsole() { Console.WriteLine(this.instanceName); } public void DisplayToWindow() { MessageBox.Show(this.instanceName); } } public class Anonymous { public static void Main() { Name testName = new Name("Koani"); Action showMethod = delegate() { testName.DisplayToWindow();} ; showMethod(); } }
13. 다음 예제와 같이 Action 대리자 인스턴스에 람다 식을 할당할 수도 있습니다.
14. 람다 식에 대한 소개는 람다 식(C# 프로그래밍 가이드)를 참조하십시오.
using System; using System.Windows.Forms; public class Name { private string instanceName; public Name(string name) { this.instanceName = name; } public void DisplayToConsole() { Console.WriteLine(this.instanceName); } public void DisplayToWindow() { MessageBox.Show(this.instanceName); } } public class LambdaExpression { public static void Main() { Name testName = new Name("Koani"); Action showMethod = () => testName.DisplayToWindow(); showMethod(); } }
Func<TResult> 대리자
1. 매개 변수가 없고 TResult 매개 변수에 지정된 형식의 값을 반환하는 메서드를 캡슐화합니다.
<구문>
public delegate TResult Func<out TResult>()
<반환 값>
이 대리자로 캡슐화되는 메서드의 반환 값입니다.
<형식 매개 변수>
이 대리자로 캡슐화되는 메서드의 반환 값 형식입니다.
<설명>
1. 이 대리자를 사용하면 사용자 지정 대리자를 명시적으로 선언하지 않고 매개 변수로 전달할 수 있는 메서드를 나타낼 수 있습니다.
2. 캡슐화된 메서드는 이 대리자에 의해 정의되는 메서드 시그니처와 일치해야 합니다.
3. 즉, 캡슐화된 메서드에는 매개 변수가 없어야 하고 값을 반환해야 합니다.
![]() |
---|
매개 변수가 없고 void(Visual Basic의 경우 Function이 아니라 Sub로 선언됨)를 반환하는 메서드를 참조하려면 Action 대리자를 대신 사용합니다. |
4. Func<TResult> 대리자를 사용하는 경우에는 매개 변수가 없는 메서드를 캡슐화하는 대리자를 명시적으로 정의할 필요가 없습니다.
5. 예를 들어, 다음 코드에서는 WriteMethod라는 대리자를명시적으로 선언하고 OutputTarget.SendToFile 인스턴스 메서드에 대한 참조를 해당 대리자 인스턴스에 할당합니다.
using System; using System.IO; delegate bool WriteMethod(); public class TestDelegate { public static void Main() { OutputTarget output = new OutputTarget(); WriteMethod methodCall = output.SendToFile; if (methodCall()) Console.WriteLine("Success!"); else Console.WriteLine("File write operation failed."); } } public class OutputTarget { public bool SendToFile() { try { string fn = Path.GetTempFileName(); StreamWriter sw = new StreamWriter(fn); sw.WriteLine("Hello, World!"); sw.Close(); return true; } catch { return false; } } }
6. 다음 예제에서는 새 대리자를 명시적으로 정의하고 명명된 메서드를 할당하는 대신 Func<TResult> 대리자를 인스턴스화하여 이 코드를 간소화합니다.
using System; using System.IO; public class TestDelegate { public static void Main() { OutputTarget output = new OutputTarget(); Func<bool> methodCall = output.SendToFile; if (methodCall()) Console.WriteLine("Success!"); else Console.WriteLine("File write operation failed."); } } public class OutputTarget { public bool SendToFile() { try { string fn = Path.GetTempFileName(); StreamWriter sw = new StreamWriter(fn); sw.WriteLine("Hello, World!"); sw.Close(); return true; } catch { return false; } } }
7. C#에서는 다음 예제와 같이 Func<TResult> 대리자를 무명 메서드와 함께 사용할 수 있습니다.
8. 무명 메서드에 대한 소개는 무명 메서드(C#)를 참조하십시오.
using System; using System.IO; public class Anonymous { public static void Main() { OutputTarget output = new OutputTarget(); Func<bool> methodCall = delegate() { return output.SendToFile(); }; if (methodCall()) Console.WriteLine("Success!"); else Console.WriteLine("File write operation failed."); } } public class OutputTarget { public bool SendToFile() { try { string fn = Path.GetTempFileName(); StreamWriter sw = new StreamWriter(fn); sw.WriteLine("Hello, World!"); sw.Close(); return true; } catch { return false; } } }
9. 다음 에제와 같이 Func<TResult> 대리자에 람다 식을 할당할 수도 있습니다.
10. 람다 식에 대한 소개는 람다 식(비주얼 베이직) 및 식 람다(C#)를 참조하십시오.
using System; using System.IO; public class Anonymous { public static void Main() { OutputTarget output = new OutputTarget(); Func<bool> methodCall = () => output.SendToFile(); if (methodCall()) Console.WriteLine("Success!"); else Console.WriteLine("File write operation failed."); } } public class OutputTarget { public bool SendToFile() { try { string fn = Path.GetTempFileName(); StreamWriter sw = new StreamWriter(fn); sw.WriteLine("Hello, World!"); sw.Close(); return true; } catch { return false; } } }
11. 람다 식의 내부 형식(The underlying type)은 제네릭 Func 대리자 중 하나입니다.
12. 이를 통해 람다 식을 대리자에 명시적으로 할당하지 않고 매개 변수로 전달할 수 있습니다.
13. 특히(In particular), System.Linq 네임스페이스에 있는 형식의 많은 메서드는 Func 매개 변수를 가지므로, Func 대리자를 명시적으로 인스턴스화하지 않고도 이러한 메서드에 람다 식을 전달할 수 있습니다.
14. 계산이 매우 복잡하여(an expensive computation) 결과가 실제로 필요한 경우에만 계산을 실행하려는 경우 이러한 함수를 Func<TResult> 대리자에 할당합니다.
15. 그러면 계산이 해당 값에 액세스하는 속성이 식에서 사용될 때까지 함수의 실행을 지연할 수 있습니다.
16. 다음 단원의 예제에서는 이러한 방법을 보여 줍니다.
<예제>
1. 다음 예제에서는 매개 변수가 없는 대리자를 사용하는 방법을 보여 줍니다.
2. 이 코드에서는 Func<TResult> 형식의 필드가 있는 LazyValue라는 제네릭 클래스를 만듭니다.
3. 이 대리자 필드에는 LazyValue 객체의 형식 매개 변수와 일치하는 형식의 값을 반환하는 모든 함수에 대한 참조가 저장될 수 있습니다.
4. LazyValue 형식에는 함수가 아직 실행되지 않은 경우 함수를 실행하고 결과 값을 반환하는 Value 속성도 있습니다.
5. 이 에제에서는 두 가지 메서드를 만들고 이러한 메서드를 호출하는 람다 식이 있는 LazyValue 개체 두 개를 인스턴스화합니다.
6. 이 람다 식은 메서드를 호출하기만 하므로 매개 변수가 없습니다.
7. 출력을 통해 확인할 수 있듯이 두 메서드는 각 LazyValue 객체의 값을 검색할 때만 실행됩니다.
using System; static class Func1 { public static void Main() { // Note that each lambda expression has no parameters. LazyValue<int> lazyOne = new LazyValue<int>(() => ExpensiveOne()); LazyValue<long> lazyTwo = new LazyValue<long>(() => ExpensiveTwo("apple")); Console.WriteLine("LazyValue objects have been created."); // Get the values of the LazyValue objects. Console.WriteLine(lazyOne.Value); Console.WriteLine(lazyTwo.Value); } static int ExpensiveOne() { Console.WriteLine("\nExpensiveOne() is executing."); return 1; } static long ExpensiveTwo(string input) { Console.WriteLine("\nExpensiveTwo() is executing."); return (long)input.Length; } } class LazyValue<T> where T : struct { private Nullable<T> val; private Func<T> getValue; // Constructor. public LazyValue(Func<T> func) { val = null; getValue = func; } public T Value { get { if (val == null) // Execute the delegate. val = getValue(); return (T)val; } } } /* The example produces the following output: LazyValue objects have been created. ExpensiveOne() is executing. 1 ExpensiveTwo() is executing. 5 */
'프로그래밍 > C#' 카테고리의 다른 글
형 변환 예제 (0) | 2016.07.10 |
---|---|
StringBuilder 클래스 (0) | 2016.07.09 |
String.Format 메서드 (0) | 2016.06.28 |
String 클래스 (0) | 2016.06.22 |
Windows Forms 컨트롤의 다중 스레딩 (0) | 2016.06.21 |