簡體   English   中英

有可能使用?? 班級成員的操作員?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM