我刚刚发现,可以使用is-keywordin C# 对可空结构进行空检查。我认为它看起来很干净并且很好理解,但它也有性能吗?口译员是否必须双重投射它或者这样可以吗?
static void Main(string[] args)
{
DateTime? test = null;
PrintDT(test);//wont print
test = DateTime.Now;
PrintDT(test);//will print
}
private static void PrintDT(DateTime? dt)
{
if (dt is DateTime a)
Console.WriteLine(a);
}
Run Code Online (Sandbox Code Playgroud)
任何编译/反编译回 C# 的工具都会给出等效的方法(发布模式编译):
private static void PrintDT(DateTime? dt)
{
if (dt.HasValue)
{
DateTime valueOrDefault = dt.GetValueOrDefault();
Console.WriteLine(valueOrDefault);
}
}
Run Code Online (Sandbox Code Playgroud)
或(调试模式编译)
private static void PrintDT(DateTime? dt)
{
DateTime valueOrDefault;
int num;
if (dt.HasValue)
{
valueOrDefault = dt.GetValueOrDefault();
num = 1;
}
else
num = 0;
if (num == 0)
return;
Console.WriteLine((object) valueOrDefault);
}
Run Code Online (Sandbox Code Playgroud)
因此,编译器预先使用可空类型的语法糖来在幕后创建优化的场景。