C#中检查null的语法糖,非常实用

c#处理null的几个语法糖,非常实用。(尤其是文末Dictionary那个案例,记得收藏)

??
如果左边是的null,那么返回右边的操作数,否则就返回左边的操作数,这个在给变量赋予默认值非常好用。

int? a = null;
int b = a ?? -1;
Console.WriteLine(b);  // output: -1

 

??=
当左边是null,那么就对左边的变量赋值成右边的

int? a = null;
a ??= -1;
Console.WriteLine(a);  // output: -1

 

?.
当左边是null,那么不执行后面的操作,直接返回空,否则就返回实际操作的值。

using System;
public class C {
    public static void Main() {
        string i = null;
        int? length = i?.Length;
        Console.WriteLine(length ?? -1); //output: -1
    }
}

 

?[]
索引器操作,和上面的操作类似

using System;
public class C {
    public static void Main() {
        string[] i = null;
        string result = i?[1];
        Console.WriteLine(result ?? "null"); // output:null
    }
}

注意,如果链式使用的过程中,只要前面运算中有一个是null,那么将直接返回null结果,不会继续计算。下面两个操作会有不同的结果。

using System;
public class C {
    public static void Main() {
        string[] i = null;
        Console.WriteLine(i?[1]?.Substring(0).Length); //不弹错误
        Console.WriteLine((i?[1]?.Substring(0)).Length) // System.NullReferenceException: Object reference not set to an instance of an object.
    }
}

 

一些操作

//参数给予默认值
if(x == null) x = "str";
//替换
x ??= "str";


//条件判断
string x;
if(i<3) 
    x = y;
else 
{  
    if(z != null) x = z; 
    else z = "notnull";
}
//替换
var x = i < 3 ? y : z ?? "notnull"


//防止对象为null的时候,依然执行代码
if(obj != null) 
    obj.Act();
//替换
obj?.Act();

//Dictionary取值与赋值
string result;
if(dict.ContainKey(key))
{
    if(dict[key] == null) result = "有结果为null";
    else result = dict[key];
}
else 
    result = "无结果为null";
//替换
var result= dict.TryGetValue(key, out var value) ? value ?? "有结果为null" : "无结果为null";

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 前端,什么是跨域,及跨域常见的解决方案(简讲)「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。一、认识跨域1、同源符合”协议+域名+端口”三者相同,就是同源2、同源策略同源策略,其初衷是为了浏览器的安全性,通过以下三种限制,保证浏览器不易受到XSS、CSFR等攻击。Cookie、LocalStorage和IndexDB无法读取DOM和Js对象无法获得AJAX请求不能发送3、跨域引入同源对概念,是因为我们常指对跨域,其实就是浏览器同源策略限制的一类请求场景。4、常见跨域情景URL说明是否允许通信http://www.domain.com/a.jshttp://www.domain.com/b.jshttp://www.domain.com/lab/c.js同一域名,不同文件或路径允许http://www.domain.com:8000/a.jshttp://www.domain.com/b.js同一域名,不同端口不允许http://www.domain.com/a.jshttps://www.domain.com/b.js同一域名,不同协议不允许http://www.domain.com/a.jshttp://192.168.4.12/b.

  • Salesforce Apex 自定义排序类(二)

    当Listview中的项目不是从Object中取得,而是自定义时,修改排序类,进行商品名排序。OpportunityListViewController.clspublicwithsharingclassOpportunityListViewController{ @AuraEnabled(cacheable=true) publicstaticList<OpportunityWrapper>getOpportunityListView(){ List<OpportunityWrapper>inputWappers=newList<OpportunityWrapper>(); OpportunityWrapperwapper1=newOpportunityWrapper(); wapper1.name='案件1'; wapper1.productName='C商品'; wapper1.stageName='Prospecting'; wapper1.amount='500'

  • 深入解析 CSS 选择器

    本文首发于政采云前端团队博客:深入解析CSS选择器 https://www.zoo.team/article/about-css-selector一、前言CSS选择器对HTML页面中的元素实现一对一,一对多或者多对一的控制,从而给指定元素添加样式。同时还要考虑一个元素被赋予多个样式时如何生效的问题,这个就和选择器优先级相关了。优先级是基于不同种类选择器组成的匹配规则。浏览器通过优先级来判断哪些样式与一个元素最为相关,从而在该元素上应用这些样式。二、CSS选择器的分类三、不同种类选择器的用法接下来我们看一看基本选择器之外的其他选择器。属性选择器通过已经存在的属性名或属性值匹配元素<style> div{margin-top:20px;} /*带有属性title的元素*/ [title]{background:#faf3e0;} /*带有属性class且值为div1的元素*/ [class=div1]{background:#eabf9f;} /*带有属性attr并且该属性是一个以空格作为分隔的值列表,其中至少有一个值为attr-test2的元素*/ [attr~=attr-t

  • LeetCode21-40题汇总,速度收藏!

    今天把最近发布的21-40篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相信很多人都没看过,如果对于算法感兴趣的,建议可以每篇认真阅读一下! LeetCode1-20题汇总,速度收藏!LeetCode刷题实战21:合并两个有序链表 LeetCode刷题实战23:合并K个升序链表 LeetCode刷题实战24:两两交换链表中的节点 LeetCode刷题实战25:K个一组翻转链表LeetCode刷题实战26:删除排序数组中的重复项 LeetCode刷题实战27:移除元素 LeetCode刷题实战28:实现strStr() LeetCode刷题实战29:两数相除LeetCode刷题实战30:串联所有单词的子串 LeetCode刷题实战31:下一个排列 LeetCode刷题实战32:最长有效括号 LeetCode刷题实战33:搜索旋转排序数组 LeetCode刷题实战34:在排序数组中查找元素 LeetCode刷题实战35:搜索插入位置 LeetCode刷题实战36:有效的数独LeetCode刷题实战37:解数独 LeetCode刷题实战38:外观数列 LeetCode

  • synchronized到底锁住的是谁?

    题目:利用5个线程并发执行,num数字累计计数到10000,并打印。1/**2*Description:3*利用5个线程并发执行,num数字累加计数到10000,并打印。4*2019-06-135*CreatedwithOKevin.6*/7publicclassCount{8privateintnum=0;910publicstaticvoidmain(String[]args)throwsInterruptedException{11Countcount=newCount();1213Threadthread1=newThread(count.newMyThread());14Threadthread2=newThread(count.newMyThread());15Threadthread3=newThread(count.newMyThread());16Threadthread4=newThread(count.newMyThread());17Threadthread5=newThread(count.newMyThread());18thread1.start();19

  • 你能说说Java中的反射机制吗?

    作者:火星十一郎 https://www.cnblogs.com/hxsyl一.概念反射就是把Java的各种成分映射成相应的Java类。Class类的构造方法是private,由JVM创建。反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。Java的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C或者C++中就没有办法在程序中获得函数定义相关的信息。(来自Sun)JavaBean是reflection的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过reflection动态的载入并取得Java组件(类)的属性。反射是从1.2就有的,后面的三大框架都会用到反射机制,涉及到类"Class",无法直接newCLass(),其对象是内存里的一份字节码.  Class类的实例表示正在运行的Java应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为Class对象

  • 实用主义:面试中的日常闭包

    题目for(vari=0;i<100;i++){ setTimeout(()=>{ console.log(i); },0); }复制求输出结果。 答案是:100,100,100,100······· 这道题就是涉及到了变量的作用域。因为ES5没有块级作用域,因此for循环中使用var声明的变量i是全局变量,而setTimeout()是一个异步函数,在这里表示在0s后,将console.log(i)加入事件池。然而for中的循环是同步的,因此,同步执行for中的循环,此时i已经变为了100,然后console.log(i)就是100了改进方法运用闭包for(vari=0;i<100;i++){ (function(i){ setTimeout(()=>{ console.log(i); },0); })() }复制通过闭包保存i当时的值。ES6方法for(leti=0;i<100;i++){ setTimeout(()=>{ console.log(i); },0); }复制通过let声明的变量有了块级作用域,因此,console.log中的i值是当

  • 价格一个月“腰斩”,比特币现金小费机器人“Tippr”却火了

    比特币从巅峰时期的近2万美元,到跌破1万美元大关,仅仅用了一个月时间,正当大家怀疑比特币的泡沫是否已破裂时,最近,一种新的比特币现金(BCH)小费机器人“Tippr”却意外火了,完成数千笔BCH小额支付。根据Tippr的说明,“我是Reddit和Twitter上的比特币现金小费机器人,可以让你很容易地把比特币现金发送给其他用户。”在Reddit和twitter中,Tippr是用来给好的内容打赏比特币现金的一个机器人。如果你在Reddit和twitter看到你喜欢的东西,想要给作者打赏就可以通过这个机器人。收件人只需有一个BCH钱包,当有人给收件人打赏后,收件人就会通过Tippr收到一个提示信息,显示出打赏的金额和地址。仅2017年12月,通过Tippr的资金就有差不多5万美金的BCH。在Reddit和Twitter上,可以很容易找到BCHTippr机器人。目前有很多用户正在使用该程序来提示用户。Reddit上的Tippr用户只需调用“/u/tippr”并输入想要发送的资金数量并指定其他用户。同样的事情可以在Twitter上通过标记机器人和接收端的人并输入“$0.50@tipprbot”

  • windows API 开发飞机订票系统 图形化界面 (二)

    首先,用到的数据结构的定义、以及全局变量和函数的声明如下:1//Flight.c:定义应用程序的入口点。 2// 3#include"stdafx.h" 4 5//订单 6typedefstructOrderForm{ 7TCHARIdNum[32];//订单用户身份证号 8intOrder_Number;//订单号 9intTickets_Num;//订票数量 10TCHARFlight_Number[16];//航班号 11TCHARDeparture[16];//出发地 12TCHARDestination[16];//目的地 13TCHARDate[16];//出发日期 14TCHARTakeOff_Time[16];//起飞时间 15TCHARLanding_Time[16];//降落时间 16structOrderForm*Next;//所有订单链表next 17structOrderForm*psgNext;//用户订单链表next 18}OrderForm; 19 20//乘客订单链表 21typedefstructPsgOrderLink{ 22i

  • 小程序 购物组件 小商店 服务端接口 access_token

    微信新推出的小商店,分为小商店、购物组件两种,前者包含一套简单的电商模块,后者是插件化的模块,可嵌入到小程序中,文中围绕购物组件展开。 文档中对购物组件的介绍分为两个部分,组件接口、开放接口,官网戳这里。 组件接口 给出5个界面:商品详情页、购物车页、订单列表页、订单详情页以及售后详情页。简单跳转即可 letproductId=1; wx.navigateTo({ url:'plugin-private://wx34345ae5855f892d/pages/productDetail/productDetail?productId=${productId}', }); 复制 开放接口 开放接口提供商品管理的一些功能。 物组件的默认首页,虽然没有公开,但是可以通过商品详情页进入,或者直接用plugin-private://wx34345ae5855f892d/pages/home/home路径进入。这里有个问题,这个首页并没有功能按钮返回上一页,也就是说,如果终端上没有外部的返回功能,就没法返回上一页了,社区里也是怨声载道。。。 假如我们需要做一个列表页面展示商品,用来代替

  • leetcode 146/460 LRU/LFU

    leetcode146/460LRU/LFU 题意: LRU 运用你所掌握的数据结构,设计和实现一个 LRU(最近最少使用)缓存机制。它应该支持以下操作:获取数据get和写入数据put。 获取数据get(key)-如果密钥(key)存在于缓存中,则获取密钥的值(总是正数),否则返回-1。 写入数据put(key,value)-如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 LFU 设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。 get(key) -如果键存在于缓存中,则获取键的值(总是正数),否则返回-1。 put(key,value) -如果键不存在,请设置或插入值。当缓存达到其容量时,它应该在插入新项目之前,使最不经常使用的项目无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,最近最少使用的键将被去除。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com

  • One day

    1.c的格式化输入输出: printf()和scanf()函数可以较好实现格式化输入输出,例子如下: printf("%3d",3);//结果为__3(_为空格) printf("%03d%02d",5,3);//结果为5__3 printf("%.2lf",3.14156);//结果为3.14 scanf("%2d",&a);//当输入流为123时,a=12 scanf("[%2d]",&a);//当输入流为[123456][123]时,a=12 scanf("%d-%d-%d",&a,&b,&c);//当输入流为123-1-32时,a=123,b=1,c=32 更高级的还要限制输入字符集等功能,大家有兴趣可以百度2.ACM常用变量类型: int32位整型变量,能表达数据范围为-2^31~2^31-1 char8位整型变量,能表达数据范围为0~255,可表示整数或字符,字符以ASCII码形式存储,char数组可以用于存储字符串 doub

  • 基于docker的sqli-labs搭建

    一键代码: curlhttps://files-cdn.cnblogs.com/files/kagari/sqli-labs.sh|bash复制 https://files-cdn.cnblogs.com/files/kagari/sqli-labs.sh 1#!/bin/bash 2apt-getupdate 3apt-get-yinstallapt-transport-httpsca-certificatescurlsoftware-properties-commongit 4curl-fsSLhttp://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg|sudoapt-keyadd- 5add-apt-repository"deb[arch=amd64]http://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release-cs)stable" 6apt-get-yupdate 7apt-get-yinstalldocker-ce 8aptinstall-ygit 9echo'{

  • 9 - 定义网格的操作

    在项目树中,网格操作是可选的网格细化设置,为求解器生成网格提供了建设性的指导。这种指导网格生成的技术叫做“播种(Seeding)”。 “播种”是指通过使用AssignMeshOperation命令。   你可以设置求解器,以减小表面或者体积内的“四面体”网格的最大尺寸,直至减少至特定值。 length-basedmeshrefinement 或者可以设置,表面或者体积内的所有的“四面体”网格尺寸均小于某个特定的值。 skindepth-basedmeshrefinement LengthBasedMeshRefinement 基于长度的网格细化设置可以控制四面体网格单元的边长与整个网格的生成,如果你不清楚需要多精细的网格,可以通过RestricttheNumberofAdditionalElements 设置网格数量的上限。 AssigningLength-BasedMeshRefinementonObjectFaces 求解器会根据设置的长度生成网格,直到它们的长度小于或者等于设定值 默认的值是选择的面的最大边长的20%。 对于一阶基础函数,推荐的对于辐射边界的最大网格

  • 10.31 下午考试

    巧克力棒(chocolate)TimeLimit:1000msMemoryLimit:64MB题目描述LYK找到了一根巧克力棒,但是这根巧克力棒太长了,LYK无法一口吞进去。具体地,这根巧克力棒长为n,它想将这根巧克力棒折成n段长为1的巧克力棒,然后慢慢享用。它打算每次将一根长为k的巧克力棒折成两段长为a和b的巧克力棒,此时若a=b,则LYK觉得它完成了一件非常困难的事,并会得到1点成就感。LYK想知道一根长度为n的巧克力棒能使它得到最多几点成就感。输入格式(chocolate.in)第一行一个数n。输出格式(chocolate.out)一个数表示答案。输入样例7输出样例4数据范围对于20%的数据n<=5。对于50%的数据n<=20。对于80%的数据n<=2000。对于100%的数据n<=1000000000。样例解释将7掰成3+4,将3掰成1+2,将4掰成2+2获得1点成就感,将剩下的所有2掰成1+1获得3点成就感。总共4点成就感。 /* 发现ans=n-c(n)。c(n)表示n的二进制中1的个数。 粘一个严谨的证明(其实我自己也没认真看) 我们对c(n

  • 【git】Git回退代码到指定版本

    1.查看所有的历史版本,获取你git的某个历史版本的id,gitlog2.回退本地代码库:gitreset--hardID3.推送到远程服务器:gitpush-f-uoriginmaster4.重新拉代码:gitpull

  • ModuleNotFoundError: No module named &#39;xlutils.copy&#39;; &#39;xlutils&#39; is not a package

    解决python在命令行中运行时导入包失败,出现错误信息"ModuleNotFoundError:Nomodulenamed***"   转自https://www.cnblogs.com/dreamyu/p/7889959.html https://www.cnblogs.com/lifeofershisui/p/8135702.html 大家可能知道我们的工程在IDE(Pycharm)中运行和我们在cmd中运行的路径是不一样的,在pycharm中运行时, 会默认pycharm的目录+我们的工程所在目录为运行目录,而在cmd中运行时,会以我们的工程目录所在目录来运行 而在import包时,会首先从pythonPATH的环境变量中来查看包,如果没有你的PYTHONPATH中所包含的目录没有 工程目录的根目录,那么你在导入不是同一个目录下的其他工程中的包时会出现import错误 解决方法:在你运行的文件中将你的工程目录加入到PYTHONPATH中,具体方法如下:  importos,sys sys.path.append("path") //path为你

  • arguments

    <script>/**在调用函数时,浏览器每次都会传递进两个隐含的参数*1.函数的上下文对象this*2.封装实参的对象arguments*-arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度*-在调用函数时,我们所传递的实参都会在arguments中保存*-arguments.length可以用来获取实参的长度(计算实参的数量)*-我们即使不定义形参,也可以通过arguments来使用实参*只不过比较麻烦*arguments[0]表示第一个实参*arguments[1]表示第二个实参...*-定不定义形参,实参都会在arguments中保存*它里面有一个属性叫callee,*这个属性对应一个函数对对象,就是当前正在执行的函数对相关*/functionfun(a,b){//console.log(argumentsinstanceofArray);//false看它是不是属于array类型//console.log(Array.isArray(arguments));//false用它可以检查一个对象是不是数组//console.log(argu

  • 力扣算法JS LC [455. 分发饼干] LC [376. 摆动序列]

    ​ LC455.分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给孩子i,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 示例1: 输入:g=[1,2,3],s=[1,1] 输出:1 解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 所以你应该输出1复制 示例2: 输入:g=[1,2],s=[1,2,3] 输出:2 解释: 你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出2.复制 解题思路:分别进行排序,然后从后面依次进行比较。 代码: varfindContentChildren=function(g,s){   g=g.sort((a,b)=>a

  • 知识百科:中文字号、磅和像素对照关系

    本文介绍中文字号、磅(pt)和像素(px)的对照关系,方便大家设计网页时参考合适的字号,一般网页正文字体为12px到16px,相当于9-12磅字号大小,标题文字可以稍大一点,具体参见下文表格字体大小,本文内容来源于网络汇总,做了点补充,如有错误,欢迎指出。 一、基本单位概念 单位 中文名称 转换 inch 英寸 1英寸=2.54厘米 cm 厘米   pt 磅或点数,是point简称 1pt=1/72(英寸) px 像素,是pix简称         二、中文字号大小、磅和像素对照关系 下表参照显示器96dbi(每英寸点数)显示进行换算结果。比如:6.5pt=6.5*1/72*96=8.6px,像素肯定不能出现小数点的,一般是取小显示。下表字体已经按照各行所代表的字号大小进行显示。   字号 磅(pt) 像素(px) 厘米 小六 6.5 8px 0.22 六号 7.5 10px 0.26 小五 9 12px 0.31 五号 10.5 14px 0.37 小四 12 16p

  • Matlab commonly used function

    1.tabulate() 求矩阵中各个不同的值在矩阵中出现的次数.  >>a=[2468;3563;9853;76 40]; >>a a=      2     4     6     8      3     5     6     3      9     8     5     3      7&n

相关推荐

推荐阅读