2010-12-05 5 views
4

C#에는 훌륭한 연산자 '??'가 있습니다. 그것은 인생을 훨씬 단순하게 만든다. (foo != null)? foo : default을 쓰는 대신 foo ?? default을 쓸 수 있습니다. 이 연산자를 클래스 구성원에게 적용하는 간단한 방법이 있습니까? 상황이 (foo != null)? foo.bar : default일까요?사용할 수 있습니까 ?? 반원들에 대한 연산자?

UPD :이 기능은 다음과 같습니다 필요로 할 때 상황 : :

string a = (someVeryLongVariableName != null)? someVeryLongVariableName : ""; // Long way 
string a = someVeryLongVariableName ?? ""; // Shorter with same result 
string a = (someVeryLongVariableName != null)? someVeryLongVariableName.bar : ""; // What's the shorter way in this case? 

upd2가 :

if (foo is MyClass) bar1 = (foo as MyClass).SpecificMember; 
if (foo is OneMoreClass) bar2 = (foo as OneMoreClass).AnotherSpecificMember; 
if (foo is MyFavoriteClass) bar3 = (foo as MyFavoriteClass).YetAnotherMember; 

그것은 경우 멋진 수 있습니다 OK 나는 조금 expalin 것 나는 이것들을 단축시킬 수있다.

bar1 = (foo as MyClass).SpecificMember ?? null; 

어쩌면 짧지는 않지만 foo를 MyClass로 한 번만 캐스팅하고 명시 적으로 바를 기본값으로 초기화합니다. 그리고 가장 중요한 것은 더 멋지게 보입니다.

+0

간단한 쓰지 않는 것 (foo! = null)? foo.bar : 기본 ?? –

+0

무엇? 네가 훨씬 더 간단해질 수 있을지 모르겠다. 뭔가 놓친 거니? – IAbstract

+0

upd2에 내 게시물 – Poma

답변

3

설명하는 것을 수행하는 기본 제공 C# 연산자가 없습니다. 새로운 연산자 (대부분 사람들은 .? 또는 ?.를 제안 함)는 requested이지만, C#에는 not been added이 있습니다.

많은 개발자가 IfNotNull 확장 메소드를 구현합니다 (예 : StackOverflow questionanswer).

3

당신은 당신은 그것의 줄이 길을 설정할 주위에 foo는 같은 시간의 객체를 가지고해야 할 것이다 것을 의미이

(foo ?? defaultFoo).bar 

그러나처럼 일을 어떤 방법이있는 경우에만 원하는.

+0

및' foo'는'(foo as string) .Length'와 같은 표현식입니까? – Poma

+3

(문자열로 된 foo) ""). 길이 –

+0

@Poma, foo는 표현식을 의미합니까? 이 경우 표현식은 foo를 사용하는 것과 정확히 일치합니다. 그러나 .Length는 null이 될 수없는 int이기 때문에 귀하의 경우는 작동하지 않습니다. – tster

3

아니요, 현재 C#에는 해당 연산자 (액세스 멤버 또는 반환 기본값)가 없습니다. 당신은, 물론,이 작업을 수행하는 방법을 쓸 수있다 : 그러나

public static TMember MemberOrDefault<T, TMember>(T obj, 
                Func<T, TMember> accessor, 
                TMember @default) { 
    return obj == null ? @default : accessor(obj); 
} 

string a = MemberOrDefault(someVeryLongVariableName, v => v.bar, ""); 

참고,이 여전히 null을 반환 것 someVeryLongVariableName.bar가 null의 경우 (이 수도 있고 당신이 원하는하지 않을 수 있습니다).

관련 문제