90、不要为抽象类提供公开的构造方法
抽象类本身是用来继承的,所以只让子类可见就行
91、可见字段应该重构为属性
92、谨慎将数组或集合作为属性
。。。
93、构造方法应初始化主要属性和字段
如果字段没有在构造方法在那个初始化,那么它就应该在构造器中设置初始值
94、区别对待override和new
有点绕。。测试一下就成了
如果子类new了一个方法掩盖了父类的同名方法,
Shape s1 = new Rectangle();
在这样调用的时候,因为前面的类型还是父类,所以调用的方法是父类的方法。
如果子类override了父类的虚方法,就算前面类型是父类,调用的还是子类重写后的方法
95、避免在构造方法中调用虚成员
class Shape
{
public Shape()
{
Init();
}
public virtual void Init()
{
}
}
class Circle : Shape
{
public string name;
public Circle(string name):base()
{
this.name = name;
}
public override void Init()
{
Console.WriteLine(name);
}
}
static void Main(string[] args)
{
Circle circle = new Circle("haha");
}
由于调用Circle的构造函数前会先调用Shape的构造函数,但是当时name还没有被赋值,就会出现输出为空的情况
所以,建议不要在构造方法中调用虚成员
96、成员应优先考虑公开基类型或接口
??
97、优先考虑将基类型或接口作为参数传递
??
98、用params减少重复参数
void Method(string str, params int[] args){}
99、重写时不应使用子类参数
对
100、静态方法和实例方法没有区别
如果一个方法只跟类型有关系,那么它就应该被设计成静态方法
如果跟类型的实例对象有关系,那么它就应该被设计成实例方法
存储的位置也没区别
101、使用拓展方法,向现有类型“添加”方法
竟然还可以拓展接口,添加一个已经实现的方法