前言

先来看一个例子:

假设updated 是一个委托:

if(updated!=null)
{
updated();
}

请问上面写法在多线程中安全吗?如果不安全会抛出什么异常呢?

正文

上面的答案是不安全,因为可能运行完updated!=null的时候,另一个线程将updated重置为null,这时候就会抛出异常,异常为:nullreferenceException。

换一种写法:

var handle=updated;
if(handle!=null)
{
updated();
}

那么这样写是否会抛出异常呢?

这样写是不会抛出异常的。

为何?

因为当updated为空的时候,handle依然为引用,所以不会出现问题。

这样写的缺点,这时候不仅不优雅,而且有一个问题就是每次都要创建一个handle。

那么在c#6.0中,handle?.invoke(this);

这是写为什么就线程安全?

安装字面理解还是如果不为null,然后执行啊,有啥区别。

问题就是在c# 运行这个的时候是一个整体,如果handle不为空,就去执行invoke,而不是下一条语句。

怎么说啊,因为c#是解释型语言代码是一条一条运行的,也就是说c# 运行的最下单位是一条语句。

c# 优化代码的一些规则——判断null值得不同写法[六]的更多相关文章

  1. c# 优化代码的一些规则——使用is或as和强制类型转换的区别[三]

    前言 使用as和强制类型转换的时候的区别是否仅仅是代码形式上的区别. 答案是肯定不是的. 正文 看两段代码: object o = Factory.GetObject(); Student stude ...

  2. c# 优化代码的一些规则——字符串使用优化[四]

    前言 在我们的程序中,经常使用到字符串,字符串的写法非常多,但是有一个问题就是我们写的字符串是否合适呢? 正文 内插符 介绍一个东西叫做内插字符,如下: static void Main(string ...

  3. c# 优化代码的一些规则——优先隐式类型[一]

    前言 说到底就是优先使用var,这个关键字,在c# 3.0中出现了. 首先要确认几点,一个就是var 是静态变量,而不是动态变量,也就是说使用var 你是不必去担心性能问题得, 百度百科: 1)静态存 ...

  4. c# 优化代码的一些规则——const 和 readonly[二]

    前言 在c# 的世界中,在初学的时候,可能很难区分readonly 和 const,两者都是不可修改. 看到这两个单词,我们想的是,最多他们的区别也不会太大.然后事实却出乎我们的意料. 正文 这两个声 ...

  5. PL/SQL 美化器&规则解释&优化代码

    前言 PLSQL有非常强大的自定义设置功能,比如美化文件规则, 使用者可以自行定义编辑规则,以便更好的优化SQL语句,增加可读性. 例如以下的部分代码,又长,分段不好,空格太多,结构散乱,还没有注释. ...

  6. 如何优化代码中大量的if/else,switch/case?

    前言 随着项目的迭代,代码中存在的分支判断可能会越来越多,当里面涉及到的逻辑比较复杂或者分支数量实在是多的难以维护的时候,我们就要考虑下,有办法能让这些代码变得更优雅吗? 正文 使用枚举 这里我们简单 ...

  7. [好文翻译]WEB前端性能优化的14条规则

    作为一个半前端工程师,而且只会写点HTML5和CSS3的“假”前端工程师,为了能更好地理解一下前端的花花世界,最近拜读了<高性能网站建设指南>一书,对作者提出的前端性能优化的14个规则获益 ...

  8. Yahoo网站性能优化的34条规则

    摘自:http://blog.chinaunix.net/uid/20714478/cid-74195-list-1.html Yahoo网站性能优化的34条规则 1.尽量减少HTTP请求次数 终端用 ...

  9. JS中判断null、undefined与NaN的方法

    写了个 str ="s"++; 然后出现Nan,找了一会. 收集资料如下判断: 1.判断undefined: 代码如下: <span style="font-siz ...

  10. 为duilib的MenuDemo增加消息响应,优化代码和显示效果

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/38253297 第一部分 我在前一段时间研究了怎么制作duilib的菜单, ...

随机推荐

  1. ants - 目前开源最优的协程池

    ants - 目前开源最优的协程池 目前我们的项目重度使用 ants 协程池,在开启一个 go 的时候并不是用 go 关键字,而是用一个封装的 go 函数来开启协程.框架底层,则是使用 ants 项目 ...

  2. JS案例-网页轮播图

    鼠标经过轮播图模块,左右按钮提示,离开隐藏左右按钮 点击右侧按钮一次,图片往左播放一张,以此类推,左侧按钮同理 图片播放的同时,下面小圆圈模块跟随一起变化 点击小圆圈,可以播放相应图片 鼠标不经过轮播 ...

  3. [.Net]使用Soa库+Abp搭建微服务项目框架(一):Abp与DDD相关知识回顾

    ​ 在企业中大型项目中,随着业务的不断拓展,项目发展到一定程度,需要寻求项目的各模块解耦,独立成为微服务.如何实现呢? 首先我们先来简单回顾一下Abp框架怎样实现(DDD)领域驱动设计的,Abp框架的 ...

  4. ThreadLocal父子间通信的四种解决方案

    ThreadLocal父子间通信的四种解决方案 ThreadLocal 是存储在线程栈帧中的一块数据存储区域,其可以做到线程与线程之间的读写隔离. 但是在我们的日常场景中,经常会出现父线程需要向子线程 ...

  5. 重新认识 tag 快照 git (项目临时添加需求,之前有分支合并,导致从节点拉分支不行了,因为没有tag快照)

    之前的tag认知 之前一直以为tag就是在git的提交commit上打一个标,然后可以拉出分支.之前没太重视. 因为我觉得 可以直接从某个commit直接拉出分支,这打不打tag无所谓 翻车现场 今天 ...

  6. Vite-vue3 架构设计

    Vite-vue3 架构设计 基础信息 Gitee项目地址:https://gitee.com/pengchenggang/vite-vue3 1 创建vite-vue3 初始化脚本 $ npm in ...

  7. 基于ESP8266的JSON解析实例分析

    什么是JSON?   JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.采用完全独立于编程语言的文本格式来存储和表示数据.其简洁和层次结构清晰的特点使得 J ...

  8. day06-IO流应用01

    Java坦克大战06 8.IO流应用01 坦克大战6.0版 增加功能: 防止敌人坦克重叠运动 记录玩家的成绩(累计击毁坦克数),存盘退出 记录当时的敌人坦克坐标,存盘退出 玩游戏时,可以选择是开新游戏 ...

  9. 修改Tomcat服务器Server Locations

    首先双击我们集成好的Tomcat服务器  修改Server Locations选项  Specify the server path (i.e. catalina.base) and deploy p ...

  10. K8S-1.23.17+Ceph+KubeSphere 一主二从部署攻略

    K8S部署攻略 此教程以一主二从为例,需要三台服务器. 主机最低需求: 4 核 CPU,4 GB 内存,硬盘:20 GBx2 (需保留一个未分区的磁盘) 从机最低需求: 4 核 CPU,8 GB 内存 ...