看我72条——C#编码标准

C#编码标准(上) 1.避免在同一个文件中放置多个类 2.一个文件应该只在一个名称空间内定义类型,避免在一个文件中使用多个名称空间 3.避免在一个文件内写多于500行的代码(机器自动生成的代码除外) 4.避免写超过25号代码的方法 5.避免写超过5个参数的方法。如果要传递多个参数,使用结构。 6.一行不要超过80个字符 7.不要手动去修改任何机器生成的代码 a)如果修改了机器生成的代码,修改你的编码方式来使用这个编码标准 b)尽可能使用partial classes特征,以提高可维护性(C#2.0新特性) 8.避免对那些很直观的内容作注释。代码本身应该能够解释其自身的含义。由可读的变量名和方法名构成的优质代码应该不需要注释。 9.注释应该只说明操作的一些前提假设、算法的内部信息等内容 10.避免对方法进行注释 a)使用充足的外部文档对API进行说明 b)只有对那些其他开发者的提示信息才有必要放到方法级的注释中来 11.除了0和1,绝对不要对数值进行硬编码,通过声明一个常量来代替该数值 12.只对那些亘古不变的数值使用const关键字,例如一周的天数 13.避免对只读(read-only)的变量使用const关键字。在这种情况下,直接使用readonly关键字 1. public class MyClass 2. { 3. public const int DaysInWeek = 7; 4. public readonly int Number; 5. public MyClass(int someValue) 6. { 7. Number = someValue; 8. } 9. } 14.对每一个假设进行断言。平均起来,每5行应有一个断言 1. using System.Diagnostics; 2. object GetObject() 3. {…} 4. object someObject = GetObject(); 5. Debug.Assert(someObject != null); 15.每一行代码都应该以白盒测试的方式进行审读 16.只捕捉那些你自己能够显式处理的异常 17.如果在catch语句块中需要抛出异常,则只抛出该catch所捕捉到异常(或基于该异常而创建的其它异常),这样可以维护原始错误所在的堆栈位置; 1. catch(Exception exception) 2. { 3. MessageBox.Show(exception.Mesage); 4. throw; //或throw,exception; 5. } 18.避免利用返回值作为函数的错误代码 19.避免自定义异常类 20.当自定义异常类的时候 a)让你自定义的异常类从Execption类继承 b)提供自定义的串行化机制 21.避免在一个程序集(assembly)中定义多个Main()方法 22.只把那些绝对需要的方法定义成public,而其它的方法定义成internal 23.避免friend assemblies,因为这会增加程序集之间的偶合性 24.避免让你的代码依赖于运行在某个特定地方的程序集 C#编码标准(中) 25.在application assembly (EXE client assemblies)中最小化代码量,使用类库来包含业务逻辑 26.避免显示指定枚举的值 1. //正确 2. public enum Color 3. { 4. Red, Green, Blue 5. } 6. //避免 7. public enum Color 8. { 9. Red = 1, Green = 2, Blue = 3 10. } 27.避免为枚举指定一个类型 1. //避免 2. public enum Color:long 3. { 4. Red, Grenn, Blue 5. } 28.对于if语句,总使用一对{}把下面的语句块包含起来,哪怕只有一条语句也是如此 29.避免使用三元条件操作符 30.避免利用函数返回的Boolean值作为条件语句。把返回值赋给一个局部变量,然后再检测 1. bool IsEverythingOK() 2. {…} 3. //避免 4. if (IsEverythingOK) {…} 5. //正确 6. bool ok = IsEverythingOK() 7. if (ok) {…} 31.总是使用以零为基数的数组 32.总是使用一个for循环显式的初始化一个引用成员的数组 1. public class MyClass 2. {} 3. const int ArraySize = 100; 4. MyClass[] array = new MyClass[ArraySize]; 5. for (int index = 0; index < array.length; index++) 6. { 7. array[index] = new MyClass(); 8. } 33.使用属性来替代public或protected类型的成员变量 34.不要使用继承下来的new操作符,使用override关键字覆写new的实现 35.在一个非密封(non-sealed)类中,总是把那些public和protected的方法定义成virtual 36.除非为了和其他语言进行互动,否则绝不要使用不安全(unsafe)的代码 37.避免显示类型转换。使用as关键字安全的转换到另一个类型 1. Dog dog = new GermanShepherd(); 2. GermanShepherd shepherd = dog as GermanShepherd; 3. if (shepherd != null) {…} 38.在调用一个代理前,总是检查它是否为null 39.不要提供public的事件成员变量。改用Event Accessor 1. public class MyPublisher 2. { 3. MyDelegate m_SomeEvent; 4. public event MyDelegate SomeEvent 5. { 6. add 7. { 8. m_SomeEvent += value; 9. } 10. remove 11. { 12. m_SomeEvent -= value; 13. } 14. } 15. } 40.避免定义事件处理代理。使用EventHandler或者GenericEventHandler。其中GenericEventHandler定义在《Programming .NET components》2/e第6章 41.避免显示出发事件。使用EventsHelper安全的发布事件。EnentHelper定义在《Programming .NET components》2/e第6~8章中 42.总是使用接口 43.接口和类中方法和属性的比应该在2:1左右 44.避免只有一个成员的接口 45.努力保证一个接口有3-5个成员 46.不要让一个接口中成员的数量超过20个,而12则是更实际的限制 47.避免在接口中包含事件 48.当使用抽象类的时候,提供一个接口 C#编码标准(下) 49.在类继承结构中暴露接口 50。推荐使用显式接口实现 51.从来不要假设一个类型支持某个接口。在使用前总是要询问一下 1. SomeType obj1; 2. IMyInterface obj2 3. /* Some code to initialize obj1, then; */ 4. obj2 = obj1 as IMyInterface; 5. if (obj2 != null) 6. { 7. obj2.Method1(); 8. } 9. else 10. { 11. //Handle error in expected interface 12. } 52.不要硬编码向用户显示字符串。要使用资源 53.不要硬编码那些可能会随发布环境变化而变化的字符串,例如数据库连接字符串 54.使用String.Empty取代“” 1. //避免 2. tring name = “”; 3. //正确 4. tring name = String.Empty; 55.用一个长字符串的时候,使用StringBuiler代替string 56.避免在结构中提供方法 a)参数化的构造函数是鼓励使用的 b)可以重载运算符 57.当声明了静态成员的时候,总是要提供一个静态构造函数 58.当早绑定(early-binding)可能的时候就尽量不要使用迟绑定(late-binding) 59.让你的应用程序支持跟踪和调试 60.除了要在switch语句块中实现代码跳转,不要使用goto关键字 61.总在switch语句的default情形提供一个断言 1. int number = SomeMethod(); 2. switch (number) 3. { 4. case 1: 5. Trace.WriteLine(“Case 1:”); 6. break; 7. Case 2: 8. Trace.WriteLine(“Case 2:”); 9. break; 10. default: 11. Debug.Assert(false); 12. break; 13. } 62.除了在一个构造函数中调用其它的构造函数之外,不要使用this关键字 1. //Example of proper use of ‘this’ 2. public class MyClass 3. { 4. public MyClass(string message) {…} 5. public MyClass(): this(“Hello”) {…} 6. } 63.不要使用base关键字访问基类的成员,除非你在调用一个函数的时候要决议一个子类的名称冲突 1. //Example of proper use of ‘base’ 2. public class Dog 3. { 4. public Dog(stinrg name) {…} 5. virtual public void Bark(int howLong) {…} 6. } 7. public class GermanShepherd:Dog 8. { 9. public GermanShepherd(string name):base(name) {…} 10. override public void Brak(int howLong) 11. { 12. base.Brak(howlong); 13. } 14. } 64.不要使用GC.AddMemoryPressure() 65.不要依赖HandleCollector 66.基于《Programming .NET components》2/e中第4章内容实现Dispose()和Finalize()方法 67.总是在unchecked状态下运行代码(出于性能的原因),但是为了防止溢出或下溢操作,要果断地使用checked模式 1. int CalcPower(int number, int power) 2. { 3. int result = 1; 4. for (int count = 1; count < = power; count++) 5. { 6. checked 7. { 8. result *= number; 9. } 10. } 11. return result; 12. } 68.使用条件方法来取代显式进行方法调用排除的代码(#if…#endif) 1. public class MyClass 2. { 3. [Conditional(“MySpecialCondition”)] 4. public void MyMethod() {…} 5. } 69.不要在泛型接口中定义约束。接口级的约束通常可以利用强类型来替代 1. public class Customer {…} 2. //避免 3. public interface IList where T:Customer {…} 4. //正确 5. public interface ICustomerList:IList {…} 70.不要在接口上定义方法相关的约束 71.不要再代理上定义约束 72.如果一个类或方法提供了泛型和非泛型版本,那么优先选择泛型版本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值