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的值,这里必须确保有值才行