C#可空类型是C#中的一种特殊数据类型,它可以表示一个变量的值可以为null。它是C#语言中的一个重要特性,它允许开发人员在不改变原有数据类型的情况下,将null作为一个有效的值来使用。
C#可空类型的作用是非常重要的,它能够帮助开发人员避免出现NullReferenceException异常,这是因为当使用C#中的非可空类型时,如果该对象未初始化或者被赋予null值时,就会出现NullReferenceException异常。而使用C#中的可空类型时,就不会出现这样的问题。
此外,使用C#中的可空类型也能够有效地减少代码量。例如,如果要判断一个int?对象是否有值,则不需要写很多代码来判断该对象是否已初始化或者是否已被赋予null值。而直接使用if(int?.HasValue)即可实现这样的功能。
总之,C#中的可空数据类型具有很多优势:能够避免出现NullReferenceException异常、能够有效地减少代码量、能够方便地表达“无”这样一个特殊情况。因此,在开发C#应用时应当大量使用这样的特性来提高代 码的执行效 率以 及 质 量 。
引用类型可以使用空引用表示不存在的值。
值类型通常不能表示空值。
例如:
string s = null; // OK, Reference Type int i = null; // Compile Error, Value Type cannot be null
要在值类型中表示 null
,必须使用一个称为可空类型的特殊结构。
可空类型用值类型表示,后跟?符号:
int? i = null; // OK, Nullable Type Console.WriteLine (i == null); // True
Nullable< T>
是不可变结构,只有两个字段,代表 Value
和 HasValue
。
从T到T的转换?是隐式的,并且从T?到T是显式的。
例如:
int? x = 5; // implicit int y = (int)x; // explicit
显式转换直接等同于调用可为空的对象的Value属性。
因此,如果 HasValue
为false,则抛出 InvalidOperationException
。
当 T?
被装箱时,堆上的装箱值包含 T
,而不是 T?
。
这个优化是可能的,因为装箱的值是可以表达null的引用类型。
C#还允许使用as操作符取消装箱可空类型。如果转换失败,结果将为null:
object o = "string"; int? x = o as int?; Console.WriteLine (x.HasValue); // False
Nullable <T> struct不定义操作符,例如<,>,甚至==。尽管如此,下面的代码编译并正确执行:
int? x = 5; int? y = 10; bool b = x < y; // true
如果 x
和 y
都有值,则通过int的小于运算符进行比较;否则,返回false。
运算符提升意味着你可以在 T
上隐式使用T的运算符。
这里有些例子:
int? x = 1;
int? y = null;
// Equality operator examples
Console.WriteLine (x == y); // False
Console.WriteLine (x == null); // False
Console.WriteLine (x == 1); // True
Console.WriteLine (y == null); // True
Console.WriteLine (y == 1); // False
Console.WriteLine (y != 1); // True
// Relational operator examples
Console.WriteLine (x < 6); // True
Console.WriteLine (y < 6); // False
Console.WriteLine (y > 6); // False
// All other operator examples
Console.WriteLine (x + 5); // 6
Console.WriteLine (x + y); // null
编译器根据运算符的类别不同地处理空逻辑。
这意味着两个空值是相等的:
Console.WriteLine ( null == null); // True
Console.WriteLine ((bool?)null == (bool?)null); // True
如果恰好一个操作数为空,则操作数不等。
如果两个操作数都不为空,则比较它们的值。
将 null
值与空值或非空值进行比较返回false。
所有其他运算符(+, - ,*,/,%,&,|,^,<<,>>,+,++, - ,!,〜)在任何操作数为空时返回null。
您可以混合和匹配可空类型和非可空类型:
int? a = null;
int b = 1;
int? c = a + b; // c is null - equivalent to a + (int?)b
当提供的bool?类型的操作数&
和|
运算符将null视为未知值。所以,null | true
为true。
类似地, null & false
为false。
以下示例枚举其他组合:
bool? n = null;
bool? f = false;
bool? t = true;
Console.WriteLine (n | n); // (null)
Console.WriteLine (n | f); // (null)
Console.WriteLine (n | t); // True
Console.WriteLine (n & n); // (null)
Console.WriteLine (n & f); // False
Console.WriteLine (n & t); // (null)
??
运算符是空合并运算符,它可以与可空类型和引用类型一起使用。
如果操作数是非空的,返回它;否则,或返回默认值。
例如:
int? x = null;
int y = x ?? 5; // y is 5
int? a = null, b = 1, c = 2;
Console.WriteLine (a ?? b ?? c); // 1 (first non-null value)
??
运算符等效于调用具有显式默认值的 GetValueOrDefault
值。
C# 枚举枚举器是值的列表上的只读,只向前的光标。枚举器是实现以下任一接口的对象:System.Collections.IEnumeratorSystem.Colle...
C# for/foreach 循环C# 循环一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。语法C# 中 for 循环的语法:f...
C# 传递数组给函数 C# 数组在 C# 中,您可以传递数组作为函数的参数。您可以通过指定不带索引的数组名称来给函数传递一个指向数...
C# while 循环 C# 循环只要给定的条件为真,C# 中的 while 循环语句会重复执行一个目标语句。语法C# 中 while 循环的语法:while...