在JavaScritp中,运算符&&可以用来调用如下函数
possibleNull && possibleNull.do()这只在possibleNull对象不为空的情况下执行possibleNull对象的do()方法。这可以由?来处理。操作符。然而,我找不到C#的替代品
let foo = _fooProvider.GetFoo();
return foo && processFoo(foo);在JS中的"left && right“式中,当left变量的计算结果为"true”时(通常不为空的->在JS中有更多的情况),right变量将被返回(或执行)。
我知道用于|| JS运算符的C#替代方案,它的工作方式几乎相同(??运算符)。是否也有对应的&&?
编辑:我知道当两个操作数都是布尔值时,&&可以被短路。然而,在JS中,您可以在右侧返回除bool之外的其他内容。JS中的左侧确实被解释器自动转换为bool,而右侧只是计算并返回。
我想要实现像这样的东西
public Foo Do(Foo arg)
...
var foo = _fooProvider.GetFoo();
return foo != null && Do(foo);而不使用if-else或三元运算符。
发布于 2019-11-14 03:54:46
您真正询问的是逻辑运算符“短路”,即如果多条件测试中的第一个条件失败,语句处理将停止。
在这方面的C# works just as JavaScript does:
& Logical AND
&& Logical AND with short-circuiting
| Logical OR
|| Logical OR with short-circuiting发布于 2019-11-14 04:33:37
如果你想要一个OO解决方案来解决你的问题。为什么不实现空模式呢?
我不知道Foo在你的情况下是否有一个接口,或者它是否可以合理地实现。
而不是让你的代码中到处都是空的检查,也许会有所有的空的行为四处游荡。(例如,如果对象为null,则记录某些内容)
做一些事情,比如
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可能来自repo或工厂,当您看到它无法实例化时。而不是让客户端检查null,只需返回NullFoo,让它调用Do什么也不做,或者记录找不到它,然后继续它的工作:)
希望这能有所帮助!
发布于 2019-11-14 04:46:23
C#中的&&运算符的工作方式与JavaScript中的类似,但仅适用于bool操作数。在JavaScript中可以有任何类型的操作数。
JavaScript使用类型强制-它将布尔值(true/false)赋给非布尔变量。
0 -> false
non-0 number -> true
[] -> false
non-empty array -> true
undefined, null -> false
{} -> trueJS中的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)。
https://stackoverflow.com/questions/58844536
复制相似问题