当前位置: 首页 > 编程语言 > C#

是否存在链式NULL检查?分享

时间:2023-04-10 11:47:33 C#

是否有链式NULL检查?我有以下难看的代码:.Account.sObject==null)返回;有没有办法在C#中检查null,这样我就不必检查每个级别?C#6中的一项提议是添加一个新的NullPropogation运算符。这将(希望)允许你写:varobj=msg?.Content?.AccountMarketMessage?.Account?.sObject;如果(obj==null)返回;不幸的是,目前语言中没有任何东西可以处理这个问题。目前还没有这样的东西,但它可能很快就会出现在.NET中。有一个关于此主题的众所周知的用户语音线程。正如本文所述,VisualStudio团队最近宣布:我们正在认真考虑C#和VB的此功能,并将在未来几个月内制作原型。编辑:正如上面ReedCopsey的回答中提到的,它现在是C#6的计划添加。他链接的Codeplex页面上有更好的细节。没有内置支持,但您可以使用扩展方法:publicstaticboolIsNull(thisTsource,stringpath){varprops=path.Split('.');vartype=source.GetType();varcurrentObject=类型。GetProperty(props[0]).GetValue(来源);如果(currentObject==null)返回真;foreach(varpropinprops.Skip(1)){currentObject=currentObject.GetType().GetProperty(prop).GetValue(currentObject);如果(currentObject==null)返回真;}返回假;然后调用它:if(!msg.IsNull("Content.AccountMarketMessage.Account.sObject"))return;您需要monad和Monadic空检查。看看Monads.Net包。它可以帮助简化空值测试并从深度导航属性中获取值,例如varsObject=person.With(p=>p.Content).With(w=>w.AccountMarketMessage).With(p=>p.Account)。With(p=>p.Object);如果你想要一个默认值varsObject=person.With(p=>p.Content).With(w=>w.AccountMarketMessage).With(p=>p.Account).Return(p=>p.Object,“默认值”);您可以使用lambda表达式延迟评估该值。这对于简单的null检查来说有点矫枉过正,但对于以“流畅”的方式链接更复杂的表达式可能很有用。例子//一个有很多后代的类型varnested=newNested();//设置评估链varisNull=NullCheck.Check(()=>nested).ThenCheck(()=>nested.Child).ThenCheck(()=>nested.Child.Child).ThenCheck(()=>nested.Child.Child.Child).ThenCheck(()=>nested.Child.Child.Child.Child);//处理结果Console.WriteLine(isNull.IsNull?"null":"notnull");代码这是一个完整的示例(尽管是草稿质量代码),可以粘贴到控制台应用程序或LINQPad中。publicclassNested{publicNestedChild{get;放;}}publicclassNullCheck{publicboolIsNull{get;私有集;}//继续链publicNullCheckThenCheck(Functest){if(!IsNull){//仅评估最后一个状态是否为“非空”this.IsNull=test()==null;}返回这个;}//启动链(避免显式实例化的便捷方法)publicstaticNullCheckCheck(Functest){returnnewNullCheck{IsNull=test()==null};}}privatevoidMain(){//测试1varnested=newNested();varisNull=NullCheck.Check(()=>nested).ThenCheck(()=>nested.Child).ThenCheck(()=>nested.Child.Child).ThenCheck(()=>nested.Child.Child.孩子).ThenCheck(()=>nested.Child.Child.Child.Child);Console.WriteLine(isNull.IsNull?"null":"notnull");//测试2nested=newNested{Child=newNested()};isNull=NullCheck.Check(()=>nested).ThenCheck(()=>nested.Child);控制台.WriteLine(isNull.IsNull吗?“空”:“不空”);//测试3nested=newNested{Child=newNested()};isNull=NullCheck.Check(()=>nested).ThenCheck(()=>nested.Child).ThenCheck(()=>nested.Child.Child);Console.WriteLine(isNull.IsNull?"null":"notnull");再次:由于它引入的复杂性,你可能不应该使用它来代替简单的空检查,但它是一个有趣的模式.NETFiddle如上所述,有计划实现c#6.0吗?运算符以某种方式促进了这一点如果你等不及了,我建议使用lambda表达式和一个简单的辅助函数来解决这个问题。publicENestedProperty(TParent,FuncPath,EIfNullOrEmpty=default(E)){try{returnPath(Parent);}catch{返回IfNullOrEmpty;}}这可以用于intvalue=NestedProperty(blank,f=>f.Second.Third.id);如下面的显示程序publicclassProgram{publicvoidMain(){Firstblank=newFirst();首先填充=newFirst(true);//值存在的地方intvalue=NestedProperty(blank,f=>f.Second.Third.id);Console.WriteLine(value);//0//没有值存在的地方value=NestedProperty(populated,f=>f.Second.Third.id);Console.WriteLine(value);//1//其中不存在任何值并且使用了默认值value=NestedProperty(blank,f=>f.Second.Third.id,-1);Console.WriteLine(value);//-1}publicENestedProperty(TParent,FuncPath,EIfNullOrEmpty=default(E)){try{returnPath(Parent);}catch{返回IfNullOrEmpty;}}}简单的表现结构publicclassFirst{publicSecondSecond{get;放;}publicintid{得到;放;}publicFirst(){}publicFirst(boolinit){这个.id=1;this.Second=newSecond();}}publicclassSecond{publicThirdThird{get;放;}publicintid{得到;放;}publicSecond(){this.id=1;this.Third=newThird();}}publicclassThird{publicintid{get;放;}publicThird(){this.id=1;从3.5(可能更早)开始,您可以编写非常简单的扩展方法publicstaticTResultDefaultOrValue(thisTsource,Funcproperty)whereT:class{returnsource==null?默认(TResult):属性(源);您可以将此方法命名为更短的名称,然后像这样使用varinstance=newFirst{SecondInstance=newSecond{ThirdInstance=newThird{Value=5}}};varval=instance.DefaultOrValue(x=>x.SecondInstance).DefaultOrValue(x=>x.ThirdInstance).DefaultOrValue(x=>x.Value);控制台.WriteLine(val);控制台.ReadLine();所以源码类是:以上是C#学习教程:是否有chainedNULLcheck?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——publicclassThird{publicintValue;}publicclassFirst{publicSecondSecondInstance;}publicclassSecond{publicThirdThird实例;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: