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合并运算符(??)
?? 运算符称为“ null 合并运算符”,用于定义可以为 null 值的类型和引用类型的默认值。合并运算符为类型转换定义了一个预设值,以防可空类型的值为Null。
如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。
int? x = null;//定义可空类型变量
int? y = x ?? 1000;//使用合并运算符,当变量x为null时,预设赋值1000
Console.WriteLine(y.ToString()); //1000
null 合并运算符为右结合运算符,即操作时从右向左进行组合的。如,“a??b??c”的形式按“a??(bb??cc)”计算。
如果在尝试将可以为 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
投稿
猜你喜欢
MyBatis使用动态表或列代码解析
2023-06-13 07:57:40
深入探讨C#中的const、readonly关键字
2023-01-20 23:42:25
C++定义和初始化string对象实例详解
2022-08-05 06:03:00
Android编程实现3D立体旋转效果的实例代码
2023-04-01 13:40:50
Java枚举的七种常见用法总结(必看)
2022-10-10 08:38:43
Maven依赖管理的用法介绍
2021-07-13 18:07:35
如何在c语言下关闭socket
2021-12-26 10:22:46
Java开发之spring security实现基于MongoDB的认证功能
2022-06-29 15:52:32
C#使用InstallerProjects打包桌面应用程序的完整步骤
2023-12-08 14:38:04
Java统计字符串中字符出现次数的方法示例
2023-11-25 08:23:02
java读写二进制文件的解决方法
2022-08-03 14:45:55
Java常见问题之javac Hello.java找不到文件的解决方法
2023-12-15 21:19:45
Java 十大排序算法之计数排序刨析
2023-11-28 19:21:26
解决idea爆红 cant resolve symbol String的问题解析
2023-10-11 10:47:30
SpringBoot资源文件的存放位置设置方式
2023-02-26 10:37:00
Java并发编程之ConcurrentLinkedQueue源码详解
2023-01-22 16:19:51
Android读取手机通讯录联系人到自己项目
2022-01-04 06:37:48
Java文件快速copy复制实例代码
2021-05-27 12:25:22
java自定义注解验证手机格式的实现示例
2023-06-24 10:42:44
C#并行编程之信号量
2023-10-08 19:26:54