2010-12-05 141 views
4

在c#中有一個偉大的運算符'??'這使生活變得更簡單。我可以寫foo ?? default而不是寫(foo != null)? foo : default。有沒有一種簡單的方法可以將這個操作符應用於類別memeber,例如在情況(foo != null)? foo.bar : default是否可以使用?班級成員的操作員?

UPD: OK,我會expalin了一下:

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; 

這將是冷靜,如果我可以縮短這些東西像

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

也許它並不會更短,但它只會將foo轉換爲MyClass一次,並顯式初始化具有默認值的欄。最重要的是它看起來更好。

+0

什麼是不簡單的寫作(foo!= null)? foo.bar:默認?? – 2010-12-05 02:33:35

+0

什麼?我不確定你會變得更簡單...我錯過了什麼嗎? – IAbstract 2010-12-05 02:35:47

回答

3

沒有內置的C#操作符可以執行您所描述的操作。一個新的運營商(大多數人建議.??.)已經是requested,但它有not been added到C#。

作爲一種解決方法,許多開發人員實施了IfNotNull擴展方法,例如在此StackOverflow questionanswer中。

3

只有當你有做這樣的

(foo ?? defaultFoo).bar 

但某種程度上這將意味着,你必須有同時作爲富對象圍繞其杆設置你的方式想要它。

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爲空(這可能是也可能不是你想要的)。