C# 如何运算符“??'的作品
本文关键字:运算符 | 更新日期: 2023-09-27 18:29:04
我在 C# 4 中使用??
运算符,发现了一个有趣的功能。
无论返回值searchForObject()
如何,如果它已经null
,这行代码总是将 null 分配给existingObject
(searchForObject 返回一个非空对象,实际上它是一个 linq 语句而不是函数,如果以下语句将替换为简单构造,则现有对象将被分配一个非空对象(:
existingObject = extstingObject ?? searchForObject();
有人可以解释为什么吗?
这是MSDN的链接,它说:
可为 null 的类型可以包含值,也可以是未定义的。这?? 运算符定义可为 null 类型时返回的默认值 分配给不可为空的类型。如果尝试分配可为空的 值类型为不可为空的值类型,而不使用 ??算子 您将生成编译时错误。如果使用强制转换,并且 可为空的值类型当前未定义,一个 将引发无效操作异常异常。
关于将可为空的类型分配给不可为空类型的部分不是我所期望的。
该问题是在 Visual Studio 2010 的调试器中延迟初始化局部变量。
??
是
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。