前言

先来看一个例子:

假设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. 协议SPI:四线同步全双工 W25Qxx

    SPI传输速度快80M,富家子弟最简单最快速完成 SCK-时钟 MOSI主机输出(DO),从机输入 MISO(DI) SS Slave Select(CS Chip Select)从机选择线,低电平有 ...

  2. 单词本z ambition 雄心 amb = ab = about = around = 环绕

    ambition 雄心 amb = ab = about = around = 环绕 it = go = 走 ion 名词 重点是 amb 环绕 这里是抽象含义 表示内心向外扩展 所以是雄心 ambu ...

  3. node开发命令行脚本 / commander

    1. 脚本第一行添加 #!/usr/bin/env node // index.js #!/usr/bin/env node console.log('hello world') 2. package ...

  4. C++一些新的特性的理解

    一.智能指针 为什么需要智能指针? 智能指针主要解决一下问题: 内存泄漏:内存手动释放,使用智能指针可以自动释放 共享所有权的指针的传播和释放,比如多线程使用同一个对象时析构的问题. C++里面的四个 ...

  5. [剑指 Offer II 114. 外星文字典] 拓扑排序

    import java.util.*; class Solution { public static void main(String[] args) { Solution solution = ne ...

  6. vim下删除swp文件

    vim下删除swp文件 几个选项的内涵 [O]pen Read-Only 只读的方式打开 (E)dit anyway 编辑模式打开,但是不会载入存盘的内容 (R)ecover 编辑模式打开并且加载暂存 ...

  7. 07.Java类加载问题

    目录介绍 7.0.0.1 Java内存模型里包含什么?程序计数器的作用是什么?常量池的作用是什么? 7.0.0.2 什么是类加载器?类加载器工作机制是什么?类加载器种类?什么是双亲委派机制? 7.0. ...

  8. 关于三维模型OBJ格式轻量化压缩必要性探讨

    关于三维模型OBJ格式轻量化压缩必要性探讨 三维模型的OBJ格式轻量化压缩在当前的计算机图形学和虚拟现实应用中具有重要的必要性.以下是对三维模型OBJ格式轻量化压缩必要性的分析: 1.提高加载和传输效 ...

  9. 记录--vue刷新当前页面

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 项目当中如果做新增/修改/删除等等操作通常情况下都需要刷新数据或者刷新当前页面. 思路 (1)如果页面简单,调用接口刷新数据即可. ...

  10. 应急响应靶机训练-Linux2

    靶机来源: 知攻善防实验室公众号 https://mp.weixin.qq.com/s/xf2FgkrjZg-yWlB9-pRXvw 我是在另一台主机上通过ssh连接到靶机进行解题的,我的ip为192 ...