C# 如何运算符“??'的作品

本文关键字:运算符 | 更新日期: 2023-09-27 18:29:04

我在 C# 4 中使用??运算符,发现了一个有趣的功能。

无论返回值searchForObject()如何,如果它已经null,这行代码总是将 null 分配给existingObject(searchForObject 返回一个非空对象,实际上它是一个 linq 语句而不是函数,如果以下语句将替换为简单构造,则现有对象将被分配一个非空对象(:

    existingObject = extstingObject ?? searchForObject();

有人可以解释为什么吗?

这是MSDN的链接,它说:

可为 null 的类型可以包含值,也可以是未定义的。这?? 运算符定义可为 null 类型时返回的默认值 分配给不可为空的类型。如果尝试分配可为空的 值类型为不可为空的值类型,而不使用 ??算子 您将生成编译时错误。如果使用强制转换,并且 可为空的值类型当前未定义,一个 将引发无效操作异常异常。

关于将可为空的类型分配给不可为空类型的部分不是我所期望的。

该问题是在 Visual Studio 2010 的调试器中延迟初始化局部变量。

C# 如何运算符“??'的作品

??

if (somethingisnull)
  somethingisnull = somethingnotnull

因此searchForObject()也必须返回 null

?? 如果操作数不为 null,则返回左侧操作数; 否则,它将返回正确的操作数。

   // ?? operator example.
    int? x = null;
    // y = x, unless x is null, in which case y = -1.
    int y = x ?? -1;

阅读 : 合并运算符 - ?? :合并运算符是 C#2.0 中添加的新运算符。聚结运算符也称为??.

没有 ?? 运算符

 Nullable<int> a = null; 
Nullable<int> b = 10; 
int c = a==null ? b.Value : a; 

可以替换为??,如下所示

Nullable<int> a = null; 
Nullable<int> b = 10; 
int c = a ?? b.Value; 

??是 oeprate 允许在第一个值为空时分配第二个值

existingObject = extstingObject ?? searchForObject(); 

因此,在您的情况下,如果extstingObject为空,则它获取searchForObject()的值并分配给对象,如果您获得 null,则第二个函数也返回 null。

除了我在此评论中所说的:

也有可能你实际上没有看到相同的代码 您正在执行的。它有时会在Visual Studio中发生。重建 项目,尝试清除bin文件夹,放一些Debug.WriteLine 以跟踪应用中真正发生的事情(而不是依赖 IDE的Watch(,等等。

另一个问题浮现在脑海中——作业后existingObject真的为空吗? :)你怎么断言的?

看看我的问题(和答案(:

令人惊讶的 CLR/JIT? 行为 - 局部变量的延迟初始化

这里还有其他事情发生,searchForObject()必须返回null.请看以下示例。

object searchForObject()
{
    return new object();
}

通过searchForObject()的实现,我们可以做到这一点:

object existingObject = null;
existingObject = existingObject ?? searchForObject();

现在,如果我们简单地像这样测试它:

Console.Write("existingObject is ");
if (existingObject == null) Console.WriteLine("null");
else Console.WriteLine("not null");

它将告诉我们existingObject is not null.但是,如果我们更改searchForObject()返回的内容:

object searchForObject()
{
    return null;
}

它会告诉我们existingObject is null.现在,最后一个测试是在我们执行第一次检查之前更改 existingObject 的值:

object existingObject = new object();
existingObject = existingObject ?? searchForObject();

这将告诉我们existingObject is not null.

如果 existingObject 为 null,这意味着 ?? 之后的任何内容都返回 null。

原因是其他地方是错误的。在这一行代码中,如果 existingObject 为 null,则 searchForObject(( 的返回值将分配给 existingObject