2010-12-05 138 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为空(这可能是也可能不是你想要的)。