在c#中有一个很棒的运算符'??'这让生活更加简单。我可以写(foo != null)? foo : default
而不是写foo ?? default
。是否有一种简单的方法可以将此运算符应用于类memeber,例如情况(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;
如果我可以将这些缩短为类似
,那将会很酷bar1 = (foo as MyClass).SpecificMember ?? null;
也许它不会短得多,但它只将foo转换为MyClass一次,并使用默认值显式初始化bar。最重要的是它看起来更好。
答案 0 :(得分:3)
只有你有办法这样做
(foo ?? defaultFoo).bar
但这意味着你必须拥有一个与foo同时出现的对象,其栏的设置方式与你想要的一样。
答案 1 :(得分: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, "");
但请注意,如果someVeryLongVariableName.bar
为空(这可能是您想要的,也可能不是您想要的),这仍将返回null。
答案 2 :(得分:3)
没有内置的C#运算符可以执行您描述的操作。一个新的运算符(大多数人建议.?
或?.
)已经requested,但它对C#有not been added。
作为一种解决方法,许多开发人员实施了IfNotNull
扩展方法,例如,在此StackOverflow question和answer中。