C#三元运算符、可空类型、空合并运算符、空检查运算符
原文:https://www.runoob.com/csharp/csharp-nullable.html
一、三元运算符 ?:
主要是简化一个判断和返回数值的语句,功能上与if else一致。
基本的格式是: 判断语句 ? True返回值 : False返回值
例如:
int a, b; a = 10; b = (a == 1) ? 20 : 30; // b的值为:30
二、可空类型修饰符 ?
C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。
引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。
例如:
string str = null; // 是正确的 int i = null; // 编译器就会报错。
为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符 ? 来表示,
声明一个 nullable 类型(可空类型)的语法如下:
< data_type> ? <variable_name> = null;
例如:int? 表示可空的整型,DateTime? 表示可为空的时间。
int? x = null; // 此时x就是一个值类型的空值了。 int i; // 默认值0 int? ii; // 默认值null
实例
using System; namespace CalculatorApplication { class NullablesAtShow { static void Main(string[] args) { int? num1 = null; int? num2 = 45; double? num3 = new double?(); double? num4 = 3.14157; bool? boolval = new bool?(); // 显示值 Console.WriteLine("显示可空类型的值: {0}, {1}, {2}, {3}", num1, num2, num3, num4); Console.WriteLine("一个可空的布尔值: {0}", boolval); Console.ReadLine(); } } }
当上面的代码被编译和执行时,它会产生下列结果:
显示可空类型的值: , 45, , 3.14157
一个可空的布尔值:
三、空合并运算符 ??
Null 合并运算符用于定义可空类型和引用类型的默认值。Null 合并运算符为类型转换定义了一个预设值,以防可空类型的值为 Null。Null 合并运算符把操作数类型隐式转换为另一个可空(或不可空)的值类型的操作数的类型。
如果此运算符的左操作数不为 null,则此运算符将返回左操作数,否则返回右操作数。
a ?? b 代表当 a 为 null 时则返回 b,a 不为 null 时则返回 a 本身。
例如:
int? y = x ?? 10; // x == null ? 10 : x
空合并运算符为右结合运算符,即操作时从右向左进行组合的。
例如: a ?? b ?? c 的形式按 a ?? (b ?? c) 计算。
实例
using System; namespace CalculatorApplication { class NullablesAtShow { static void Main(string[] args) { double? num1 = null; double? num2 = 3.14157; double num3; num3 = num1 ?? 5.34; // num1 如果为空值则返回 5.34 Console.WriteLine("num3 的值: {0}", num3); num3 = num2 ?? 5.34; Console.WriteLine("num3 的值: {0}", num3); Console.ReadLine(); } } }
当上面的代码被编译和执行时,它会产生下列结果:
num3 的值: 5.34
num3 的值: 3.14157
四、空检查运算符 ?.
注意:C#6.0才支持NULL检查运算符
如果对象为 NULL,则不进行后面的获取成员的运算,直接返回 NULL,如果不为NULL,则进行后面的获取成员的运算。
例如:
string str = null; int? z = str?.Length; // null string str2 = "abc"; int? z2 = str2?.Length; // 3
五、示例
using System; namespace TestApp { class Program { static void Main(string[] args) { /* 三元运算符 */ int a, b; a = 10; b = (a == 1) ? 20 : 30; Console.WriteLine("b = {0}", b); // b = 30 /* 可空类型修饰符 */ int? x = null; // 如果是 int x = null; 是不可以的,会报错 Console.WriteLine("x = {0}", x); // x = /* 空合并运算符 */ int? y = x ?? 10; // x == null ? 10 : x Console.WriteLine("y = {0}", y); // y = 10 /* null检查运算符 */ string str = null; int? z = str?.Length; // str == null ? null : str.Length Console.WriteLine("z = {0}", z); // z = null } } }