如果默认为null,在C#中使用null合并运算符是否总是redunant?
在C#is中 总是相当于如果默认为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作为第二个参数都没有任何用处。
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??空
overx=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;
}
}