2012년 2월 15일 수요일

.NET Framework 4.0 의 Named Parameter 기능

하는 짓이 대부분 Data 다루는 일이고, API 만드는 일이라, 많은 양의 인터페이스, 클래스, 메소드 등을 만듭니다.

.NET 3.5 부터인가?  확장 메소드 (Extension Methods) 기능에 인터페이스 + 제너릭을 이용하면, 상당히 편하게 기존 코드를 변형하거나 확장할 수 있어서 좋았습니다.

.NET 4.0 에서 가장 큰 특징은 TPL (Task Parallel Library) 와 Dynamic 입니다만, TPL은 진작에 마스터(?) 했고, Dynamic 은 거의 쓸 일이 없어서 안 쓰고 있었습니다. 거기다가 Named Parameter는 Delphi 시절부터 잘 쓰던 기능인데, C#에서는 이제서야 제공되네요… TPL은 NET 3.5 용이 따로 제공되어, 회사 라이브러리 제작 시에 활용했습니다만, Dynamic 이나 Named Parameter 는 회사 규정 상 .NET 3.5 / .NET 4.0 동시 지원을 하도록 해서, 그림의 떡(?) 이었습니다.

이번에 개인적으로 만드는 라이브러리는 .NET 4.0 이상만을 지원하도록 하면서, Named Parameter 를 사용하기 시작했습니다.

역시 기대대로 정말 편합니다. overloading 줄어들고, interllisense에 기본 값이 나오니, 기존 overloading보다 훨씬 많은 정보를 사용자에게 알려주게 되네요.

특히나 검색용 쿼리를 만들 때, 인자 값을 미리 설정할 수 있어서 좋고, 생성자도 많이 만들 필요 없고^^

protected DocumentReporter() {}
public DocumentReporter(Document document, ActorObject reporter = null)
{
// ...

}


이렇게 하면 document 만 인자로 해서 만들 수 있습니다^^ 


다만 생성자의 경우 기본 생성자인 class A 의 생성자 A() 와 생성자 A(string n=null) 은 사용자 입장에서는 A() 를 호출 하는 것이 A(string n=null) 을 호출 하는 것이므로, A() 를 제거해도 사용자 입장에서는 제대로 작동합니다만, Reflection을 통해 보면, A 수형의 기본 생성자 (인자가 없는 생성자) 가 없다고 나옵니다. 즉 A()와 A(string n=null) 은 겉보기는 같고, 사용자가 사용하기에는 같지만, 수형 자체는 다르다는 점을 주의하셔야 합니다.


뭐 나머지 경우는 크게 문제 될 것 없고, 사용하기도 편합니다. 다만 ValueType에 대해 default 값을 주고 싶은데, 뭘 지정해야 할지 곤란할 때에는, 기존 방식대로 Nullable<T>를 사용하시면 좋습니다.


public QueryOver<Form, Form> BuildQueryOverOfForm(string name = null,
FormKind formKind = FormKind.Unknown,
bool? isEnabled = null,
bool? isVisible = null)



와 같이 bool? 을 사용하면 됩니다.

댓글 없음: