확장 메소드는 기존에 있는 클래스를 컨드르지 않고, 기능을 추가할 수 있도록 하는 기능이다.
자주 쓰는 기능들은 확장 메소드로 구현하고 사용하여, 코드를 더 간결하게 해줄 수 있는 기능이다.
static 클래스, static 메서드, 첫 매개변수에 this 키워드 정의해야된다.using을 통해 스코프(어느 코드 파일, 어느 블록에서) 제어private로 선언하면 접근 불가능하다.public static class StringExtensions
{
public static bool IsNullOrEmpty(this string s)
=> string.IsNullOrEmpty(s);
}
위와 같은 식으로 확장 메서드를 정의를 진행한다.
Null인지를 확인하는 메서드이다.string str = null;
str.IsNullOrEmpty();
위와 같이 사용했을 시, 코드 상에서는 위와 같이 사용한다.
StringExtensions.IsNullOrEmpty(str);
해당 코드가 컴파일 타임(소스 코드를 컴파일러가 분석 변환해서 중간 언어(IL) 또는 네이티브 코드로 만들어 내는 시점) 시점에는 아래와 같이 정적 메서드 호출로 변환 됩니다.
static 메서드 호출과 동일하다.public static class CollectionExtensions
{
private static Random _rand = new Random();
public static void Shuffle<T>(this IList<T> list)
{
int n = list.Count;
while (n > 1)
{
int k = _rand.Next(n--);
// temp 만들어서 바꾸는 코드와 동일한 행동을 진행한다.
// 튜플이라는 것임
// 값 형식 튜플일 경우 힙에 생성 안되고 스택이나 레지스터에 보관된다고 함.
(list[n], list[k]) = (list[k], list[n]);
}
}
}
var deck = new List<Card> { … };
deck.Shuffle(); // 덱을 무작위로 섞는다
public static class GameObjectExtensions
{
public static T GetOrAddComponent<T>(this GameObject go) where T : Component
{
var comp = go.GetComponent<T>();
return comp != null ? comp : go.AddComponent<T>();
}
}
var player = GameObject.Find("Player");
var rb = player.GetOrAddComponent<Rigidbody>();
string, DataTime, Enum 등 전역적으로 자주 쓰이는 함수 들을 정의builder.AddX().ConfigureY().Build(); 와 같은 체이닝 지원IEnumerable<T>에 새로운 연산자(예: Batch, ForEach) 추가