首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript中的逻辑运算符&&及其C#等价物

问JavaScript中的逻辑运算符&&及其C#等价物
EN

Stack Overflow用户
提问于 2019-11-14 03:47:56
回答 3查看 653关注 0票数 3

在JavaScritp中,运算符&&可以用来调用如下函数

代码语言:javascript
复制
possibleNull && possibleNull.do()

这只在possibleNull对象不为空的情况下执行possibleNull对象的do()方法。这可以由?来处理。操作符。然而,我找不到C#的替代品

代码语言:javascript
复制
let foo = _fooProvider.GetFoo();
return foo && processFoo(foo);

在JS中的"left && right“式中,当left变量的计算结果为"true”时(通常不为空的->在JS中有更多的情况),right变量将被返回(或执行)。

我知道用于|| JS运算符的C#替代方案,它的工作方式几乎相同(??运算符)。是否也有对应的&&?

编辑:我知道当两个操作数都是布尔值时,&&可以被短路。然而,在JS中,您可以在右侧返回除bool之外的其他内容。JS中的左侧确实被解释器自动转换为bool,而右侧只是计算并返回。

我想要实现像这样的东西

代码语言:javascript
复制
public Foo Do(Foo arg)
...
var foo = _fooProvider.GetFoo();
return foo != null && Do(foo);

而不使用if-else或三元运算符。

EN

回答 3

Stack Overflow用户

发布于 2019-11-14 03:54:46

您真正询问的是逻辑运算符“短路”,即如果多条件测试中的第一个条件失败,语句处理将停止。

在这方面的C# works just as JavaScript does:

代码语言:javascript
复制
& Logical AND
&& Logical AND with short-circuiting
| Logical OR
|| Logical OR with short-circuiting
票数 0
EN

Stack Overflow用户

发布于 2019-11-14 04:33:37

如果你想要一个OO解决方案来解决你的问题。为什么不实现空模式呢?

我不知道Foo在你的情况下是否有一个接口,或者它是否可以合理地实现。

而不是让你的代码中到处都是空的检查,也许会有所有的空的行为四处游荡。(例如,如果对象为null,则记录某些内容)

做一些事情,比如

代码语言:javascript
复制
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什么也不做,或者记录找不到它,然后继续它的工作:)

希望这能有所帮助!

票数 0
EN

Stack Overflow用户

发布于 2019-11-14 04:46:23

C#中的&&运算符的工作方式与JavaScript中的类似,但仅适用于bool操作数。在JavaScript中可以有任何类型的操作数。

JavaScript使用类型强制-它将布尔值(true/false)赋给非布尔变量。

代码语言:javascript
复制
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)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58844536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档