【问题标题】:Logical operator && in JavaScript and it's C# equivalentJavaScript 中的逻辑运算符 && 和 C# 等效
【发布时间】:2020-03-09 16:32:21
【问题描述】:

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

possibleNull && possibleNull.do()

这里只执行 possibleNull 对象的 do() 方法,可能的Null 对象不为空。这可以由 ? 处理。操作员。但是我找不到 C# 替代

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

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

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

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

我想实现类似的目标

public Foo Do(Foo arg)
...
var foo = _fooProvider.GetFoo();
return foo != null && Do(foo);

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

【问题讨论】:

  • && 做同样的事情,但您不能将其用作语句本身 - 需要用作 ifwhile 等的一部分。
  • 只做类似if(foo!=null) processFoo(foo);的事情有什么问题
  • @JᴀʏMᴇᴇ in C# && 仅在双方都是 bool 时才有效。所以foo == null 会写在左边,但是如果processFoo 是一个void 方法,那么你就没有办法为右边写一个bool
  • @juharr - 非常真实,我把球丢在那里了!

标签: javascript c# null conditional-statements


【解决方案1】:

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

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

& Logical AND
&& Logical AND with short-circuiting
| Logical OR
|| Logical OR with short-circuiting

【讨论】:

  • 我不认为他在这里问的是什么。
  • 区别在于C#要求操作数为bool,而javascript不需要。
  • 没有布尔值可以工作吗?标题本身就是“布尔逻辑运算符”。在 javascript && 运算符中,没有布尔值。它可以用于一般的空检查,例如“if (variable != null) do(variable)”的 insted 只写“variable && do(variable)”
  • @LukDeathrageProchzka JavaScript 确实要求操作数是可以转换为布尔值的东西,这仅仅意味着“操作数是真的吗?”
  • @ScottMarcuss 是的,但不是。当左操作数为真时,右操作数被重新调整(无论它是布尔值还是其他)。 "true && 'foo'' 返回 'foo'" 而 "null && 'foo'" 返回 null。当 foo 不为空时,它可以转换为 C#,如 "foo != null && 5" 返回 5(因为左侧为真)。据我所知,这在 C# 中是不可能的。
【解决方案2】:

如果您想要一个面向对象的解决方案来解决您的问题。为什么不实现 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 可能来自 repo 或工厂,当您看到它无法实例化时。与其让客户端检查 null,不如返回 NullFoo,让它调用 Do 什么都不做或记录它无法找到,然后继续它的一天 :)

希望这会有所帮助!

【讨论】:

  • 这在某种程度上是由 Nullable 结构和 .HasValue 属性完成的。该问题可以通过在 Nullable 结构中装箱所有对象来解决。但是我仍然需要做“if (foo.HasValue) do(foo)”。根据您的建议,我必须执行“if (!(foo is NullFoo)) do(foo)”。在 JS 中,我可以用 && 运算符替换 if 语句,如“foo && do(foo)”或更明确地如“foo != null && do(foo)”
  • 不,这不是我的提议。我的建议是你只需做:do(foo)。如果它是 NullFoo 类型,则意味着它什么也不做。但如果它是 Foo 它实际上会做一些事情。所以放松类型检查
【解决方案3】:

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

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

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

x && y 在 JS 中的工作方式如下:如果 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)

【讨论】:

  • 是的,我知道我在问是否有办法让 c# && 与不同类型或替代运算符一起工作。 JS有||结合了 c# 的 || (布尔运算符)和 ?? (空运算符)。我在问 C# 是否有另一个运算符,它可以代替 C# 的 && 运算符不能做的 JS 的 && 运算符。
  • C# 中没有这样的运算符可以接受任何对象。我只是觉得有趣的是它们的工作方式相同,除了 C# 的类型约束。
猜你喜欢
  • 2017-05-03
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多