delegate void MyDelegate(string message);
class Program
{
static void Main()
{
// 델리게이트 인스턴스 생성 및 람다식 할당
MyDelegate myDelegate = (message) =>
{
Console.WriteLine("람다식을 통해 전달된 메시지: " + message);
};
// 델리게이트 호출
myDelegate("안녕하세요!");
Console.ReadKey();
}
}
1. 메서드를 생성하지 않고도 델리게이트에 추가가 가능하므로 효율적이다.
2. 하지만 람다식으로 델리게이트에 할당을 하면 제거를 할 수 없기 때문에 제거를 해야하는 상황이 생기는 경우 람다식보다는 메서드로 추가하는 것이 좋다.
// 델리게이트 선언
public delegate void GameEvent();
// 이벤트 매니저 클래스
public class EventManager
{
// 게임 시작 이벤트
public event GameEvent OnGameStart;
// 게임 종료 이벤트
public event GameEvent OnGameEnd;
// 게임 실행
public void RunGame()
{
// 게임 시작 이벤트 호출
OnGameStart?.Invoke();
// 게임 실행 로직
// 게임 종료 이벤트 호출
OnGameEnd?.Invoke();
}
}
1. 델리게이트를 다른 클래스에서 사용하지 못하게 할 수있음 (캡슐화)
2. 그렇기 때문에 다른 메서드를 불러와서 사용하는 프로퍼티 기능으로 사용가능
// Func를 사용하여 두 개의 정수를 더하는 메서드
int Add(int x, int y)
{
return x + y;
}
// Func를 이용한 메서드 호출
Func<int, int, int> addFunc = Add;
int result = addFunc(3, 5);
Console.WriteLine("결과: " + result);
아래 예시: 메서드를 생략하고 실행할 때 처음 생성할 때 Add를 +=말고 =로 초기화를 시켜준 다음 사용 함
// Func를 이용한 메서드 호출
Func<int, int, int> addFunc = Add;
addFunc += Multiply; // addFunc에 Multiply를 추가
addFunc += Subtract; // addFunc에 Subtract를 추가
int result = addFunc(3, 5);
Console.WriteLine("결과: " + result);
```cs
// Action을 사용하여 문자열을 출력하는 메서드
void PrintMessage(string message)
{
Console.WriteLine(message);
}
// Action을 이용한 메서드 호출
Action<string> printAction = PrintMessage;
printAction("Hello, World!");
1. Func와 Action의 공통점은 정의가 미리 되어있는 델리게이트를 대체하는데 사용이 된다.
2. 둘의 차이점은 Func는 마지막 제네릭 형식의 매개변수 타입으로 반환하고 Action은 반환은 하지 않는데 있다.
3. Func의 경우에는 제네릭 형식의 마지막 매개변수가 반환 타입이므로 사용할 메서드의 매개변수의 수가 다르다고 헷갈리는 경우가 있을 수 있으므로 주의해야함
4. 실행하고 값을 int result = addFunc(3, 5);받을때 최근에 실행한 값으로 들어가기 때문에 인지 해야함
5. 처음 실행할 때는 해당 Func, Action의 값을 추가할 때 값을 초기화를 해줘야한다. (생성하자마자 +=를 해버리면 안된다.)
6. 둘 다 null를 +=로 추가해도 메서드가 삭제되거나 초기화가 되지 않음 물론 = null를 해버리면 해당 델리게이트에 추가된 메서드들이 모두 초기화되니 인지해야함
시작: 두 가지의 방법으로 해본 결과 공통점과 차이점이 있는데 알아보자
1. 각자의 방법으로 델리게이트에 추가하여 관리 할 수 있다.
람다식:
1. 델리게이트에 추가 할 때 메서드를 직접 호출하여 변경 할 수 있다.
2. 메서드를 따로 생성하지 않고 바로 사용이 가능하다.
메서드형식:
1. 메서드를 그대로 저장하여 사용하므로 재사용이 편함
2. 메서드의 정의와 호출하는 위치가 다르기 때문에 파악하기 힘들다.
Func과 Action과는 다르게 delegate를 직접 사용하고 있다고 해서 delegate를 생성하고 초기화를 해줄 필요가 없다. (delegate는 생성시 반환 타입과 매개변수 타입을 지정하고 생성하기 때문이다.)
// 데이터 소스 정의 (컬렉션)
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// 쿼리 작성 (선언적인 구문)
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
// 쿼리 실행 및 결과 처리
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
var result = from 변수 in 데이터소스
[where 조건식]
[orderby 정렬식 [, 정렬식...]]
[select 식];
1. (from 요소 in 데이터)를 사용하여 해당 데이터에 있는 요소를 foreach처럼 꺼낼 수 있음
2. (where 요소 조건)는 요소에서 조건을 걸어서 요소를 골라냄
3. (orderby 정렬식) 오름차순 또는 내림차순으로 어떤 정렬을 할지 선택
4. (select 요소) 모든 과정을 걸친 요소
StringBuilder sb = new StringBuilder();
// 문자열 추가
sb.Append("Hello");
sb.Append(" ");
sb.Append("World");
// 문자열 삽입
sb.Insert(5, ", ");
// 문자열 치환
sb.Replace("World", "C#");
// 문자열 삭제
sb.Remove(5, 2);
// 완성된 문자열 출력
string result = sb.ToString();
Console.WriteLine(result);