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编程中经常需要判断文件状态.字符串是否相等以及两个数值大小等情况,基于这些比较结果再做执行相关操作.本文主要讲述文件状态.字符串.数值大小的判断比较方法. 文件状态判断 文件状态的判断通常使 ...
随机推荐
- MyCms 自媒体 CMS 系统 v2.7,支持自定义页面
MyCms 是一款基于Laravel开发的开源免费的自媒体博客CMS系统,助力开发者知识技能变现. MyCms 基于Apache2.0开源协议发布,免费且不限制商业使用,欢迎持续关注我们. V2.7 ...
- 从故纸堆里,回顾下Web技术的发展历程
通过对比这些年的计算机图书来让大家感受下前些年Web技术的发展历程. Web开发框架,目前是Spring Boot+JPA,我正好出过本书,从中大家能感受到现在的技术. <Spring Boot ...
- .NET 诞生已20周年,您的 .NET 技能是否还停留在2010 年?
20年来,我们见证了超过上千万.NET 开发员,当前有600万.NET 开发者正在使用.NET技术构建各类解决方案.今天,IT市场对.NET 开发人员的需求达到了前所未有的程度,特别是在中国,各大公司 ...
- js instanceof 解析
js中的instanceof运算符 概述 instanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上 语法 obj instanceofOb ...
- pageX的兼容性处理1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Serializable接口中serialVersionUID字段的作用
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类. 如果接收者加 ...
- onclick="func()"和 onclick = "return func()"区别
onclick="func()" 表示只会执行 func , 但是不会传回 func 中之回传值onclick = "return func()" 则是 执行 ...
- yum本地源仓库安装报错 被锁定如何解决?
yum安装报错被锁定如何解决 上图!!!!!如图的报错 解决方法: 是不是很简单 智商在地上摩擦~~~
- DNS域名解析之分离解析
分离解析配置 1.为网关服务器配置双网卡 , 在关机状态下再添加一块网卡,重启系统 ifconfig ens36 12.0.0.1/24 ifconfig 2.安装bind软件包 yum instal ...
- Docker的数据管理、网络通信和dockerfile
Docker的数据管理.网络通信和dockerfile 目录 Docker的数据管理.网络通信和dockerfile 一.Docker的数据管理 1. 数据卷 1.1 数据卷定义 1.2 数据卷配置 ...