Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果默认为null,在C#中使用null合并运算符是否总是redunant?_C#_Refactoring_Simplify_Null Coalescing Operator - Fatal编程技术网

如果默认为null,在C#中使用null合并运算符是否总是redunant?

如果默认为null,在C#中使用null合并运算符是否总是redunant?,c#,refactoring,simplify,null-coalescing-operator,C#,Refactoring,Simplify,Null Coalescing Operator,在C#is中 总是相当于 x = y ?? null; 如果x和y都是可为空的类型 我想不出为什么第一行代码需要第二行代码。是的,写这行代码 x = y; 看起来很傻,因为如果y为null,表达式将返回null(因此基本上返回y),否则返回y 请记住,空合并运算符在功能上与写入相同: x = y ?? null; x=y!=无效的y: 或者,当然(对于那些不熟悉三元运算符的人): 如果(y!=null) x=y; 其他的 x=; 无论哪种情况,使用null作为第二个参数都没有任何用处。

在C#is中

总是相当于

x = y ?? null;
如果x和y都是可为空的类型

我想不出为什么第一行代码需要第二行代码。

是的,写这行代码

x = y;
看起来很傻,因为如果
y
为null,表达式将返回
null
(因此基本上返回
y
),否则返回
y

请记住,空合并运算符在功能上与写入相同:

x = y ?? null;
x=y!=无效的y:
或者,当然(对于那些不熟悉三元运算符的人):

如果(y!=null)
x=y;
其他的
x=;

无论哪种情况,使用null作为第二个参数都没有任何用处。正如您在文章中所指出的,您也可以只分配变量。

是的,它们在功能上是相同的。写没有意义

x=y??空
over
x=y

IL_0014:  ldloc.0     // y
IL_0015:  stloc.2     // CS$0$0000
IL_0016:  ldloca.s    02 // CS$0$0000
IL_0018:  call        System.Nullable<System.Int32>.get_HasValue
IL_001D:  brtrue.s    IL_002A
IL_001F:  ldloca.s    03 // CS$0$0001
IL_0021:  initobj     System.Nullable<System.Int32>
IL_0027:  ldloc.3     // CS$0$0001
IL_0028:  br.s        IL_0036
IL_002A:  ldloca.s    02 // CS$0$0000
IL_002C:  call        System.Nullable<System.Int32>.GetValueOrDefault
IL_0031:  newobj      System.Nullable<System.Int32>..ctor
IL_0036:  nop         
IL_0037:  stloc.1     // x
如果你好奇的话,
x=y??null
比从
x=y
生成的IL代码更复杂

x=y??空

if (y != null)
   x = y;
else
   x = <whatever operand>;

是的,它是等效的。即使您有一个试图为提供特定行为的,
TryBinaryOperation
也不会被输入。以下代码不打印任何内容

IL_0009:  ldloc.0     // y
IL_000A:  stloc.1     // x

@格兰特妮,我错了。谢谢你抓住它!如果(x??y)=null@DJKRAZE,那么这个语句就等同于
如果(x==null&&y==null)
,那么你就不能这样做吗。这是一个非常奇怪的方式写的声明,所以我不推荐它。你想说什么/指出什么?你是对的,我误读了它,好像OP想检查两者是否都==为空。我意识到他在else中缺少了
check@DJKRAZE,只是为了确保您正确理解,null合并运算符没有
运算符,OP没有条件语句。问题是关于将
null
作为null合并运算符的第二个参数的效用,答案是“没有”。我正在使用null合并运算符重构if语句,并注意到smart sense和refactor在这方面没有任何提示。我很好奇。
IL_0009:  ldloc.0     // y
IL_000A:  stloc.1     // x
void Main()
{
    dynamic y = new MyDyn(); // or with this null
    dynamic z = new MyDyn();
    object x = y ?? z;
}
public class MyDyn : DynamicObject
{
    public override bool TryBinaryOperation(
        BinaryOperationBinder binder,
        Object arg,
        out Object result
    )
    {
        Console.WriteLine("Hello world!");
        if (binder.Operation == ExpressionType.Coalesce)
        {
            result = 3;
            return true;
        }
        result = null;
        return true;
    }
}