首页 > 编程语言 >C#中?和!相关语法用途

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

时间:2024-02-01 10:34:43浏览次数:25  
标签:运算符 C# 用途 语法 int 可空 类型 null

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

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

 

标签:运算符,C#,用途,语法,int,可空,类型,null
From: https://www.cnblogs.com/MarcLiu/p/18000700

相关文章

  • P7031 [NWRRC2016] Anniversary Cake 题解
    作者还在想,居然没什么人写红题题解???咳咳。言归正传。本题没有想象中的那么复杂,咱分类讨论就行了。·若在属于蛋糕的平面直角坐标系中,两支蜡烛的横、纵轴不同,就会有多种切法。如图:           这样,我们随便找一种情况输出就行,反正有SpecialJudge......
  • 关于pycharm报错:Original error was: DLL load failed while importing _multiarray_u
    前提:遇到该问题时,已重新卸载并安装numpy,但由于今日重新打开pycharm,运行相同的代码,又再次报错,故重新寻找了新的方式进行尝试。原文地址解决方法:Step1:点击run,找到EditConfigurationsStep2:在EnvironmentVariables后加入:Path=Anaconda根目录\Library\bin......
  • AIGC、AGI、ChatGPT:揭秘人工智能大模型的变革与创新
    随着科技的不断发展,人工智能(AI)已经深入到我们生活的方方面面,从语音助手到自动驾驶汽车,再到智能家居,AI的影子无处不在。而在近年来,AIGC、AGI和ChatGPT等人工智能大模型的出现,更是引领了一场前所未有的技术革命。接下来,我们将一起探索这些人工智能大模型的奥秘。一、AIGC:开启全新的......
  • springboot @configuration
    @controller@service@repository下面都是@component注解booleanproxyBeanMethods()defaulttrue;proxyBeanMethods 是 Spring Boot 中 @Configuration 注解的一个属性,用于控制是否应该为 @Configuration 类中通过 @Bean 方法定义的 bean 创建代理。这个属性的......
  • @bean 和@ component 区别 用法
     @bean里面没有component@Bean 和 @Component 都是 Spring 框架中用于定义和注册 bean 的注解,但它们的使用场景和方式有所不同。@Bean- @Bean 注解用在方法上,通常在配置类(带有 @Configuration 注解的类)中使用。- 它表示通过方法返回的对象应该被注册为 Spring......
  • 使用DependencyContext显示当前应用程序的目标框架和运行时依赖项
    这是文档的解释:编译.NET应用程序后,SDK将生成JSON清单文件(<ApplicationName>.deps.json),其中包含有关应用程序依赖项的信息。可以在运行时使用该DependencyContext类从此清单中读取信息。当项目中使用了这种方式获取所有类库时varcompilationLibraries=Dependen......
  • C++第五十五篇-定时器SetTimer
    使用的一个百度AI代码生成网站: https://yiyan.baidu.com/定时器的实现示例:新建一个程序 编写ConsoleApplication1.cpp#include<iostream>#include<Windows.h>usingnamespacestd;#pragmacomment(lib,"User32.lib")//首先定义一个计时器计时事件的定义#define......
  • BigInt:JavaScript 中的任意精度整数
    BigInts 是JavaScript中的一个新的数字基本(primitive)类型,可以用任意精度表示整数。使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。umber 在JavaScript中被表示为双精度浮点数。这意味着它们的精度有限。......
  • gcc编译
    GCC的简单使用在终端使用下面的命令,可以生成可执行文件“a.out”。gccmain.c编译的时候也可以指定可执行文件的名字。使用下面的命令,可以生成名为run.exe的可执行文件。gccmain.c-orun.exe生成可执行文件之后,如何运行?输入命令./run.exe即可执行。 使用gcc-vmain.c......
  • 神经网络优化篇:详解Batch Norm 为什么奏效?(Why does Batch Norm work?)
    BatchNorm为什么奏效?为什么Batch归一化会起作用呢?一个原因是,已经看到如何归一化输入特征值\(x\),使其均值为0,方差1,它又是怎样加速学习的,有一些从0到1而不是从1到1000的特征值,通过归一化所有的输入特征值\(x\),以获得类似范围的值,可以加速学习。所以Batch归一化起的作用的原因,直......