关于C#中的“?”

shanzm-2019年8月23日 19:59:46

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

强类型语言中引用类型可以为空,如:string str=null;
而你若是定义一个值类型为空,则是会报错的。

然而,在处理数据库和其他包含可能未赋值的元素的数据类型时,我们希望可以将 null 赋值给数值类型或布尔型的功能特别有用。例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义

所以C# 提供了一个特殊的数据类型,Nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,和 null 值。

例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2^31 到2^31-1 之间的任意值,也可以被赋值为 null 值。

类似的,Nullable< bool > 变量可以被赋值为 true 或 false 或 null。

实际上,Nullable类型是一个结构体,它有两个公开可读字段:HasValue和Value。 HasValue是一个布尔值,当有值存储时它为真,当变量值为null时HasValue为假。当HavValue为真是时,可以取得变量的值;为假时,当尝试取得变量的值时会抛出一个异常(System.InvalidOperationException)。

声明一个 nullable 类型(可空类型)的语法如下:
用可空类型修饰符"?"来表示,
表现形式为"T?"

例如:int? 表示可空的整形,DateTime? 表示可为空的时间。
T? 其实是System.Nullable(泛型结构)的缩写形式,也就意味着当你用到T?时编译器编译 时会把T?编译成System.Nullable的形式。

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

2. 三元(运算符)表达式(?: )

例如:x?y:z 表示如果表达式x为true,则返回y;如果x为false,则返回z,是省略if{}else{}的简单形式。

3. 空合并运算符(??)

为了减少可空类型的代码量,遇到null的时候,C#提供了??操作符来获取如果为空的默认值

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

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

空合并运算符为右结合运算符,即操作时从右向左进行组合的。如,“a??b??c”的形式按“a??(b??c)”计算。

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

?.用于判断某个对象是否为空,如果对象为NULL,则不进行后面的获取成员的运算,直接返回NULL

例如:

class Foo
{
public int N { get; } = 1;
}
 static void Main(string[] args)
{
    Foo foo = null;
    var n = 2 + foo?.N ?? 1
    Console.WriteLine(n);
    Console.ReadKey();//input :1
}

说明:

  1. +运算和??运算,是同级的,从左到右
  2. foo?N 其中foo为空,故foo?.N为空,而不是我们自己定义只读属性N的默认值1
  3. 2+null,注意结果是int?类型的,结果是null
  4. null??1,结果即1

转载于:https://www.cnblogs.com/shanzhiming/p/11402803.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值