EffectiveC#3选择is或者as操作符而不是做强制类型转换

1.用as运算符进行类型转换。因为比起盲目的强制转换它更安全,而且在运行时效率更高。

安全体现在:as操作符就算是转化一个null的引用时,也会安全的返回一个null而不会像强制转换抛出异常。

2.as和is运算符在运行时要检测转换目标的类型。如果一个指定对象不是要求转换的类型,或者它是从要求转换类型那里派生的,转换会失败。

3.as用于引用类型和可为null的类型,不可以用于值类型。

4.在进行值类型强制转换前可以先用is来安全的判断一下数据类型。

注:如果o是其它可转化为整形的类型(译注:但o并不是真正的整形),例如double,那么is运算操作会返回false

5.如下代码冗余。使用as来转换数据,那么用is来做检测是不必要的。只用检测返回类型是否为null就行了

object o = Factory.GetObject( );

MyType t = null;

if ( o is MyType )

t = o as MyType;

时间: 2024-11-07 06:07:14

EffectiveC#3选择is或者as操作符而不是做强制类型转换的相关文章

C++强制类型转换操作符 dynamic_cast

dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设置>>>>>>>>>>> dynamic_cast提供RTTI(Run-Time Type Information),也就是运行时类型识别.它对编译器有要求,需要编译器启动“运行时类型信息”这一选项.当编译器不开启RTTI时,运行含有dynam

C++强制类型转换操作符 const_cast

const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转化掉.试图使用其他三种形式的强制转换都会导致编译时的错误.(添加const还可以用其他转换符,如static_const) 3.除了添加const或删除const特性,使用const_cast符来执行其他任何类型的转换都会引起编译错误.(volatile限定符也包括,不过我不怎么了解,本文主要说const)

nodejs docker 开发最好选择yarn 进行包管理而不是npm

npm 与yarn 的区别网上一大堆的文章,我们在构建docker 镜像是应该遵守的有些原则 基础镜像尽量小 对于构建进行缓存处理 构建的docker 的文件层数尽量少 能直接运行的,就别进行重复构建了(比如go) yarn 在我们进行本地构建的时候可以帮助我们减少很多资源的在重复下载,以及校验, 加速docker 项目的构建 以下为一个简单的例子,具体与npm的比较就不用了,效果太明显了 备注: 此次docker nodejs 镜像使用的是 kkarczmarczyk/node-yarn (下

做工程师而不是做码农

时间很重要 很多人喜欢苦苦钻研一样东西,觉得知识一定要是自己思考出来的才算学会,这个精神很好,但确实最不经济的学习方法.这一点上,我吃过亏也受过益,所以现在越发体会深刻:我上学的时候,物理一直很好,属于那种下课玩玩也能考很好的类型,数学却差的出奇,我一直想不通为什么,直到后来看到一种叫NIH(Not Invented Here)中文即非我独创的心理疾病是,我才发现,MD,这是病,得治.学数学的时候,我喜欢跟公式较劲,跟定理较劲.不仅要会推导,还老是纠结于为什么别人能想出1+1=2,我为什么没有想

不用系统自带的复选框,单选按钮,选择框的样式,该怎么做

这里我主要针对pc端而言,移动端由于各个牌子的移动设备都有自己定义的复选框,单选按钮和选择框样式,这里不做讨论. pc端的默认样式大家都见过,这里直接上效果图 这是我简单做的两个自定义的复选框,单选按钮.以复选框为例,将复选框用一个div包裹起来,然后将复选框的透明度设置为0,下面来看看这个效果的代码 <style> .checks_icon{border: 1px solid red;border: 1px solid #ccc;padding: 0;height: 12px; width:

C++11 显式转换操作符

[1]显式转换操作符 以前对explicit关键字的理解可以参考随笔<explicit关键字>. 而在C++11中,标准将explicit的使用范围扩展到了自定义的类型转换操作符上,以支持所谓的“显式类型转换”. explicit关键字作用于类型转换操作符上,意味着只有在直接构造目标类型 或 显式类型转换的时候可以使用该类型. 应用示例: 1 #include <iostream> 2 using namespace std; 3 4 class ConvertTo 5 { 6 }

C++11显式转换操作符

C++11之前,已经支持显式转换操作符 #include <iostream> using namespace std; template <typename T> class Ptr { public: Ptr(T* p): _p(p) {} operator bool() const { if (_p != 0) return true; else return false; } private: T* _p; }; int main() { int a; Ptr<int

JavaScript Gerden概述

1.对象 1.1 对象使用和属性 JavaScript中所有变量都是对象,除了null和undefined 1.2 对象作为数据类型 JavaScript对象可以作为哈希表使用,主要用来保存命名的键和值的对应关系 1.3 访问属性 点操作符和中括号操作符 中括号操作符在下面2种情况下依然有效 1.动态设置属性 2.属性名不是一个有效的变量名 1.4 删除属性 删除属性的唯一方法是使用delete操作符:设置属性为undefined或者null并不能真正的删除属性,只是移除了属性和值的关联 1.5

JavaScript 秘密花园

? 对象 o 对象使用和属性 o 原型 o hasOwnProperty 函数 o for in 循环 ? 函数 o 函数声明与表达式 o this 的工作原理 o 闭包和引用 o arguments 对象 o 构造函数 o 作用域与命名空间 ? 数组 o 数组遍历与属性 o Array 构造函数 ? 类型 o 相等与比较 o typeof 操作符 o instanceof 操作符 o 类型转换 ? 核心 o 为什么不要使用 eval o undefined 和 null o 自动分号插入 ?