逻辑运算符&&;在JavaScript和it中';s C#等价物

逻辑运算符&&;在JavaScript和it中';s C#等价物,javascript,c#,null,conditional-statements,Javascript,C#,Null,Conditional Statements,在JavaScritp中,运算符&&可用于调用如下函数 possibleNull && possibleNull.do() 这将执行possibleNull对象的do()方法,仅当possibleNull对象不为null时。这可以由?来处理?。操作人员然而,我找不到C#替代品 let foo = _fooProvider.GetFoo(); return foo && processFoo(foo); 在JS中的“left&&right”ePxPression

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

possibleNull && possibleNull.do()
这将执行possibleNull对象的do()方法,仅当possibleNull对象不为null时。这可以由?来处理?。操作人员然而,我找不到C#替代品

let foo = _fooProvider.GetFoo();
return foo && processFoo(foo);
在JS中的“left&&right”ePxPression中,当左变量的计算结果为“true”(通常不为null->JS中的情况更多)时,返回(或执行)右变量

我知道C#替代| | JS运算符的方法几乎与(?运算符)相同。 是否也有对应的&&

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

我想实现这样的目标

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

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

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

在这方面:

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

如果你想用面向对象的方法解决你的问题。为什么不实现空模式呢

我不知道在你的情况下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,让它调用doo,doo不做任何事情,或者记录找不到它,然后继续它的工作:)

希望这有帮助

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

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

0->false
非0数字->真
[]->false
非空数组->真
未定义,null->false
{}->true
JS中的
x&&y
是这样工作的:如果x强制为false,则返回x。如果x强制为true,则返回y

C#的工作原理是一样的,只是只对布尔操作数有效。如果x为false,则返回x(false)。如果x为真,y为假,则返回y(假)。如果x为真,y为真,则返回y(真)


现在,这对于编写JS中的短代码来说并不是很有用。也许你能做的最好的事情就是
if(foo!=null)processFoo(foo)
或者三元
foo==null?getNewFoo():processFoo(foo)

&
做了同样的事情,但是你不能把它作为一个语句本身使用-需要作为
if
while
等的一部分使用。如果(foo!=null)processFoo(foo),只做一些简单的glike
有什么不对@JᴀʏMᴇᴇ 在C#
和&
中,只有当两边都是
bool
时才起作用。因此,
foo==null
将单词放在左边,但是如果
processFoo
是一个
void
方法,那么你就不能在右边做一个
bool
。@juharr-非常正确,我把球掉在那里了!我不认为这是他在这里要问的。区别在于C#要求操作数为
bool
,但javascript不要求。没有bool它能工作吗?标题本身写着“布尔逻辑运算符”。在javascript中,&&运算符在没有布尔值的情况下工作。它可以用于一般的空检查,比如“if(variable!=null)do(variable)”而不是“只写“variable&&do(variable)”@LukDeathrageProchzka JavaScript确实要求操作数是可以转换为布尔值的,这意味着“操作数是否真实?”@ScottMarcus是,但不是。当左操作数为真时,将重新调整右操作数(无论其布尔值或任何其他值)。“true&&'foo'返回'foo'”而“null&&'foo'”返回null。它可以转换为C#,比如“foo!=null&&5”,当foo不为null时返回5(左侧为true)。据我所知,这在C#中是不可能的。这在某种程度上是由Nullable struct和.HasValue属性完成的。这个问题可以通过将所有对象装箱到Nullable struct中来解决。但是,我仍然必须执行“if(foo.HasValue)do(foo)”。根据你的建议,我必须做“如果(!(foo是NullFoo))做(foo”。在JS中,我可以用诸如“foo&&do(foo)”之类的&&operator替换if语句,或者更明确地用诸如“foo!=null&&do(foo)”之类的运算符替换if语句。这不是我的建议。我的建议是你只要做:做(foo)。如果它的类型为NullFoo,则表示它将不执行任何操作。但是如果它是Foo,它实际上会做一些事情。所以松开TypeCheck是的,我知道我在问是否有一种方法可以让c#&与不同的类型或替代操作符一起工作。JS有| |,它结合了c#| | |(布尔运算符)和??(空运算符)。我在问C#是否有另一个操作符,它接受了JS的&&操作符的一部分,而C#的&&操作符不能这样做。C#中没有这样的操作符可以接受任何对象。我只是觉得有趣的是,除了C#的类型约束之外,它们的工作原理是相同的。