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

调用链中的Null合并分享

时间:2023-04-10 16:05:04 C#

调用链中的Null合并如果我有一个很长的对象列表,每个对象都可能在“Linqwhere”子句中返回null,比如SomeSource.Where(srcItem=>(srcItem.DataMembers["SomeText"].Connection.ConnectedToasType1).Handler.ForceInvocation==true));索引器可以返回null,而“as”运算符可以返回null。对象可能未连接(即属性为空)。如果在任何地方遇到null,我希望where子句为正在评估的项目返回“false”。相反,它会因空引用异常而中止。在我看来,这将被设计为用单个C#表达式来表达。我不喜欢创建多行语句或为其创建单独的函数。我是否缺少使用空合并运算符的内容?您在寻找.?C#中不存在的运算符(或者它是?.-其中之一)-根据EricLippert的说法,尽管这是一个经常被请求的功能。我唯一可能的建议是编写一个接受表达式并使用它来检查任何空值的方法。但这会有性能成本。无论如何,它可能看起来像:TTryOrDefault(Expression>expression){//逐一检查表达式中的每个MemberExpression,//一路寻找任何空值。//如果找到null,则返回default(T)或某个默认值。//否则...Funcfunc=expression.Compile();返回函数();}以Ruby中的andand运算符为灵感,您可以创建一个充当null守卫的扩展方法。publicstaticUAndAnd(thisTobj,Funcfunc){returnobj==null?默认(U):函数(对象);}原来的代码可以改写如下:>val.ConnectedTo)asType1).AndAnd(val=>val.Handler).AndAnd(val=>val.ForceInvocation));使用此方法返回非布尔类型时要小心——确保您熟悉default(U)返回的default(U)。为它创建一个单独的函数这是要走的路。不要对正确的技术过敏。与匿名方法相比,您创建的方法并不昂贵(无论是运行时还是概念上)。前段时间写了一个模仿AndAnd的项目,它依赖于DynamicProxy。虽然我没有在生产中使用它,但它工作正常。唯一的缺点是它要求所有成员都是虚拟的或返回的类型是一个接口,因此DynamicProxy可以发挥它的魔力。看这里https://bitbucket.org/mamadero/andand/overview以上就是C#学习教程:Null合并共享调用链中的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关照——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: