C#中的安全导航操作员?
可能重复:
“如果object为null,则为null;如果object为null,则为object.member”的快捷方式
有些语言有一个安全的导航操作符,让您不必担心空引用exception。
Groovy语言示例:
String lname = person.Name.ToLowerCase(); //throws exception if Name is null String lname = person.Name?.ToLowerCase();//lname will be null if Name was null
如何在C#中完成与此类似的操作? 到目前为止,我的解决方案是这样的扩展方法:
public static T o(this T obj) where T : new() { return obj != null ? obj : new T(); } //used like: String lname = person.o().Name; //returns null if person was null
但是,这仅适用于某些情况。
对于这种情况,我倾向于使用名为IfNotNull
的扩展方法:
public static OUT IfNotNull(this IN v, Func f) where IN : class where OUT : class { return v == null ? null : f(v); }
更复杂的是介绍一个Maybe的概念。 这里有一个例子是derick bailey。
更新:
从C#6开始 ,现在有一个零传播运算符,它的语法方式与Groovy运算符完全相同。
您正在寻找短路零条件成员访问运算符?.
这是在C#语言版本6中引入的(在Visual Studio 2015中推出)。
我的答案的其余部分是为早期版本的C#语言编写的,它没有?.
运营商。
一般来说,如果您正处于访问深度“嵌套”属性的情况,例如outermostObject.abcX
,您应该考虑重新设计代码,因为这样的访问可能表明您违反了已建立的OO原则(如最少知识原则,又名德米特定律)。
其他一些选择:
首先 ,反建议 – 不要这样做:
string lname = null; try { lname = Person.Name.ToLower(); } catch (NullReferenceException ex) { } // inefficient and ugly
其次 ,使用像Maybe
monad这样的东西 – 你可以自己定义这样的类型。 它基本上是一个Nullable
,它实现IEnumerable
这样当没有设置值时它返回一个空序列,或者如果设置了一个值,则返回一个恰好一个元素的序列。 然后你可以按如下方式使用它:
Maybe personName = person.Name; var lname = (from name in personName select name.ToLower()).FirstOrDefault();
第三 ,也许是ulrichb建议的最简单,最实用的解决方案:
var lname = person.Name != null ? person.Name.ToLower() : null;
PS ,因为我们已经讨论了检查null
,所以在访问其Name
属性之前不要忘记检查person
是否为null
… ?
我不知道从保证不为null的东西返回null,但是为了保证对象引用,你可以使用Null Coalescing Operator ??
就像是:
string lname = (person.Name??String.Empty).ToLower();
对于null case,它将返回一个空字符串而不是null,但它会起作用。
返回空字符串比返回null更有意义; 如果返回null,如果将另一个运算符链接到它上,它将再次抛出。
今天在C#中不存在,但您可以使用SelectMany
编写它。
String lname = from _ in person.Name from s in _.ToUpper() select s;
要么
String lname = person.Name.SelectMany(_ => _.ToUpper(), s => s);
(那是Bart De Smet在他的PDC 2010关于LINQ未来的演讲中提出的建议。见幻灯片#6。)
上述就是C#学习教程:C#中的安全导航操作员?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/987652.html