使用之间有什么区别??和C#中的if not null块?

使用之间有什么区别??和C#中的if not null块?,c#,null,nullable,C#,Null,Nullable,在C#?中使用??和如果(foo==null){…}else{…}有什么区别吗??操作符只会计算您的值一次,您的版本可能会多次计算它 所以 应该被评估为 var tmp = foo; if(tmp == null) { tmp = bar; } var baz = tmp; 当foo是在getter中具有副作用的函数或属性时,这一区别非常重要 private int _counter1 = 0; private int _counter2 = 0; private string Ex

在C#?

中使用
??
如果(foo==null){…}else{…}
有什么区别吗
??
操作符只会计算您的值一次,您的版本可能会多次计算它

所以

应该被评估为

var tmp = foo;
if(tmp == null)
{
    tmp = bar;
}
var baz = tmp;
foo
是在getter中具有副作用的函数或属性时,这一区别非常重要

private int _counter1 = 0;
private int _counter2 = 0;

private string Example1()
{
    _counter1++;
    if(_counter1 % 2 == 0)
        return _counter1.ToString();
    else
        return null;
}

private string Example2()
{
    _counter2++;
    return _counter2.ToString();
}
每次执行
var result=Example1()??示例2()
计数器1的值只应增加一次,而计数器2的值只应每隔一次调用增加一次

//Equivalent if statement
var tmp = Example1();
if(tmp == null)
{
    tmp = Example2();
}
var result = tmp;

??
运算符只对您的值进行一次评估,您的版本可能会对其进行多次评估

所以

应该被评估为

var tmp = foo;
if(tmp == null)
{
    tmp = bar;
}
var baz = tmp;
foo
是在getter中具有副作用的函数或属性时,这一区别非常重要

private int _counter1 = 0;
private int _counter2 = 0;

private string Example1()
{
    _counter1++;
    if(_counter1 % 2 == 0)
        return _counter1.ToString();
    else
        return null;
}

private string Example2()
{
    _counter2++;
    return _counter2.ToString();
}
每次执行
var result=Example1()??示例2()
计数器1的值只应增加一次,而计数器2的值只应每隔一次调用增加一次

//Equivalent if statement
var tmp = Example1();
if(tmp == null)
{
    tmp = Example2();
}
var result = tmp;

为了伟大的解释加上一。为了伟大的解释加上一。