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}");
}
}