[英]is it possible to use ?? operator on class member?
在c#中有一個很棒的運算符'??' 這讓生活更加簡單。 而不是寫(foo != null)? foo : default
(foo != null)? foo : default
我可以寫foo ?? default
foo ?? default
。 是否有一種簡單的方法將此運算符應用於類memeber,例如在情境中(foo != null)? foo.bar : default
(foo != null)? foo.bar : default
?
upd:好的,我會稍微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一次,並使用默認值顯式初始化bar。 最重要的是它看起來更好。
只有你有某種方式這樣做
(foo ?? defaultFoo).bar
但這意味着你必須擁有與foo相同的對象,其條形設置方式與你想要的一樣。
不,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, "");
但請注意,如果someVeryLongVariableName.bar
為null(這可能是您想要的,也可能不是您想要的),它仍會返回null。
沒有內置的C#運算符可以執行您描述的操作。 已經請求了一個新的運算符(大多數人建議.?
或?.
),但它還沒有被添加到C#中。
作為一種解決方法,許多開發人員實現了IfNotNull
擴展方法,例如,在此StackOverflow問題和答案中 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.