在JavaScritp运算符中&;可以用来调用类似的函数
possibleNull && possibleNull.do()
此操作只执行possibleNull对象的do((方法,possibleNull对象的do方法不为null。这可以由?处理?。操作人员然而,我找不到的C#替代品
let foo = _fooProvider.GetFoo();
return foo && processFoo(foo);
在JS中的"left&&right"epxression中,当左变量被求值为"true"时(通常不是null->尽管JS中有更多的情况(,右变量被返回(或执行(。
我知道||JS运算符的C#替代方案,它的工作原理几乎相同(??运算符(。是否也有对应的&;?
编辑:我知道&当两个操作数都为布尔时,可能会短路。然而,在JS中,您可以有返回除bool之外的其他内容的右侧。JS中的左侧确实被解释器自动转换为bool,但右侧只是被求值并返回。
我想实现类似的目标
public Foo Do(Foo arg)
...
var foo = _fooProvider.GetFoo();
return foo != null && Do(foo);
不使用if-else或三元运算符。
您真正关心的是逻辑运算符"短路",如果多条件测试中的第一个条件失败,则语句处理停止。
C#在这方面的工作原理与JavaScript一样:
& Logical AND
&& Logical AND with short-circuiting
| Logical OR
|| Logical OR with short-circuiting
如果您想要一个OO解决方案来解决您的问题。为什么不实现null模式?
我不知道Foo在您的情况下是否有接口,或者它是否可以合理地实现。
但是,与其在你的代码中到处都是空检查,也许还有所有的空行为。(比如如果对象为空,则记录一些东西(
做一些类似的事情
public interface IFoo { void Do(); }
public class Foo : IFoo { void Do() { /* all that stuff you wanna do */ } }
public class NullFoo : IFoo { void Do { /*log that do cannot be called on nullFoo because Foo with Code X could not be found */ } }
Foo可能来自回购或工厂,当您看到它无法实例化时。与其让客户端检查null,只需返回NullFoo,让它调用Do,它什么也不做,或者记录找不到它,然后继续它的一天:(
希望这能有所帮助!
&C#中的运算符和JavaScript中的一样工作,但仅适用于bool
操作数。您可以在JavaScript中拥有任何类型的操作数。
JavaScript使用类型强制-它将布尔值(true/false(分配给非布尔变量。
0 -> false
non-0 number -> true
[] -> false
non-empty array -> true
undefined, null -> false
{} -> true
JS中的x && y
是这样工作的:如果x强制为false,则返回x。如果x强制为true,则返回y。
C#的工作原理是一样的,只是只使用布尔操作数。如果x为false,则返回x(false(。如果x为true,y为false,则返回y(false(。如果x为true,y为true,则返回y(true(。
现在,这对于像在JS中那样编写短代码并没有什么用处。可能你能做的最好的是if (foo != null) processFoo(foo)
或三元foo == null ? getNewFoo() : processFoo(foo)
。