这种模式我已经见过很多次了。
var image = @Model?.Image?.First();
或者
var cId = cust!.Id;
我通常会收到 Visual Studio/ReSharper 的提示,添加 ?或者 !在代码中但我已经理解了?用于在进入下一部分代码之前检查该对象不为空,但我找不到任何文档或解释来说明这些对象是什么或被称为什么以及为什么它使 VS/RS 提示添加这些对象。我知道我可以声明诸如
之类的代码int? MyInt = 1;
使其可为空,但试图更好地理解 ?还有!.
有没有人有任何参考或解释,以便我可以理解两者之间的关系?
我已经检查了 MSDN,但因为我不知道这种模式在没有找到与此相关的任何内容时被称为什么,或者如果我确实针对的是其他内容。
这个:
var image = @Model?.Image?.First();
在功能上等同于:
SomeType? image = null;
if (@Model != null && @Model.Image != null)
{
image = @Model.Image.First();
}
其中
SomeType
是 @Model.Image.First()
的返回类型。
!
运算符的工作方式类似于强制转换。当您进行强制转换时,您实际上并没有更改任何内容,而是告诉编译器引用肯定会在运行时引用特定类型的对象,因此访问该类型的成员是安全的。 null 宽容运算符告诉编译器,可为 null 的引用肯定会在运行时引用一个对象,因此访问该对象的成员是安全的。
?
是空条件运算符。它是避免空检查样板的语法糖。var image = @Model?.Image?.First();
相当于
Image image = null;
if (@Model != null)
{
if (@Model.Image != null)
{
image = @Model.Image.First();
}
}
!
就是! (空值宽容)运算符 用于告诉编译器表达式不为空。
int?
是定义可为空类型的语法糖,它相当于 Nullable<int>