【设计原则和建议】 方法 📅 2026/7/5 4:36:43 静态方法和实例方法1.静态方法应该是线程安全的调用方使用静态方法(如Console.Write),调用方会预期静态方法是线程安全的public static Dictionarystring, object dict new Dictionarystring, object(); public static ConcurrentDictionarystring, object concurrentDict new ConcurrentDictionarystring, object(); public static void Test1() { if (!dict.ContainsKey(key))//线程不安全 { dict[key] value; } } public static void Test2() { concurrentDict[key] value;//线程安全, }2.如果一个方法没有使用到this那么考虑声明为静态方法3.基本类库和常用方法优先设计为静态方法 (如Log.Error SqlHelper.Execute)4.为什么选择静态方法容易实现面向过程的编程静态方法调用较为简单,少了一个new的过程如果希望设计一个较为独立的方法(和类中的其他对象关系较少),静态方法是一个较好的选择 ,静态方法往往更容易移植性能较好1.不需要在运行时判断多态 (没有继承链的问题)2.调用静态方法不需要传递实例对象指针3.实例方法需要至少new一个对象, 有GC的压力5.为什么选择实例方法和面向对象的设计结合较好借助多态等,功能比静态方法要强大方法可访问性1.在声明方法的时候显式声明可访问性, 不要使用默认值,以免不熟悉默认访问性的开发者搞错了2.保持最低的可访问性, 例如能private的就不要public避免第三方错误调用了不应该public的方法避免第三方引用了public方法以后,在重构时无法移除该方法3. 使用new关键字复写父类方法 , 一般要保持同级或者较高的可访问性public class ClassA { public virtual void Test() { } } public class ClassC : ClassA { protected new void Test() //bad { } }方法继承1.如果想重写父类的方法,一定要用new关键字显式覆盖,以免非预期的重写public class ClassA { public void Test() { } } public class ClassB : ClassA { public new void Test()//good { } } public class ClassC : ClassA { public void Test() //bad { } }2.某些方法需要一起被override, 例如 IComparable.CompareTo 和 Equals , 又例如重写运算符的时候 和 !3.只在希望子类override方法实现的时候使用virtual关键字4.不要在构造函数中调用虚方法调用虚方法时直到运行时之前都不会选择执行该方法的实际类型。 构造函数调用虚方法时可能尚未执行调用该方法的实例的构造函数。5.如果是实现了Dispose方法,那么在该方法体内,请调用父类的Dispose方法对比1.和属性对比属性返回值相对静态所以DateTime.Now是一个不好的设计因为Now的值会一直变化方法返回值相对动态所以Guid.NewGuid()是一个好的设计