### C#编程规范详解 #### 文件组织与代码结构 **1. 文件中单一类原则** - **要点**:每个文件应仅包含一个类定义。 - **目的**:提高代码的可读性和易于维护性。 **2. 命名空间单一原则** - **要点**:每个文件中只能有一个命名空间声明。 - **目的**:简化编译过程,减少命名冲突的可能性。 **3. 文件长度控制** - **要点**:文件长度不超过500行(不含自动生成的代码)。 - **目的**:便于代码审查和维护。 **4. 方法长度限制** - **要点**:每个方法不应超过25行。 - **目的**:增强代码的可读性和可维护性。 **5. 参数数量控制** - **要点**:避免方法拥有超过5个参数;建议使用结构体或类来传递多个参数。 - **目的**:减少方法调用时的复杂度。 **6. 单行长度限制** - **要点**:每行代码不超过80个字符。 - **目的**:确保代码格式的一致性,方便查看。 **7. 机器生成代码管理** - **要点**: - 不直接修改自动生成的代码。 - 修改格式应符合编码标准。 - 使用部分类(partial classes)来隔离维护的部分。 - **目的**:保持代码的一致性和稳定性。 #### 代码文档与注释 **8. 代码自解释原则** - **要点**:避免使用不必要的注释。 - **目的**:通过良好的命名习惯让代码尽可能地自解释。 **9. 文档编写指导** - **要点**:仅记录操作假设、算法洞察等关键信息。 - **目的**:确保文档的重点突出且有用。 **10. 方法级文档使用** - **要点**:避免使用方法级的文档,而是使用扩展的API文档。 - **目的**:保持代码简洁,减少文档维护的工作量。 #### 常量与变量 **11. 避免硬编码** - **要点**:不直接在代码中使用数字值,而是通过构造函数赋值。 - **目的**:提高代码的灵活性和可维护性。 **12. 枚举常量使用** - **要点**:仅对自然结构使用`const`关键字,如一周的天数。 - **目的**:简化枚举的使用。 **13. 只读变量的实现** - **要点**:使用`readonly`关键字而不是`const`实现只读变量。 - **示例**: ```csharp public class MyClass { public readonly int Number; public MyClass(int someValue) { Number = someValue; } public const int DaysInWeek = 7; } ``` - **目的**:允许变量在初始化后保持不变,同时支持动态赋值。 #### 异常处理 **14. 断言的使用** - **要点**:使用断言验证假设。 - **示例**: ```csharp using System.Diagnostics; object GetObject() { … } object obj = GetObject(); Debug.Assert(obj != null); ``` - **目的**:确保代码执行过程中预期的状态得到满足。 **15. 白盒测试** - **要点**:每一行代码都应该通过白盒测试。 - **目的**:保证代码的质量和可靠性。 **16. 异常处理** - **要点**:仅抛出已处理的异常。 - **目的**:避免不必要的错误传播。 **17. 异常再抛出** - **要点**:在捕获异常后重新抛出原始异常。 - **示例**: ```csharp catch (Exception exception) { MessageBox.Show(exception.Message); throw; } ``` - **目的**:保持异常栈跟踪的完整性。 #### 方法设计 **18. 错误代码的避免** - **要点**:避免使用错误代码作为方法的返回值。 - **目的**:采用更现代的异常处理机制。 **19. 自定义异常的限制** - **要点**:尽量避免定义自定义异常类。 - **目的**:减少异常类的数量,简化异常处理。 **20. 自定义异常的设计** - **要点**: - 继承自`ApplicationException`。 - 提供自定义序列化功能。 - **目的**:确保异常处理的一致性和可扩展性。 #### 主程序与接口 **21. Main方法的唯一性** - **要点**:避免在单个程序集中定义多个`Main`方法。 - **目的**:防止程序启动时的混淆。 **22. 对外公开操作的选择** - **要点**:只公开必要的操作,其余的操作应设置为`internal`。 - **目的**:提高系统的安全性,减少对外部的依赖。 **23. 避免友元程序集** - **要点**:避免使用友元程序集,因为这会增加程序集之间的耦合度。 - **目的**:提高模块间的独立性。 **24. 避免位置依赖** - **要点**:避免依赖于程序集运行的具体位置。 - **目的**:提高程序集的可移植性。 **25. 应用程序集的最小化** - **要点**:使应用程序集尽可能小,并使用类库替代业务逻辑。 - **目的**:优化性能,提高可维护性。 #### 枚举与数组 **26. 避免显式枚举值** - **要点**:避免为枚举变量提供显式的数值。 - **示例**: ```csharp // 正确 public enum Color { Red, Green, Blue } ``` - **目的**:简化枚举定义,减少错误的机会。 **27. 避免指定枚举类型** - **要点**:避免为枚举变量指定特殊类型(如`long`)。 - **目的**:保持枚举类型的默认行为。 **28. 明确的if语句** - **要点**:即使if语句仅有一条语句,也应使用花括号括起。 - **目的**:提高代码的清晰度和一致性。 **29. 避免三元运算符** - **要点**:避免使用三元条件运算符。 - **目的**:增强代码的可读性。 **30. 条件语句中的函数调用** - **要点**:避免在条件语句中直接调用返回布尔值的函数。 - **示例**: ```csharp bool IsEverythingOK() { … } // 避免 if (IsEverythingOK()) { … } // 替换方案 bool ok = IsEverythingOK(); if (ok) { … } ``` - **目的**:提高代码的可读性,减少潜在的逻辑错误。 #### 数组与引用类型 **31. 基于0的索引** - **要点**:始终使用基于0开始的数组索引。 - **目的**:遵循C#语言的一般约定。 **32. 显式初始化数组** - **要点**:在循环中显式初始化引用类型的数组。 - **示例**: ```csharp public class MyClass {} MyClass[] array = new MyClass[100]; for (int index = 0; index < array.Length; index++) { array[index] = new MyClass(); } ``` - **目的**:确保数组元素被正确初始化。 #### 属性与继承 **33. 使用属性代替公共字段** - **要点**:避免提供公共或受保护的成员变量,使用属性代替。 - **目的**:提高数据封装的安全性。 **34. 使用override代替new** - **要点**:在继承中避免使用`new`关键字,改用`override`。 - **目的**:提高代码的可预测性和一致性。 **35. 虚方法标记** - **要点**:在非密封的类中,应将所有公共或受保护的方法标记为虚拟(`virtual`)。 - **目的**:支持继承中的方法覆盖。 #### 安全与转换 **36. 避免不安全代码** - **要点**:除非必须使用互操作代码,否则避免使用不安全代码。 - **目的**:提高代码的安全性。 **37. 强制转换** - **要点**:避免使用显式的转换,改用`as`操作符。 - **示例**: ```csharp Dog dog = new GermanShepherd(); GermanShepherd shepherd = dog as GermanShepherd; if (shepherd != null) { … } ``` - **目的**:提高类型转换的安全性。 #### 委托与事件 **38. 委托的安全使用** - **要点**: - 在发布前复制委托到局部变量以避免并发竞争条件。 - 调用委托前检查是否为`null`。 - **示例**: ```csharp public class MySource { public event EventHandler MyEvent; public void FireEvent() { EventHandler temp = MyEvent; if (temp != null) { temp(this, EventArgs.Empty); } } } ``` - **目的**:确保委托的安全使用,避免空引用异常。 **39. 事件访问器** - **要点**:避免提供公共的事件成员变量,使用事件访问器代替。 - **示例**: ```csharp public class MySource { MyDelegate m_SomeEvent; public event MyDelegate SomeEvent { add { m_SomeEvent += value; } remove { m_SomeEvent -= value; } } } ``` - **目的**:提高事件处理的灵活性和安全性。 **40. 事件帮助类** - **要点**:使用事件帮助类来定义事件。 - **目的**:简化事件的管理和使用。 #### 接口与泛型 **41. 接口的使用** - **要点**:总是使用接口。 - **目的**:支持多态性,提高代码的灵活性。 **42. 接口与类的比例** - **要点**:类和接口中的方法和属性的比例至少为2:1。 - **目的**:保持接口的简洁性,提高可维护性。 **43. 单成员接口的避免** - **要点**:避免接口中只有一个成员。 - **目的**:提高接口的实用性和复用性。 **44. 接口中成员数量** - **要点**:每个接口中包含3-5个成员。 - **目的**:保持接口的简洁性,提高可维护性。 **45. 接口中成员的最大数量** - **要点**:接口中的成员数量不超过20个,实际情况可能限制为12个。 - **目的**:保持接口的简洁性,提高可维护性。 **46. 接口中事件的避免** - **要点**:避免在接口中定义事件。 - **目的**:提高接口的通用性和可维护性。 **47. 抽象方法与接口的选择** - **要点**:避免使用抽象方法,使用接口代替。 - **目的**:提高代码的灵活性和可维护性。 **48. 接口的明确性** - **要点**:在类层次中明确接口。 - **目的**:提高代码的清晰度和可维护性。 **49. 显式接口实现** - **要点**:推荐使用显式的接口实现。 - **目的**:提高代码的安全性和灵活性。 #### 类型兼容性的查询 **50. 类型兼容性的防御性查询** - **要点**:防御性地查询类型是否兼容特定接口。 - **示例**: ```csharp SomeType obj1; IMyInterface obj2; /* 假设已有代码初始化过obj1,接下来 */ obj2 = obj1 as IMyInterface; if (obj2 != null) { obj2.Method1(); } else { // 处理错误 } ``` - **目的**:提高类型兼容性判断的准确性和安全性。 #### 字符串与资源文件 **51. 字符串资源文件** - **要点**:用于最终用户显示的字符串不要硬编码,而要用资源文件替换。 - **目的**:提高国际化支持,简化字符串的管理和更新。 **52. 配置字符串的管理** - **要点**:不要硬编码可能更改的基于配置的字符串,如连接字符串。 - **目的**:提高配置的灵活性和可维护性。 **53. StringBuilder的使用** - **要点**:在构建长字符串时使用`StringBuilder`而不是`string`。 - **目的**:提高性能。 #### 结构与静态成员 **54. 结构中方法的避免** - **要点**:避免在结构体中提供方法。 - **示例**: - 建议使用参数化构造函数。 - 可以重载操作符。 - **目的**:保持结构体的简洁性和效率。 **55. 静态构造函数的使用** - **要点**:始终为静态变量提供静态构造函数。 - **目的**:确保静态变量的正确初始化。 #### 绑定与日志跟踪 **56. 早期绑定优先** - **要点**:能使用早期绑定就不要使用后期绑定。 - **目的**:提高代码的效率和可读性。 **57. 日志和跟踪** - **要点**:使用应用程序的日志和跟踪功能。 - **目的**:提高问题诊断的能力。 #### goto语句与switch语句 **58. goto语句的限制** - **要点**:除非在不完整的switch语句中,否则不要使用`goto`语句。 - **目的**:提高代码的可读性和维护性。 **59. switch语句的default子句** - **要点**:在switch语句中总要有`default`子句来显示信息(断言)。 - **示例**: ```csharp int number = SomeMethod(); switch (number) { case 1: Trace.WriteLine("Case 1:"); break; case 2: Trace.WriteLine("Case 2:"); break; default: Debug.Assert(false); break; } ``` - **目的**:确保所有可能的case都被考虑,提高代码的健壮性。 #### 构造函数与基类成员访问 **60. 构造函数中this指针的使用** - **要点**:除非在构造函数中调用其他构造函数,否则不要使用`this`指针。 - **示例**: ```csharp public class MyClass { public MyClass(string message) { … } public MyClass() : this("hello") { } } ``` - **目的**:提高代码的清晰度。 **61. 基类成员的访问** - **要点**:除非想重写子类中存在的名称冲突的成员或调用基类的构造函数,否则不要使用`base`来访问基类的成员。 - **示例**: ```csharp public class Dog { public Dog(string name) { … } virtual public void Bark(int howLong) { … } } public class GermanShepherd : Dog { public GermanShepherd(string name) : base(name) { } override public void Bark(int howLong) { base.Bark(howLong); } } ``` - **目的**:提高代码的清晰度和可维护性。 #### 生命周期管理与类型转换 **62. Dispose()和Finalize()的实现** - **要点**:在实现了IDisposable接口的类中实现`Dispose()`和`Finalize()`方法。 - **目的**:确保资源的正确释放。 **63. 类型转换的限制** - **要点**:避免从`System.Object`转换而来和转换而去的代码,使用强制转换或`as`操作符代替。 - **示例**: ```csharp class SomeClass {} // 避免 class MyClass<T> { void SomeMethod(T t) { object temp = t; SomeClass obj = (SomeClass)temp; } } // 正确 class MyClass<T> where T : SomeClass { void SomeMethod(T t) { SomeClass obj = t; } } ``` - **目的**:提高类型转换的安全性和可读性。 **64. 泛型接口的限制** - **要点**:通常情况下避免定义有限制的接口。 - **示例**: ```csharp public class Customer {} // 避免 public interface IList<T> where T : Customer { … } // 正确 public interface ICustomerList : IList<Customer> { … } ``` - **目的**:提高接口的通用性和灵活性。 **65. 接口中方法的限制** - **要点**:不确定接口中具体方法的限制条件。 - **目的**:保持接口的灵活性。 #### 内置数据结构的使用 **66. 内置数据结构的优选** - **要点**:总是选择使用C#内置(一般的泛型)的数据结构。 - **目的**:提高代码的效率和可维护性。




























- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 造价工程师四科知识点汇总.doc
- 预制阳台、雨罩、通道板安装工艺.doc
- 最新2017雨季施工方案范本.doc
- 项目投资控制程序.doc
- c50泵送混凝土配合比设计与注意事项.doc
- 如何突破典型“合约困境”.ppt
- 《结构力学习题集》(上)-6.doc
- 极简星空背景IOS风PPT模板.pptx
- 牙颌畸形的早期矫治.ppt
- 杭锦后旗平安城市系统解决方案-20161018.doc
- Excel与数据处理第章公式名字与函数完美版资料.ppt
- 王卫明-大连大学中山医院.pdf
- 后浇带-secret.docx
- 高强预应力管桩在多高层建筑基础设计中的应用.doc
- 公司房屋建筑物构筑物管理办法(20165).doc
- 工程招标程序及管理制度.doc


