C#?和??运算符以及合并条件表达式
最近项目中,常常碰到这个?和??这两个操作符,之前说得不够详细,趁着周末补全来,希望能够给大家带来帮助。
(一)?操作符
我们知道值类型是不肯能为空的,它总是包含值的本身,不会为NULL,这估计也是值类型的由来。 ?应该是为了解决把值类型设置为可空类型而出现的,比如int? y=null这种情况,当数据库设置某个int类型,datetime类型等等,可以为空的时候,?运算符在我们编程中就会非常有用。其实?这个操作符等价于Nullable<T>。看Nullable<T>的源码可以了解到如下信息:
namespace System {
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
[Serializable, StructLayout(LayoutKind.Sequential), NonVersionable, __DynamicallyInvokable]
public struct Nullable<T> where T : struct {
private bool hasValue; //这个类似于一个标注位的作用
internal T value;
[NonVersionable, __DynamicallyInvokable]
public Nullable(T value) {
this.value = value;
this.hasValue = true;
}
[__DynamicallyInvokable]
public bool HasValue {
[NonVersionable, __DynamicallyInvokable]
get {
return this.hasValue;
}
}
[__DynamicallyInvokable]
public T Value {
[__DynamicallyInvokable]
get {
if (!this.hasValue) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
}
return this.value;
}
}
[NonVersionable, __DynamicallyInvokable]
public T GetValueOrDefault() {
return this.value;
}
[NonVersionable, __DynamicallyInvokable]
public T GetValueOrDefault(T defaultValue) {
if (!this.hasValue) {
return defaultValue; //返回默认值。
}
return this.value;
}
[__DynamicallyInvokable]
public override bool Equals(object other) {
if (!this.hasValue) {
return (other == null);
}
if (other == null) {
return false;
}
return this.value.Equals(other);
}
[__DynamicallyInvokable]
public override int GetHashCode() {
if (!this.hasValue) {
return 0;
}
return this.value.GetHashCode();
}
[__DynamicallyInvokable]
public override string ToString() {
if (!this.hasValue) {
return "";
}
return this.value.ToString();
}
[NonVersionable, __DynamicallyInvokable]
public static implicit operator T? (T value) {
return new T?(value);
}
[NonVersionable, __DynamicallyInvokable]
public static explicit operator T(T? value) {
return value.Value;
}
}
}
可以看出该结构表示可以为null的值类型,它本身也是轻量级的,实例是存在栈上的,而且实例大小和原始值类型基本一样的,只是多了一个Boolean字段。仔细阅读上面的源码也可以分析出相关的东西。
(二)?? 空接合操作符
??叫做 null 合并运算符。如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。可以用来给变量设置默认值。特别提醒: 记住和空有关的时候,才要去用?? 。如果不会有空的判断,就别用了。因为这个是空的合并运算符。也有人说??是?:的语法糖而已,但是实际上??进行了很大改进,能够更好的支持表达式。

(第二种)??在复合情形中,更好用,和上面类似。
还有就是如何把一个条件表达式,用?和??进行合并。
var flag = tt == null ? 1 : tt.Name; 因为这里进行了为Null的判断,所以可以用??。先写??。然后再来确定左右两边应该写什么。 var flag= tt?.Name??1 ;这个就是合并后的条件表达式
(三)CLR对可空类型支持
C#设计人员想尽一切方法,让可空类型,看起来不要那么另类,看起来像一个一等公民。
看了它的Nullable<T>的代码就知道了,它其实是一个bool类型字段+值类型。其实它很多操作都可以从这里来解释,装箱,拆箱。
CLR会说谎----看下图

C#?和??运算符以及合并条件表达式的更多相关文章
- Simplifying Conditional Expressions(简化条件表达式)
1.Decompose Conditional(分解条件表达式) 2.Consolidate Conditional Expressions(合并条件表达式) 3.Consolidate Duplic ...
- shell(shell变量、条件表达式、流程控制)
本章内容: 变量 运算 if语句 for语句 while语句 break.continue 实例 shell变量 1.shell变量简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数 ...
- Dart学习笔记-运算符-条件表达式-类型转换
Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...
- shell之条件表达式
conditional expressions are used by the [[ compound command and the test and [ builtin commands. ari ...
- Less的条件表达式
Less的条件表达式 当需要根据表达式,而不是参数的值或数量进行匹配时,条件表达式(Guards)就显得非常有用.如果你熟悉函数式编程的话,对条件表达式也不会陌生. 为了尽可能地接近CSS的语言结构, ...
- js值类型转换(boolean/String/number),js运算符,if条件,循环结构,函数,三种弹出框
js值类型转换 number | string | boolean boolean类型转换 num = 0; var b1 = Boolean(num); console.log(b1) 转化为数字类 ...
- if语句的嵌套以及条件运算符和条件表达式(初学者)
1.当if语句中的执行语句又是if语句时,则构成了if语句的嵌套情形. 其一般形式可表示为: if() { if()……; } 或: if() if()语句1: else 语句2: else if() ...
- C# 条件表达式max=(a>b)?a:b;含义
a?b:c 这个是条件表达式,表示如果a为真,则表达式值为b,如果a为假,则表达式值为c条件表达式具体说明如下条件语句: if(a>b) max=a; else max=b; 可用条件表达式写为 ...
- Shell条件表达式
Shell编程中经常需要判断文件状态.字符串是否相等以及两个数值大小等情况,基于这些比较结果再做执行相关操作.本文主要讲述文件状态.字符串.数值大小的判断比较方法. 文件状态判断 文件状态的判断通常使 ...
随机推荐
- cygwin -- 在windows平台上运行的unix模拟环境
cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购).它对于学 ...
- 微服务架构 | 5.4 Sentinel 流控、统计和熔断的源码分析
目录 前言 1. Sentinel 的自动装配 1.2 依赖引入 1.3 SentinelWebAutoConfiguration 配置类 1.4 CommonFilter 过滤器 1.5 小结 2. ...
- AT5760 Manga Market
首先一个想法就是可以考虑令 \(dp_{i, j}\) 表示当前考虑到了第 \(i\) 个商店,当前到了时刻 \(j\) 能走过最多的商店数量.但是你会发现这个 \(dp\) 转移的顺序并不是简单的从 ...
- 关于在findViewById()方法时遇到的一些问题
最近需要做一个关于色卡的App,需要用到LayoutInflater来实现标签动态切换View界面,但是发现在使用过程中App突然会闪退, 闪退目前已解决. 先看下关于findViewById()的详 ...
- linux下格式化json文件数据
一.使用 python -m json.tool cat test.json | python -m json.tool 二.jq格式化 在web 2.0时代json这种直观.灵活.高效数据格式基本已 ...
- 基于Apache的Tomcat负载均衡和集群(2)
反向代理负载均衡 (Apache+JK+Tomcat) 使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的.这种代理方式 ...
- 何为VRRP
VRRP 1.VRRP概述 2.VRRP结构 3.VRRP双主双备 前言:如何让多个网关能协同工作但又不会互相冲突?这时VRRP就应运而生,它可以实现网关的备份,又能解决多个网关之间互相冲突的问题. ...
- Pytest介绍
Pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介绍,它 ...
- 有手就行7——*项目构建细节2-钩子(webhook) 配置
有手就行7--*项目构建细节2-钩子(webhook) 配置 钩子服务 1)开启webhook功能 使用root账户登录到后台,点击Admin Area -> Settings -> N ...
- python小白记录一 ——python脚本生成windows可执行exe
1.需要安装pywin32 先查看自己有没有安装:使用如下命令查看 pip show pywin32 如果没有则用下面方式进行安装: pip install pywin32 然后等待安装完成: 2.再 ...