01.可空类型是值类型,只是可空类型是包括null的值类型的 int? 就是可空的int类型 "?"这个修饰符只是C#提供的一个语法糖(所谓语法糖,就是C#提供的一种方便的形式,其实肯定没有int? 这个类型,这个int?编译器认为的就是Nullable类型,即可空类型] Nullable(这个T就是上专题介绍的泛型参数,其中T只能为值类型,因为从可空类型的定义为:public struct Nullable where T : struct)和Nullable
//定义1 int? value = 1; //定义2 Nullable<int> value2 =new Nullable<int>(1); WriteLine(value.GetType()); WriteLine(value2.GetType());02.为啥需要null类型 在设计数据库的时候,我们可以设置数据库字段允许为null值,如果数据库字段是日期等这样在C#语言是值类型时,当我们把数据库表映射一个对象时,此时Datetime类型是值类型,在C# 语言中是不能为null的,如果这样就会与数据库的设计有所冲突,这样开发人员就会有这样的需求了——值类型能不能也为可空类型的
03.hasvalue属性 HasValue 属性代表指示可空对象是否有值 在使用Value属性时必须先判断可空类型是否有值, 如果可空类型对象的HasValue返回false时,将会引发InvalidOperationException异常
int? value = null; Nullable<int> value2 =new Nullable<int>(1); WriteLine(value2.HasValue); //true WriteLine(value.HasValue); //false using System; using static System.Console; namespace Generic5 { class Program { static void Main(string[] args) { //定义1 int? value = 200; //定义2 Nullable<int> value2 =new Nullable<int>(100); WriteLine("可空类型有值的输出情况"); Display(value); Display(value2); WriteLine("可空类型没有值的输出情况"); value = null; value2 = null; Display(value); Display(value2); ReadKey(); } private static void Display(int? nullable) { if (nullable.HasValue) { WriteLine($"值为:{nullable.Value}"); } if (!nullable.HasValue) { //如果可空对象有值,就用它的值返回,如果可空对象不包含值时,使用默认值0返回,也可以自己设置默认值 WriteLine($"默认值{nullable.GetValueOrDefault()}"); } } } }05.空合并操作符 ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为null,就返回右边的数,这个操作符可以用于可空类型,也可以用于引用类型,但是不能用于值类型(之所以不能应用值类型(这里除了可空类型),因为??运算符要对左边的数与null进行比较,然而值类型,不能与null类型比较,所以就不支持??运算符) ??这个运算符可以方便我们设置默认值,可以避免在代码中写if, else语句,简单代码数量,从而有利于阅读
class Program { static void Main(string[] args) { Operator(); ReadKey(); } static void Operator() { int? nullable = null; int? nullhasvalue = 10; // ??和三目运算符的功能差不多的 // 所以下面代码等价于: // x=nullable.HasValue?b.Value:12; int x = nullable ?? 12; // 此时nullhasvalue不能null,所以y的值为nullhasvalue.Value,即输出1 int y = nullhasvalue ?? 123; WriteLine($"可空类型没有值的情况:{x}"); WriteLine($"可空类型有值的情况:{y}"); // 同时??运算符也可以用于引用类型, 下面是引用类型的例子 string a = "123"; string b = null; string result = a ?? "456"; string result2 = b ?? "100"; WriteLine($"引用类型不为null的情况:{result}"); WriteLine($"引用类型为null的情况:{result2}"); } }