■ Button 클래스의 Click 이벤트에서 익명 대리자를 설정하는 방법을 보여준다. ▶ MainWindow.xaml
|
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="800" Height="600" Title="TestProject" FontFamily="나눔고딕코딩" FontSize="16"> </Window> |
▶ MainWindow.xaml.cs
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
using System.Windows; using System.Windows.Controls; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); Button submitButton = new Button(); submitButton.Margin = new Thickness(10); submitButton.Width = 100; submitButton.Height = 30; submitButton.IsDefault = true; submitButton.Content = "제출"; submitButton.Click += delegate { Close(); }; Button cancelButton = new Button(); cancelButton.Margin = new Thickness(10); cancelButton.Width = 100; cancelButton.Height = 30; cancelButton.Content = "Cancel"; cancelButton.IsCancel = true; cancelButton.Click += delegate { Close(); }; StackPanel stackPanel = new StackPanel(); stackPanel.HorizontalAlignment = HorizontalAlignment.Center; stackPanel.VerticalAlignment = VerticalAlignment.Center; stackPanel.Orientation = Orientation.Horizontal; stackPanel.Children.Add(submitButton); stackPanel.Children.Add(cancelButton); Content = stackPanel; } #endregion } } |
TestProject.zip
■ Delegate 클래스의 DynamicInvoke 메소드를 사용해 대리자를 실행하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
Func<int, int> twiceFunction = x => x *2; int source = 3; int target = twiceFunction.Invoke(3); Console.WriteLine(source); Console.WriteLine(target); Console.WriteLine(); Delegate twiceDelegate = twiceFunction; object[] argumentArray = { source }; // 현재 대리자가 나타내는 메소드를 동적으로 호출(지연 바인딩)한다. object targetObject = twiceDelegate.DynamicInvoke(argumentArray); Console.WriteLine(source); Console.WriteLine((int)targetObject); |
■ Action<T> 클래스에서 람다식을 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System; Action<int, string> action = (id, message) => { Console.WriteLine("{0} : {1}", id, message); }; action(1, "테스트"); |
■ Action<T> 클래스에서 delegate 키워드를 사용해 대리자를 실행하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System; Action<int, string> action = delegate(int id, string message) { Console.WriteLine("{0} : {1}", id, message); }; action(1, "테스트"); |
■ Action<T> 클래스에서 함수를 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
using System; #region 메시지 쓰기 - WriteMessage(id, message) /// <summary> /// 메시지 쓰기 /// </summary> /// <param name="id">ID</param> /// <param name="message">메시지</param> private void WriteMessage(int id, string message) { Console.WriteLine("{0} : {1}", id, message); } #endregion Action<int, string> action = WriteMessage; action(1, "테스트"); |
■ Action<T> 클래스를 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
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 28 29 30 31 32 33 34 35 36 37
|
using System; ... /// <summary> /// 출력하기 /// </summary> /// <param name="source">소스 문자열</param> private static void Output(string source) { Console.WriteLine(source); } ... // 기존 메소드 설정하기 Action<string> action1 = Output; action1("Hello"); // 무명 메소드 설정하기 Action<string, string> action2 = delegate(string message, string title) { Console.WriteLine(title + " : " + message); }; action2("No data found", "Error"); // 람다식 설정하기 Action<int> action3 = code => Console.WriteLine("Code: {0}", code); action3(1033); |
■ Func<T1, TResult> 클래스를 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
using System; ... /// <summary> /// 유효한 범위 여부 구하기 /// </summary> /// <param name="value">값</param> /// <returns>유효한 범위 여부</returns> private bool IsValidRange(int value) { return value > 0; } ... // 메소드 설정하기 Func<int, bool> func1 = IsValidRange; bool result = func1(10); Console.WriteLine(result); // 무명 메소드 설정하기 Func<int, bool> func2 = delegate(int n) { return n > 0; }; result = func2(-1); Console.WriteLine(result); // 람다식 설정하기 Func<int, bool> func3 = n => n > 0; result = func3(-2); Console.WriteLine(result); |
※ 입력 변수는 16개까지 지정 가능하다.
■ Func<TResult> 클래스를 사용하는 방법을 보여준다. (입력 변수가 없는 경우) ▶ 예제 코드 (C#)
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
using System; /// <summary> /// 상태 코드 /// </summary> private int _stateCode = 10; ... /// <summary> /// 상태 코드 체크하기 /// </summary> /// <returns>상태 코드 체크 결과</returns> private bool CheckStateCode() { return _stateCode == 0; } ... // 메소드 설정하기 Func<bool> func1 = CheckStateCode; bool result = func1(); Console.WriteLine(result); // 무명 메소드 설정하기 Func<bool> func2 = delegate { return _stateCode == 0; }; result = func2(); Console.WriteLine(result); // 람다식 사용하기 Func<bool> func3 = () => _stateCode == 0; result = func3(); Console.WriteLine(result); |
■ Predicate<T> 대리자를 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
using System; Predicate<int> predicate1 = delegate(int value) { return value >= 0; }; bool result = predicate1(-1); Console.WriteLine(result); Predicate<string> predicate2 = s => s.StartsWith("A"); result = predicate2("Apple"); Console.WriteLine(result); |
※ Predicate<T>는 Func<T, bool>와 같다.
■ 람다식을 사용해 Func 함수를 생성하는 방법을 보여준다. ▶ 예제 코드 (XAML)
|
using System; Func<int, int> function = i => i * i; |
■ 익명 메소드를 사용해 Func 함수를 생성하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System; Func<int, int> function = delegate(int i) { return i * i; }; |
■ 메소드를 사용해 Func 함수를 생성하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
using System; #region 제곱 값 계산하기 - CalculateSquareValue(value) /// <summary> /// 제곱 값 계산하기 /// </summary> /// <param name="value">값</param> /// <returns>제곱 값</returns> public int CalculateSquareValue(int value) { return value * value; } #endregion ... Func<int, int> function = CalculateSquareValue; |
■ Action 클래스를 사용하는 방법을 보여준다. ▶ 예제 코드 1 (C#)
|
using System.Windows.Threading; ... this.gridControl.Dispatcher.Invoke ( new Action(delegate { this.gridControl.BeginDataUpdate(); }), DispatcherPriority.DataBind ); |
▶ 예제 코드 2 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
using System.Windows.Threading; ... #region 메시지 설정하기 - SetMessage(message, value) /// <summary> /// 메시지 설정하기 /// </summary> /// <param name="message">메시지</param> /// <param name="value">값</param> private void SetMessage(string message, int balue) { this.textBlock.Text = string.Format("{0} : {1}", message, value); } #endregion ... this.window.Dispatcher.Invoke(DispatcherPriority.Normal, new Action<string, int>(SetMessage), "테스트", i); |
■ 이벤트 핸들러를 익명 Delegate/Linq 람다식으로 대체하는 방법을 보여준다. ▶ 이벤트 핸들러 (C#)
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
|
using System; using System.Windows.Controls; ... this.dataGrid.InitializingNewItem += new InitializingNewItemEventHandler(dataGrid_InitializingNewItem); ... #region 데이터 그리드 신규 항목 초기화시 처리하기 - dataGrid_InitializingNewItem(sender, e) /// <summary> /// 데이터 그리드 신규 항목 초기화시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void dataGrid_InitializingNewItem(object pSender, InitializingNewItemEventArgs e) { Course newCourse = e.NewItem as Course; newCourse.StartDate = newCourse.EndDate = DateTime.Today; } #endregion |
▶ 무명 Delegate (C#)
|
using System; using System.Windows.Controls; this.dataGrid.InitializingNewItem += delegate(object sender, InitializingNewItemEventArgs e) { Course newCourse = e.NewItem as Course; newCourse.StartDate = newCourse.EndDate = DateTime.Today; }; |
▶ Linq 람다식
더 읽기