C#编码标准--编码习惯

0.  书写程序时的大小写规则:

a) 类:PascalCase表示法。如 MyClass

b) 枚举值:PascalCase表示法。如 Colors.Red

c) 枚举类型:PascalCase表示法。如 Colors

d) 事件:PascalCase表示法。如 MouseClick、ButtonDown

e) 异常类:PascalCase表示法。类名称以Exception为后缀,如 MyCustomException、WebServiceException

f) 接口:PascalCase表示法。接口名称以I为前缀,如 Icar

g) 方法:PascalCase表示法。如 GetItemData、UpdateModifiedValue

h) 命名空间:PascalCase表示。如 Company.Technology.Product、Company.NewApplication.DataTier

i) 属性:PascalCase表示法。如 ItemValue

j) 参数:camelCase表示法。如 itemArray、valueData、purchasePrice

k) 私有成员变量:camelCase表示法。如 myValue

养成好习惯:

1.  避免将多个类放在一个文件里面。

2.  一个文件应该只有一个命名空间,避免将多个命名空间放在同一个文件里面。

3.  一个文件最好不要超过500行的代码(不包括机器产生的代码)。

4.  一个方法的代码长度最好不要超过25行。

5.  避免方法中有超过5个参数的情况。使用结构来传递多个参数。

6.  每行代码不要超过80个字符。

7.  不要手工的修改机器产生的代码。

8.  如果需要编辑机器产生的代码,编辑格式和风格要符合该编码标准。

9.  避免利用注释解释显而易见的代码。

10. 代码应该可以自解释。好的代码由可读的变量和方法命名因此不需要注释。

11. 避免使用方法级的文档。

12. 使用扩展的API文档说明之。

13. 只有在该方法需要被其他的开发者使用的时候才使用方法级的注释。(在C#中就是///)

14. 不要硬编码数字的值,总是使用构造函数设定其值。

15. 只有是自然结构才能直接使用const,比如一个星期的天数。

16. 避免在只读的变量上使用const。如果想实现只读,可以直接使用readonly。

public class MyClass

{

public readonly int Number;

public MyClass(int someValue)

{

Number = someValue;

}

public  const int  DaysInWeek = 7;

}

17. 代码的每一行都应该通过白盒方式的测试。

18. 只抛出已经显示处理的异常。

19. 在捕获(catch)语句的抛出异常子句中(throw),总是抛出原始异常维护原始错误的堆栈分配。

catch(Exception exception)

{

MessageBox.Show(exception.Message);

throw ;  //和throw exception一样。

}

20. 避免方法的返回值是错误代码。

21. 尽量避免定义自定义异常类。

22. 当需要定义自定义的异常时:

a)  自定义异常要继承于ApplicationException。

b)  提供自定义的序列化功能。

23. 避免在单个程序集里使用多个Main方法。

24. 只对外公布必要的操作,其他的则为internal。

25. 使应用程序集尽量为最小化代码(EXE客户程序), 使用类库来替换包含的商务逻辑。

26. 避免给枚举变量提供显式的值。

//正确方法

public enum Color

{

Red,Green,Blue

}

//避免

public enum Color

{

Red = 1,Green = 2,Blue = 3

}

27. 即使if语句只有一句,也要将if语句的内容用大括号扩起来。

28. 避免使用trinary条件操作符。

29. 避免在条件语句中调用返回bool值的函数, 可以使用局部变量并检查这些局部变量。

bool IsEverythingOK()

{…}

//避免

if ( IsEverythingOK() )

{…}

//替换方案

bool ok = IsEverythingOK();

if ( ok )

{…}

30. 总是使用基于0开始的数组。

31. 在循环中总是显式的初始化引用类型的数组。

public class MyClass

{

}

MyClass[] array = new  MyClass[100];

for( int index = 0; index < array.Length; index++ )

{

array[index] = new  MyClass();

}

32. 不要提供public 和 protected的成员变量,使用属性代替他们。

33. 避免在继承中使用new而使用override替换。

34. 在不是sealed的类中总是将public 和 protected的方法标记成virtual的。

35. 除非使用interop(COM+ 或其他的dll)代码否则不要使用不安全的代码(unsafe code)。

36. 避免显示的转换,使用as操作符进行兼容类型的转换。

Dog dog = new GermanShepherd();

GermanShepherd shepherd = dog  as  GermanShepherd;

if ( shepherd != null )

{…}

37. 当类成员包括委托的时候

a)  Copy a delegate to a local variable before publishing to avoid concurrency race

condition.

b)  在调用委托之前一定要检查它是否为null

public class MySource

{

public event EventHandler  MyEvent;

public void FireEvent()

{

EventHandler temp = MyEvent;

if(temp != null )

{

temp(this,EventArgs.Empty);

}

}

}

38. 不要提供公共的事件成员变量,使用事件访问器替换这些变量。

public class MySource

{

MyDelegate m_SomeEvent ;

public event MyDelegate SomeEvent

{

add

{

m_SomeEvent += value;

}

remove

{

m_SomeEvent -= value;

}

}

}

39. 使用一个事件帮助类来公布事件的定义。

40. 类和接口中的方法和属性至少为2:1的比例。

41. 避免一个接口中只有一个成员。

42. 尽量使每个接口中包含3-5个成员。

43. 接口中的成员不应该超过20个。

a)  实际情况可能限制为12个

44. 避免接口成员中包含事件。

45. 避免使用抽象方法而使用接口替换。

46. 在类层次中显示接口。

47. 推荐使用显式的接口实现。

48. 从不假设一个类型兼容一个接口。Defensively query for that interface.

SomeType obj1;

IMyInterface obj2;

/* 假设已有代码初始化过obj1,接下来 */

obj2 = obj1 as IMyInterface;

if (obj2 != null)

{

obj2.Method1();

}

else

{

//处理错误

}

49. 表现给最终用户的字符串不要使用硬编码而要使用资源文件替换之。

50. 不要硬编码可能更改的基于配置的字符串,比如连接字符串。

51. 当需要构建长的字符串的时候,使用StringBuilder不要使用string

52. 避免在结构里面提供方法。

a)  建议使用参数化构造函数

b)  可以重裁操作符

53. 总是要给静态变量提供静态构造函数。

54. 能使用早期绑定就不要使用后期绑定。

55. 使用应用程序的日志和跟踪。

56. 除非在不完全的switch语句中否则不要使用goto语句。

57. 在switch语句中总是要有default子句来显示信息(Assert)。

int number = SomeMethod();

switch( number )

{

case 1:

Trace.WriteLine("Case 1:");

break;

case 2:

Trace.WriteLine("Case 2:");

break;

default :

Debug.Assert(false);

break;

}

58. 除非在构造函数中调用其他构造函数否则不要使用this指针。

// 正确使用this的例子

public class MyClass

{

public MyClass(string message )

{}

public MyClass()  : this("hello")

{}

}

59. 除非你想重写子类中存在名称冲突的成员或者调用基类的构造函数否则不要使用base来访问基类的成员。

// 正确使用base的例子

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);

}

}

60. 基于模板的时候要实现Dispose()和Finalize()两个方法。

61. 通常情况下避免有从System.Object转换来和由System.Object转换去的代码,而使用强制转换或者as操作符替换。

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;

}

}

62. 在一般情况下不要定义有限制符的接口, 接口的限制级别通常可以用强类型来替换之。

public class Customer

{…}

//避免:

public interface IList<T> where T : Customer

{…}

//正确:

public interface ICustomerList : IList<Customer>

{…}

63.  不确定在接口内的具体方法的限制条件。

64.  总是选择使用C#内置(一般的generics)的数据结构。

C#编码标准--编码习惯的更多相关文章

  1. javascript编码标准

    前面的话 编码标准是有争议的.几乎每个人都有自己的标准,但对标准应该是什么样的,则似乎很少能达成共识.但编码标准意味着,通过共同语言和一致的结构,把开发人员从无意义的工作中解放出来.允许开发人员把创新 ...

  2. VP9 vs H.265——下一代视频编码标准的王道之争

    目前下一代主流的视频编码标准有 ITU-T VCEG 推出来的 H.265 和 Google 推出 VP9 . H.265 在 H.264 的基础上保留其中的部分技术,并对相关技术加以改进研发而成.新 ...

  3. Java安全编码标准

    Java安全编码标准 具体参考Rules 输入验证和数据净化(IDS)规则风险评估概要 IDS00-J净化穿越受信边界的非受信数据 IDS01-J验证前标准化字符串 IDS02-J在验证之前标准化路径 ...

  4. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  5. C# 编码标准(二)

    先八卦一下,昨天写了C# 编码标准(一),得到了@h82258652的补充,感到非常欣慰,一是感觉他的观点扩展了我的视野,丰富了我的看法,所以更坚定了我继续写博客的想法,由于是五笔打字,经常不写东西, ...

  6. 防微杜渐——读《C安全编码标准》

    防微杜渐——读<C安全编码标准> 首先这本书的名字是非常洋气的——<C安全编码标准>.然而映入眼帘的却不仅仅是冷冰冰的编码,还有那一套非常严谨的风险评估标准和问题处理方法.对于 ...

  7. 音视频处理之H264编码标准20170906

    一. H264基础概念 1.名词解释 场和帧 :    视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片:             每个图象中,若干 ...

  8. 系统编码 python编码

    编码一直都是一个很让人头疼的问题,尤其是在python里面.花了几天时间,终于把这个问题给弄明白了. 一,什么是编码,编码过程是怎样的?常见的编码方式有哪些? 编码是从一个字符,比如'哈',到一段二进 ...

  9. dos命令窗口修改编码,CMD编码修改方法

    dos命令窗口修改编码,CMD编码修改方法 第一步,打开命令窗口有两种方法第一种:可以点击左下角的开始按钮,在运行里面输入CMD,然后敲回车2第二种:组合键WIN+R键,组合键后就会弹出窗口,然后输入 ...

随机推荐

  1. 简单讲解iOS应用开发中的MD5加密的相关使用

      简单讲解iOS应用开发中的MD5加密的相关使用   作者:文顶顶 字体:[增加 减小] 类型:转载 时间:2015-12-19 我要评论 这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用, ...

  2. 转:VC中WORD,DWORD,unsigned long,unsigned short的区别(转)

    typedef unsigned long       DWORD;typedef int                 BOOL;typedef unsigned char       BYTE; ...

  3. Android json操作之取得一个对象

    1:服务端返回的json数据格式如下: {"id":"1001","name":"zhangsan","sco ...

  4. POJ 1987 Distance Statistics

    http://poj.org/problem?id=1987 题意:给一棵树,求树上有多少对节点满足距离<=K 思路:点分治,我们考虑把每个距离都存起来,然后排序,一遍扫描计算一下,注意还要减掉 ...

  5. QT:不规则窗口的实现

    主要思路:1:将窗体设为Qt::FramelessWindowHint(去掉标题栏).2:用一幅有部分区域是透明的图片作为程序的界面,并将图片透明的地方设为穿透. 3:重载程序的鼠标事件. 运行时截图 ...

  6. Web Server (IIS) Administration Cmdlets in Windows PowerShell

    https://technet.microsoft.com/en-us/library/ee790599.aspx Web Server (IIS) Administration Cmdlets in ...

  7. Android 使用Post方式提交数据(登录)

    在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持. 在HTTP通信中使用最多的就是GET和POS ...

  8. activity5 流程 入门

    http://blog.csdn.net/yangyi22/article/details/9225849 谢谢原文作者提供!

  9. 警惕P2B模式

    大家都知道P2P是什么,估计也有很多人了解P2B的意思,这里也不多做解释,但是为什么要警惕P2B,这里我要做详细说明,希望能给大家一个参考.      首先我们要把P2B分成两种,一种是针对大型企业, ...

  10. HDOJ 1418 抱歉(欧拉公式)

    Problem Description 非常抱歉,本来兴冲冲地搞一场练习赛,由于我准备不足,出现很多数据的错误,现在这里换一个简单的题目: 前几天在网上查找ACM资料的时候,看到一个中学的奥数题目,就 ...