有可能使用??班级成员的操作员?

时间:2010-12-05 02:28:48

标签: c# .net

在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。最重要的是它看起来更好。

3 个答案:

答案 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 questionanswer中。