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. 【深度学习系列】PaddlePaddle垃圾邮件处理实战(一)

    PaddlePaddle垃圾邮件处理实战(一) 背景介绍   在我们日常生活中,经常会受到各种垃圾邮件,譬如来自商家的广告.打折促销信息.澳门博彩邮件.理财推广信息等,一般来说邮件客户端都会设置一定的 ...

  2. Golang 通用连接池库 Golang-Pool

    Golang 实现的连接池 功能: * 连接池中连接类型为interface{},使得更加通用 * 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题 * 使用channel处理池 ...

  3. bzoj 3680 吊打xxx 模拟退火

    第一道模拟退火 重心嘛,就是要找到一个点,使其到所有点距离*该点权值和最小 思路:初始化一个T,mint,当T大于mint时,每次随机一个解,如果解比当前解优,直接转移,否则,以某概率(与T正相关)转 ...

  4. RabbitMQ和Kafka到底怎么选?

    前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...

  5. 小程序 textarea、input 层级过高,导致填写内容穿透,z-index无效问题解决方案。

    小程序的textare.input输入框层级是最高的 那么我们在textare.input输入的内容就会总是显示在最上一层. 这是时为什么呢?官方文档有说明,因为textare.input这些是原生组 ...

  6. java对象与Json字符串之间的转化(fastjson)

    1. 首先引入jar包 在pom.xml文件里加入下面依赖: <dependency> <groupId>com.alibaba</groupId> <art ...

  7. asp.net core系列 51 Identity 授权(下)

    1.6 基于资源的授权 前面二篇中,熟悉了五种授权方式(对于上篇讲的策略授权,还有IAuthorizationPolicyProvider的自定义授权策略提供程序没有讲,后面再补充).本篇讲的授权方式 ...

  8. python接口自动化(八)--发送post请求的接口(详解)

    简介 上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了.答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统 ...

  9. java游戏开发杂谈 - java编程怎么学

    java语言包含很多的知识点,我们并不需要把java语言的知识点都学全了,才开始编程.      你只需要了解: 1,java的数据类型和变量定义 2,类和对象的初步印象. 3,if-else, wh ...

  10. css中margin为负数的深入研究

    注:以下实验的元素均为块级元素,inline-block和inline本身对margin某些方向上都是无效的,所以这里不予讨论. margin-left或者margin-right为负数 当块元素wi ...