1.区分接口和抽象类的应用场合

区别:

   ①接口支持多继承,抽象类则不能。

   ②接口可以包含方法,属性,索引器,事件的签名,但不能有实现,抽象类则可以。

   ③接口在增加新方法后,所有的继承者都必须重构,否则编译不会通过,而抽象类不需要。

应用:

    ①如果对象存在多个功能相近且关系紧密的版本,则使用抽象类。

     ②如果对象关系不密切,但是若干功能拥有共同的声明,则使用接口。

     ③抽象类适合于提供丰富功能的场合,接口则更倾向于提供单一的一组功能。

总结:接口一旦被设计就应该是不变的。而抽象类可以随着版本的升级,增加一些功能。

 2.用多态代替条件语句

  开闭原则:对扩展开放,对修改关闭。遵从开闭原则的一次重构是,使用多态来规避不断膨胀的

条件语句。

 3.使用私有构造函数强化单例

  单例:指的是一个类型只生成一个实例对象。

       单例注意在多线程情况下,还是可能会产生第二个实例。单例一个著名的技术是“双锁定”技术。采用双锁定技术后,单例的线程安全版本为:

 public class SingTon
{
static SingTon instance = null;
static readonly object oLock = new object();
public static SingTon Instance
{
get
{
if(instance ==null)
{
lock(oLock)
{
instance = new SingTon();
}
} return instance;
}
}
}

4.区分静态类和单例

  单例是一个实例对象,而静态类不满足这点。静态类直接违反面向对象三大特性中的两项:继承和

多态。静态类无法继承其他类型;也不能让静态类作为参数和返回值进行传递。

  本质上讲,在C#中,静态类不会被认作是一个真正的对象。而单例,是一个实例对象,因为特殊需求,他被自己实现为整个系统只有一个对象。

5.用类代替enum

  如果对enum有更加多的需求,不妨使用类来代替enum。

   public class Week
{
public static readonly Week Monday=new Week();
public static readonly Week Tuesday = new Week(); int type;
private Week(int type)
{
this.type = type;
} public override string ToString()
{
switch(type)
{
case :
return "星期一";
case :
return "星期二";
}
return "星期一";
}
}

6.避免双向耦合

  双向耦合指两个类型之间互相引用。就是A类中引用B,B类中引用A。一般来说,类型之间不应该存在双向耦合,如果出现,则考虑重构。

  

C# 《编写高质量代码改善建议》整理&笔记 --(五)类型设计的更多相关文章

  1. C# 《编写高质量代码改善建议》整理&笔记 --(一)基本语言篇

     题记:这是自己的观后感,工作两年了,本来打算好好学习设计模式,或者作为客户端深入了解GPU编程的,但是突然发现还有这么一本书. <编写高质量代码改善建议>,感觉这正是自己需要的. 我是做 ...

  2. C# 《编写高质量代码改善建议》整理&笔记 --(五)成员设计

    1.可以字段应该重构为属性 2.谨慎将数组或集合作为属性 数组和集合作为属性存在会引起这样的一个分歧:如果属性是只读的,我们通常会认为他是不可改变的.但是如果将只读属性应用于数组和集合,而元素的内容和 ...

  3. C# 《编写高质量代码改善建议》整理&笔记 --(六)编码规范及习惯

    一.命名规范 1.考虑在命名空间中使用复数 System.AllCollections System.TheCollection 2.用名词和名词组给类型命名 ScoreManager UserCon ...

  4. C# 《编写高质量代码改善建议》整理&笔记 --(三)泛型&委托&事件

    1.泛型 基于泛型,我们可以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型, 确保类型安全. 1)总是优先考虑泛型 优点:可重用性,类型安全,高效率. 2)避免在泛型 ...

  5. C# 《编写高质量代码改善建议》整理&笔记 --(四)资源管理&序列化

    1.显示释放资源需继承接口IDisposable 什么是资源:C#中每一个类型都代表一种资源,而资源又分为以下两类. 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源 ...

  6. 编写高质量代码改善C#程序的157个建议——建议149:使用表驱动法避免过长的if和switch分支

    建议149:使用表驱动法避免过长的if和switch分支 随着代码变得复杂,我们很容易被过长的if和switch分支困扰. 一个类枚举类型Week如下: enum Week { Monday, Tue ...

  7. 编写高质量代码改善C#程序的157个建议——建议1:正确操作字符串

    最近拜读了陆敏技老师的<编写高质量代码改善C#程序的157个建议>,感觉不错,决定把笔记整理一遍. 建议1: 正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型.如果使 ...

  8. 博友的 编写高质量代码 改善java程序的151个建议

    编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html

  9. 编写高质量代码--改善python程序的建议(六)

    原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修 ...

随机推荐

  1. Python爬虫-尝试使用人工和OCR处理验证码模拟登入

    刚开始在网上看别人一直在说知乎登入首页有有倒立的汉字验证码,我打开自己的知乎登入页面,发现只有账号和密码,他们说的倒立的验证码去哪了,后面仔细一想我之前登入过知乎,应该在本地存在cookies,然后我 ...

  2. 关于find命令的一些知识

    在服务器运维的过程中,我们会用到这样一个命令,关于这个命令,你知道多少呢?接下来,咱们一起来研究一下它的用途. find命令主要用来在硬盘上搜索文件, find命令主要用于文件查找,列出当前目录及子目 ...

  3. ASP.NET Core Identity Hands On(2)——注册、登录、Claim

    上一篇文章(ASP.NET Core Identity Hands On(1)--Identity 初次体验)中,我们初识了Identity,并且详细分析了AspNetUsers用户存储表,这篇我们将 ...

  4. BZOJ_2661_[BeiJing wc2012]连连看_费用流

    BZOJ_2661_[BeiJing wc2012]连连看_费用流 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规 ...

  5. BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包

    BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包 题意: 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值 ...

  6. VMware workstation创建虚拟机console图文

    1. 概述2. 配置入口3. 新建虚拟机向导3.1 类型配置3.2 硬件兼容性3.3 操作系统安装3.4 客户机操作系统类型3.5 客户机的名称位置4. 客户机硬件配置选择4.1 客户机处理器配置4. ...

  7. Python多版本管理-pyenv

    经常遇到这样的情况: 系统自带的Python是2.x,自己需要Python 3.x,此时需要在系统中安装多个Python,但又不能影响系统自带的Python,即需要实现Python的多版本共存,pye ...

  8. 下拉框选择selected

    var id=$("#orderId").children('option:selected').val(); //selected选中项取值 var id=$('#orderId ...

  9. 微服务(入门四):identityServer的简单使用(客户端授权)

    IdentityServer简介(摘自Identity官网) IdentityServer是将符合规范的OpenID Connect和OAuth 2.0端点添加到任意ASP.NET核心应用程序的中间件 ...

  10. 系统的讲解 - PHP 接口签名验证

    目录 概览 常用验证 单向散列加密 对称加密 非对称加密 密钥安全管理 接口调试工具 在线接口文档 扩展 小结 概览 工作中,我们时刻都会和接口打交道,有的是调取他人的接口,有的是为他人提供接口,在这 ...