转换操作符为类之间引入了一种“可替换性”(substitutability)。“可替换性”表示一个类的实例可以替换为另一个类的实例。

public class ClassA
{ } public class ClassB
{
public static implicit operator toClassA(ClassB classB)
{
return new ClassA();
}
}

在某个类型定义了转换操作符之后,实际上是告诉编译器这些类型可以当做目标类型使用。不过,这样的替换经常会导致一些难以理解的BUG,因为这个类型不能完美的当做目标类型的替代品。

public void SetValue(ClassA classA)
{
classA.Value1 = classA.Vaule2 * 2;
classA.Value2 += 1;
} //执行SetValue
ClassB classB = new ClassB();
SetValue(classB);

上述代码就会出现问题。SetValue()方法接收一个ClassA作为参数。因此,编译器通过转换操作把ClassB创建一个临时ClassA对象,然后传递给SetValue()当参数。这个临时对象会被SetValue()修改,随后立即变成垃圾对象。结果ClassB什么都没有发生。

如果希望将一个类型转换成另一个类型,那么最好使用构造函数。这种做法更能清楚的表示出创建对象的行为。

public class ClassA
{
public ClassA(ClassB classB)
{
//code ...
}
}
public class ClassB
{ }
//转换并执行SetValue
ClassB classB = new ClassB();
ClassA classA = new ClassA(classB);
SetValue(classA);

通过使用构造函数来代替转换操作符,不但没有丢失任何功能,反而使得创建工作变动更加清晰。

《C#高效编程》读书笔记09-避免在API中使用转换操作符的更多相关文章

  1. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  2. 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化

    <深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...

  3. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

  4. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  5. 强化学习读书笔记 - 09 - on-policy预测的近似方法

    强化学习读书笔记 - 09 - on-policy预测的近似方法 参照 Reinforcement Learning: An Introduction, Richard S. Sutton and A ...

  6. C++Windows核心编程读书笔记

    转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...

  7. unix环境高级编程-读书笔记与习题解答-第一篇

    从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...

  8. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  9. MacTalk·人生元编程 - 读书笔记

    简介 <MacTalk·人生元编程>是一本随笔文集,主要内容来自作者的微信公众平台"MacTalk By 池建强".本书撰写于2013年,书中时间线却不止于此.作者以一 ...

随机推荐

  1. maven仓库的管理_Nexus

    maven仓库管理的软件有很多,这里介绍的是Sonatype的nexus 一.下载 下载地址:https://yunpan.cn/cv2JhzwQuvb7B  访问密码 932d 二.安装 2.1.将 ...

  2. USACO-Your Ride Is Here(你的飞碟在这儿)-Section1.2<1>

    [英文原题] Your Ride Is Here It is a well-known fact that behind every good comet is a UFO. These UFOs o ...

  3. LoadRunner 服务器(Linux、Windows) 性能指标度量说明

    服务器资源性能计数器 下表描述了可用的计数器: 监控器 度量 说明 CPU 监控器 Utilization 监测 CPU 利用率. 磁盘空间监控器 Disk space 监测可用空间 (MB) 和已用 ...

  4. RN控件之ProgressBarAndroid进度条

    /** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import Rea ...

  5. JS设置cookie、读取cookie、删除cookie(转)

    JS设置cookie.读取cookie.删除cookie 转载  2015-04-17   投稿:hebedich    我要评论 Js操作Cookie总结(设置,读取,删除),工作中经常会用到的哦! ...

  6. 12、geo数据上传

    1.注册一个NCBI账户 注册geo账户(老用户和新用户): https://www.ncbi.nlm.nih.gov/geo/submitter/ 有3个月的时间 GEO DataSets > ...

  7. [MySQL] Data too long for column 'title' at row 1

    李刚轻量级JavaEE第六章的坑..艹李刚自己有没试过这些代码的啊,6.4这一份HqlQuery.java里需要的表,根本就跟他提供的sql脚本对不上啊..坑爹啊,而且字符编码集也有问题. 出现这个原 ...

  8. Asp.net Core 使用 EntityFrameworkCore 1.1

    前言 相比大家也在开发中是非常喜欢用ORM的.今天就来介绍一下EntityFrameworkCore的使用方法. 自从EF Core升级到1.1之后,确实变化挺大的.如果没试过真的不知道坑是挺多的.今 ...

  9. 8、泛型程序设计与c++标准模板库2.2向量容器

    向量容器属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问).这一点与c++语言支持的基本数组类型相同,但基本数据类型不是面向对象的.而面向对象的向量是动态结构 ...

  10. 利用MVC的Area作为二级域名

    此处使用的域名是我改了系统的hosts文件达到的 测试成功! 全局的注册方式 在Area的注册文件里进行配置 一个Area和一个外部的Controller 废话不多说,提供DEMO 下载地址