C#中单问号(?)和双问号(??)的用法整理

作者:springsnow 时间:2021-08-27 02:50:53 

一、可空类型修饰符(?)

C#2.0里面实现了Nullable数据类型

//A.比如下面一句,直接定义int为null是错误的,错误提示为无法将null转化成int,因为后者是不可以为null的值类型。
private int getNum = null;

//B.如果修改为下面的写法就可以初始指为null,在特定情况下?等同于基础类型为Nullable。
private int? getNum = null;
private Nullable<int> getNumNull = null;

二、三元运算符(?:)

需要if语句来判断,当Request.Params["para"]不为null时,取出para的值。

string strParam =Request.Params["para"];  
if ( strParam== null )  
{  
   strParam= "";  
}

用三元运算符?简化写法,取出para的值。

string strParam=Request.Params["para"] == null ? "":Request.Params["para"];

三、null合并运算符(??)

?? 运算符称为&ldquo; null 合并运算符&rdquo;,用于定义可以为 null 值的类型和引用类型的默认值。合并运算符为类型转换定义了一个预设值,以防可空类型的值为Null。

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

int? x = null;//定义可空类型变量
int? y = x ?? 1000;//使用合并运算符,当变量x为null时,预设赋值1000
Console.WriteLine(y.ToString()); //1000

null 合并运算符为结合运算符,即操作时从右向左进行组合的。如,&ldquo;a??b??c&rdquo;的形式按&ldquo;a??(bb??cc)&rdquo;计算。

如果在尝试将可以为 null 值的类型分配给不可以为 null 值的类型时没有使用 ?? 运算符,则会生成编译时错误。如果使用强制转换,且当前还未定义可以为 null 值的类型,则会引发InvalidOperationException 异常。

//A.定义getNum为null,输出结果为0
private int? getNum = null;
Console.WriteLine(getNum ?? 0);

//B.定义getNum为1,输出结果为1
private int getNum = 1;
Console.WriteLine(getNum ?? 0);

四、NULL条件运算符(?.)

在C# 6.0中,引入了一个 ?. 的运算符。

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

void Main()
{

//首先我们定义全局变量Person对象,有可能p为null的情况下取值。
   Person p = null;
   string telePhoneNo = string.Empty;  //定义telePhoneNo

//取Person的telePhoneNo
   //A.初始写法,if条件判断
   if (p != null)
   {
       if (p.Secret != null)
       {
           telePhoneNo = p.Secret.TelePhoneNo;
       }
   }

//B.三元运算符写法,单问号?
   telePhoneNo = p != null ? (p.Secret != null ? p.Secret.TelePhoneNo : "") : "";

//C. NULL检查运算符?.
   telePhoneNo = p?.Secret?.TelePhoneNo ?? "";
   Console.Write(telePhoneNo);
}

public class SecretByMySelf
{
   public string Password { get; set; }
   public string TelePhoneNo { get; set; }
}

public class Person
{
   public string Name { get; set; }
   public SecretByMySelf Secret { get; set; }
}

五、?[]"运算符:

用于在执行成员访问 (?.) 或索引 (?[) 操作之前,测试是否存在 NULL。 这些运算符可帮助编写更少的代码来处理 null 检查,尤其是对于下降到数据结构。

int? count = customers?[0]?.Orders?.Count();
// null if customers, the first customer, or Orders is null

来源:https://www.cnblogs.com/springsnow/p/10455585.html

标签:C#,单问号,双问号
0
投稿

猜你喜欢

  • 支持SpEL表达式的自定义日志注解@SysLog介绍

    2023-08-27 09:38:42
  • springboot启动脚本start.sh和停止脚本 stop.sh的详细教程

    2022-10-11 08:28:26
  • Java树形结构数据生成导出excel文件方法记录

    2021-08-20 05:19:18
  • Java Socket编程详解及示例代码

    2022-06-29 07:05:27
  • 使用aop实现全局异常处理

    2021-06-13 12:47:35
  • 利用java实现中奖概率详情

    2021-08-10 06:56:58
  • windows下java -jar 后台运行以及杀死后台进程的操作

    2022-02-09 17:28:13
  • Java聊天室之实现客户端一对一聊天功能

    2022-12-28 09:23:30
  • C#实现Array,List,Dictionary相互转换

    2022-10-09 13:51:39
  • SpringBoot项目依赖和配置最新示例讲解

    2021-08-13 23:04:23
  • java多线程Future和Callable类示例分享

    2021-09-02 09:49:37
  • Java实现十进制与二进制互转的示例详解

    2022-04-02 07:40:56
  • 两种java实现二分查找的方式

    2023-09-04 05:25:00
  • SpringCloud分布式链路追踪组件Sleuth配置详解

    2023-11-28 23:58:42
  • Java线程状态变换过程代码解析

    2023-08-06 18:05:29
  • C#实现XML文件操作详解

    2023-07-16 12:36:52
  • 对spring task和线程池的深入研究

    2022-08-08 10:32:38
  • 浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

    2022-10-20 06:58:41
  • java通过Callable和Future来接收线程池的执行结果

    2022-03-31 05:01:43
  • Java实现走迷宫回溯算法

    2022-06-02 05:11:29
  • asp之家 软件编程 m.aspxhome.com