繁体   English   中英

JavaScript 中的逻辑运算符 && 和它的 C# 等效

[英]Logical operator && in JavaScript and it's C# equivalent

在 JavaScritp 中,运算符 && 可用于调用这样的函数

possibleNull && possibleNull.do()

这仅执行 possibleNull object 不是 null 的 possibleNull object 的 do() 方法。 这个可以处理吗? 操作员。 但是我找不到 C# 替代品

let foo = _fooProvider.GetFoo();
return foo && processFoo(foo);

在 JS 的 "left && right" 表达式中,当左侧变量被评估为 "true" 时(一般不是 null -> JS 中有更多情况),返回(或执行)右侧变量。

我知道 C# 替代 || 工作原理几乎相同的 JS 运算符(?? 运算符)。 &&也有对应的吗?

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

我想实现类似

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

如果你想要一个面向对象的解决方案来解决你的问题。 为什么不实现 null 模式?

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

但是,与其用 null 检查乱扔代码,不如让所有 null 行为四处游荡。 (比如如果 object 是 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 可能来自仓库或工厂,当您看到它无法实例化时。 与其让客户端检查 null,不如返回 NullFoo,让它调用 Do 什么都不做或记录它找不到,然后 go 就在它的一天:)

希望这可以帮助!

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

JavaScript 使用类型强制 - 它将 boolean 值(真/假)分配给非布尔变量。

0               -> false
non-0 number    -> true
[]              -> false
non-empty array -> true
undefined, null -> false
{}              -> true

JS 中的x && y是这样工作的:如果 x 强制为 false,则返回 x。 如果 x 强制为真,则返回 y。

C# 的工作方式相同,只是仅使用 bool 操作数。 如果 x 为假,则返回 x (假)。 如果 x 为真且 y 为假,则返回 y(假)。 如果 x 为真且 y 为真,则返回 y (true)。

现在这对于编写像 JS 这样的短代码并不是很有用。 可能你能做的最好的事情是if (foo != null) processFoo(foo)或三元foo == null? getNewFoo(): processFoo(foo) foo == null? getNewFoo(): processFoo(foo)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM