【.NET Core】可为null类型详解
文章目录
- 【.NET Core】可为null类型详解
- 一、概述
- 二、可为空的值类型
- 2.1 声明和赋值
- 2.2 检查可为空值类型
- 2.3 基础类型与可为空的值类型互换
- 2.4 可为空的值类型装箱和取消装箱
- 2.5 如何确定可为空的值类型
- 三、可为 null 的引用类型
一、概述
null
关键字是表示不引用任何对象的空引用的文字值。null
是引用类型变量的默认值。普通值类型不能为null
,可为空的值类型除外
二、可为空的值类型
可为 由于值类型可隐式转换为相应的可为空的值类型,因此可以像其基础类型赋值一样,向可为空值类型的变量赋值,还可以分配 可为空值类型的默认值表示 可将is运算符与类型模式结合使用,既检查 始终可以使用以下只读属性来检查和获取可为空值类型变量的值: 使用 还可以通过可为空类型与null进行比较,如: 如果要将可为空值类型的值分配给不可以为 如果要使用基础值类型的默认值为 还可以将可为空的值类型显示强制转换为不可为 在运行时,如果可为空的值类型的值为 可为空值类型的实例T?已装箱; 可将值类型 如果要确定实例是否是可为空的值类型,请不要使用 另外,请勿使用 综合来说,如果要判断可为空值类型,需要使用 由于可为null的感知上下文选择加入代码,可以使用可为null的引用类型。可为null的引用类型,null静态分析警告和null包容运算符是可选的语言功能。 在可为null的感知上下文中: 不可为null的引用类型T和可为null的引用类型T?之间的区别按照编译器对上述规则的解释强制执行的,类型为T的变量和类型为T?的变量由相同的.NET类型表示。 变量notNull和nullable都由 下面几种情况不能使用可为nulll类型:null
值类型T" />2.1 声明和赋值
null
值。具体实例如下:double? pi=3.1415926;char? letter='c';int a=110;int? ab=a;bool? flag =null;int?[] arr= new int?[8];
null
,也就是说,它是其Nullable.HasValue
属性返回false
的实例。2.2 检查可为空值类型
null
的可为空值类型的实例,又检索基础类型的值:int? a = 42;if(a is int valueOfA){ Console.WriteLine($"a is {valueOfA}");}else{ Console.WriteLine("a does not have a value."); }
Nullable.HasValue
指示可为空值类型的实例是否有基础类型的值。HasValue
为true
,则Nullable.Value
获取基础类型的值。如果HasValue
为false
,则Value
属性将引发IvalidOperationException
。HasValue
属性在显示值之前测试变量是否包含该值:int? b=10;if(b.HasValue){Console.WriteLine($"b is {b.Value}");}else{Console.WirteLine("b does not have a value.");}
int? bc = 7;if (bc != null){Console.WriteLine($"c is {c.Value}");}else{Console.WriteLine("c does not have a value");}
2.3 基础类型与可为空的值类型互换
null
的值类型变量,则可能需要指定要分配的替代null
的值。使用Null
和并操作符??
执行此操作(也可将Nullable.GetValueOrDefault(T)
方法用于相同的目的):int? pi=3.14;int b = pi??-1;Console.WriteLine($"b is {b}");int? c=null;int d =c??-1;Console.WriteLine($"d is {d}");
null
,需要使用Nullable.GetValueOrDefault()
方法。null
的类型。如下:int? n = null;int n2 = (int)n;
null
,则显式强制转换将抛出InvalidOperationException
。不可为null的值类型T
隐式转换为相应的可为空值类型T?
。2.4 可为空的值类型装箱和取消装箱
HasValue
返回false
,则生成空引用。HasValue
返回true
,则基础值类型T的对应值将将装箱,而不对Nullable
的实例进行装箱。T
的已装箱值取消装箱到相应的可为空值类型T?
,如示例:2.5 如何确定可为空的值类型
Object.GetType
方法获取要通过前面的代码测试的Type
实例。如果对值类型可为空的实例调用Object.GetType
方法,该实例将装箱到Object。由于对可为空的值类型的非NULL实例的装箱等同于对基础类型的值的装箱,因此GetType
会返回表示可为空的值类型的基础类型的Type
实例。is
运算符来确定实例是否是可为空的值类型。因为无法使用is
运算符区分可为空值类型实例的类型与其基础类型实例。Nullable.GetUnderlyingType
和typeof
运算符。以检查实例是否具有可为空的值类型。三、可为 null 的引用类型
string notNull = "Hello";string? nullable = default;notNull = nullable!;Console.WriteLine(notNull);
String
类型表示。因为不可为null
的类型和可为null的类型都存储为相同的类型,所以有几个位置不允许使用可为null的引用类型。public MyClass : System.Object? // not allowed{}var nullEmpty = System.String?.Empty; // Not allowedvar maybeObject = new object?(); // Not allowedtry{if (thing is string? nullableString) // not allowedConsole.WriteLine(nullableString);} catch (Exception? e) // Not Allowed{Console.WriteLine("error");}