C# 《编写高质量代码改善建议》整理&笔记 --(五)成员设计
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关键字
扩展方法注意:
①可以扩展密封类
②可以扩展第三方程序集中的类型
③不支持扩展事件,属性。但是可以扩展接口。