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

时间:2023-03-09 18:02:20
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关键字

扩展方法注意:

    ①可以扩展密封类

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

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