神奇的C#运算符(?、??、?. )

1. 可空类型修饰符(?)

引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。

例如:string str=null; 是正确的,int i=null; 编译器就会报错。

为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?“来表示,表现形式为"T?”

例如:int? 表示可空的整形,DateTime? 表示可为空的时间。

T? 其实是System.Nullable(泛型结构)的缩写形式,

也就意味着当你用到T?时编译器编译时会把T?编译成System.Nullable的形式。

例如:int?,编译后便是System.Nullable的形式。

2.?? 和 ??= 运算符

如果左操作数的值不为 null,则 null 合并运算符 ?? 返回该值;否则,它会计算右操作数并返回其结果。 如果左操作数的计算结果为非 null,则 ?? 运算符不会计算其右操作数。

C# 8.0 及更高版本中可使用空合并赋值运算符 ??=,该运算符仅在左侧操作数的求值结果为 null 时,才将其右侧操作数的值赋值给左操作数。 如果左操作数的计算结果为非 null,则 ??= 运算符不会计算其右操作数。

用于定义可空类型和引用类型的默认值。

如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。

例如:a??b 当a为null时则返回b,a不为null时则返回a本身。

空合并运算符为右结合运算符,即操作时从右向左进行组合的。

如,“a??b??c”的形式按“a??(b??c)”计算。d ??= e ??= f 相当于 d ??= (e ??= f)

List<int> numbers = null; int? a = null; 
(numbers ??= new List<int>()).Add(5); 
Console.WriteLine(string.Join(" ", numbers)); // output: 5 
numbers.Add(a ??= 0); 
Console.WriteLine(string.Join(" ", numbers)); // output: 5 0 
Console.WriteLine(a); // output: 0

注:??= 运算符的左操作数必须是变量、属性或索引器元素。

从 C# 7.0 开始,可以使用 throw 表达式作为 ?? 运算符的右操作数,以使参数检查代码更简洁:

public string Name 
{ 
    get => name; 
    set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null"); 
}

3.NULL检查运算符(?.)  

例如我们要获取一个Point序列的第一个点的X坐标,如下:

int firstX = points.First().X;

但是没有进行控制检验、应改为正确的版本是这样的

int? firstX = null; if (points != null) 
{   
    var first = points.FirstOrDefault();   
    if (first != null)  firstX = first.X; 
}

在C# 6.0中,引入了一个 ?. 的运算符,前面的代码可以改成如下形式:

int? firstX = points?.FirstOrDefault()?.X;

基本用法:如果对象为NULL,则不进行后面的获取成员的运算,直接返回NULL

注意:由于"?.“运算符返回的可以是NULL,当返回的成员类型是struct类型的时候,”?.“和”."运算符的返回值类型是不一样的。

Point p = new Point(3, 2);  
Console.WriteLine(p.X.GetType() == typeof(int)); //true 
Console.WriteLine(p?.X.GetType() == typeof(int?)); //true

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值