1.可以字段应该重构为属性

2.谨慎将数组或集合作为属性

  数组和集合作为属性存在会引起这样的一个分歧;如果属性是只读的,我们通常会认为他是不可改变的。但是如果将只读属性应用于数组和集合,而元素的内容和数量却仍旧可以随意更改。

  建议:如果某个类型含有集合概念的属性,那么他的可见性应该为private或protected,并且,它更应该是一个字段。类型对外只公开必要的方法来操作这个集合。

3.构造方法应初始化主要属性和字段

  类型一旦被实例化,那么就应该被视为具有完整的行为和属性。

4.不要在构造方法中调用虚成员

  因为子类中需要重写的虚方法可能会引用子类未初始化的成员。

5.优先考虑将基类型或接口作为参数传递

  除了公开基类型或接口外,基于同样的道理,方法的参数也应该考虑基类型或接口。

6.用params减少重复参数

  如果方法的参数数目不定,且参数类型一致,则可以使用params关键字减少重复的参数声明。

  void Method(params int[] nums){}

7.静态方法与实例方法没有区别

  静态方法在加载时机和内存使用上与实例方法完全一致。类的实例对象在第一次使用时被加载到

Loader Heap上。类型对象包括其自身的指针,自身的静态字段,方法表等。在这个方法表中,无论是

静态方法还是实例方法都会被存储起来。

  如果一定要说区别,唯一的区别就是我们需要使用实例方法的时候,首先应该有实例对象。

从设计角度,如果一个方法跟类型本身有关系,那么应该被设计成静态方法;如果跟类型的实例对象有关系,那么应该被设计成实例方法。

8.使用扩展方法,向现有类型“添加”方法

  考虑如何让一个sealed类型具备新的行为。我们可能会考虑修改设计,直接修改sealed类型,然后发布新版本,但这依赖你拥有全部的源码,这不好。对于我们来说,FCL是一组第三方公司(微软)提供给

我们的最好的API。静态类中静态方法中,增加:this关键字

public class Student
{
public bool GetSex()
{
return false;
}
} public static class StudentExtension
{
public static string GetSexSting(this Student student) //!!!!重点
{
return student.GetSex() == false ? "男" : "女";
}
}
class Program
{
static void Main(string[] args)
{
Student sth = new Student();
Console.WriteLine(sth.GetSexSting());
Console.WriteLine();
}
}

扩展方法要求:

      扩展方法必须在静态类中,扩展方法必须是静态的;

      第一个参数必须是要扩展的类型,且必须加上了this关键字

扩展方法注意:

    ①可以扩展密封类

    ②可以扩展第三方程序集中的类型

    ③不支持扩展事件,属性。但是可以扩展接口。

  

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

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

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

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

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

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

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

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

    1.区分接口和抽象类的应用场合 区别: ①接口支持多继承,抽象类则不能. ②接口可以包含方法,属性,索引器,事件的签名,但不能有实现,抽象类则可以. ③接口在增加新方法后,所有的继承者都必须重构,否则 ...

  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教你用微信每天给女朋友说晚安

    但凡一件事,稍微有些重复.我就考虑怎么样用程序来实现它. 这里给各位程序员朋友分享如何每天给朋友定时微信发送"晚安",故事,新闻,等等··· ···最好运行在服务器上,这样后台挂起 ...

  2. centos7服务器无GUI情况下安装使用Xvfb、selenium、chrome和selenium-server

    最近需要用到selenium浏览器抓取,在windows下对照chrome浏览器开发的代码,在linux服务器上换成phantomjs驱动后,却不能运行了,通过截图发现phantomjs渲染效果和ch ...

  3. segmenter.go

    ; ;; ].minDistance ; ].text),, ;; ;; ;,) {             output = append(output, toLower(text[alphanum ...

  4. 「WC 2018」州区划分

    题目大意: 给一个无向图$G(V,E)$满足$|V|<=21$,对于某一种将$G(V,E)$划分为k个的有序集合方案,若每一个子集$G_i(V_i,E_i)$,$E_i=\{(x,y)|x\in ...

  5. JDBC知识详解

    一.相关概念 1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它 ...

  6. Windows环境下springboot集成redis的安装与使用

    一,redis安装 首先我们需要下载Windows版本的redis压缩包地址如下: https://github.com/MicrosoftArchive/redis/releases 连接打开后如下 ...

  7. 从壹开始前后端分离 40 || 完美基于AOP的接口性能分析

    旁白音:本文是不定时更新的.net core,当前主线任务的Nuxt+VueAdmin教程的 nuxt.js 之 tibug项目已上线,大家可以玩一玩:http://123.206.33.109:70 ...

  8. Jenkins之Log Parse的使用

    在初学使用Jenkins的同学们,应该都遇到过通过bash或者cmd命令执行输出的日志,没办法做到对error, warning等状态的分析和统计.在这里就给他介绍一款实现此功能的插件Log Pars ...

  9. Python3|ddt|unittest|浅议数据驱动测试

    目录 1.DDT简介 2.data装饰器 3.unpack装饰器 4.file_data装饰器 5.总结 1.DDT简介 Data-Driven Tests(DDT)即数据驱动测试.它允许您通过不同的 ...

  10. 微服务架构之「 API网关 」

    在微服务架构的系列文章中,前面已经通过文章<架构设计之「服务注册 」>介绍过了服务注册的原理和应用,今天这篇文章我们来聊一聊「 API网关 」. 「 API网关 」是任何微服务架构的重要组 ...