C#中?和!相关语法用途

首先?相关语法,包括?.  ??   ?:   ?

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

众所周知,在C#中引用类型可以使用一个null引用来表示一个不存在的值,比如 string str = null 是正确的;
但是值类型却不能为空,比如 int k = null 那么编译器就会报错;
为了让值类型也可以为空,就需要使用可空类型,即用可空类型修饰符 "?" 来表示,举例如:
int? 表示可空的整形,DateTime? 表示可为空的时间。这样我们就可以写int? k = null 而不报错。

它的表现形式为 "T?" ,T? 其实是System.Nullable(泛型结构)的缩写形式,
也就意味着当你用到T?时编译器编译时会把T?编译成System.Nullable的形式。
例如:int?,编译后便是System.Nullable的形式。

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

  ?. 可以作为是否为NULL的检查运算符。让我们举个例子:
现在要获取某点的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。

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

用于定义可空类型和引用类型的默认值。
如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。例如:
a??b 当a为null时则返回b,a不为null时则返回a本身。

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

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

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

 

 

然后是!运算符

1、逻辑非:

感叹号用作逻辑非运算符,可以对布尔值进行取反操作。通过在布尔表达式前面添加感叹号,我们可以将一个布尔值从"true"变为"false",或从"false"变为"true"。逻辑非常常用于条件判断和逻辑运算中。

bool isTrue = true;bool isFalse = !isTrue; // isFalse的值为falseif(!isFalse){  dosomesting();//这里就是非False 执行,也就条件是true时执行}

2、关系运算符:

!= 与等号共同组成关系运算符,检查两个操作数的值是否相等。

a!=b

3、非空断言:

在C# 8.0及更高版本中,感叹号可以用于非空断言。当我们声明一个可能为空的引用类型时,在类型后面添加问号("?")表示可为空。而感叹号用于标记不为空的断言,告诉编译器在此处不要进行空引用检查。这在我们确定某个引用不会为空时非常有用。

string? nullableString = null;string nonNullableString = nullableString!; // 非空断言,告诉编译器不要检查nullableString是否为null

4、 可空类型的解引用:

同上条一样在C# 8.0及更高版本中,感叹号还可以用于可空类型的解引用操作。可空类型是指允许变量存储空值的类型,通过在变量后面添加问号("?")来表示。当我们需要从可空类型中获取实际值时,可以使用感叹号进行解引用操作,以确保获取到的值不为空。

int? nullableInt = 10;int nonNullableInt = nullableInt!.Value; // 解引用操作,获取nullableInt的值,这里必须确保有值才行

 

posted @ 2024-02-01 10:25  六镇2012  阅读(87)  评论(0编辑  收藏  举报