C#编码标准--编码习惯
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#编码标准--编码习惯的更多相关文章
- javascript编码标准
前面的话 编码标准是有争议的.几乎每个人都有自己的标准,但对标准应该是什么样的,则似乎很少能达成共识.但编码标准意味着,通过共同语言和一致的结构,把开发人员从无意义的工作中解放出来.允许开发人员把创新 ...
- VP9 vs H.265——下一代视频编码标准的王道之争
目前下一代主流的视频编码标准有 ITU-T VCEG 推出来的 H.265 和 Google 推出 VP9 . H.265 在 H.264 的基础上保留其中的部分技术,并对相关技术加以改进研发而成.新 ...
- Java安全编码标准
Java安全编码标准 具体参考Rules 输入验证和数据净化(IDS)规则风险评估概要 IDS00-J净化穿越受信边界的非受信数据 IDS01-J验证前标准化字符串 IDS02-J在验证之前标准化路径 ...
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...
- C# 编码标准(二)
先八卦一下,昨天写了C# 编码标准(一),得到了@h82258652的补充,感到非常欣慰,一是感觉他的观点扩展了我的视野,丰富了我的看法,所以更坚定了我继续写博客的想法,由于是五笔打字,经常不写东西, ...
- 防微杜渐——读《C安全编码标准》
防微杜渐——读<C安全编码标准> 首先这本书的名字是非常洋气的——<C安全编码标准>.然而映入眼帘的却不仅仅是冷冰冰的编码,还有那一套非常严谨的风险评估标准和问题处理方法.对于 ...
- 音视频处理之H264编码标准20170906
一. H264基础概念 1.名词解释 场和帧 : 视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片: 每个图象中,若干 ...
- 系统编码 python编码
编码一直都是一个很让人头疼的问题,尤其是在python里面.花了几天时间,终于把这个问题给弄明白了. 一,什么是编码,编码过程是怎样的?常见的编码方式有哪些? 编码是从一个字符,比如'哈',到一段二进 ...
- dos命令窗口修改编码,CMD编码修改方法
dos命令窗口修改编码,CMD编码修改方法 第一步,打开命令窗口有两种方法第一种:可以点击左下角的开始按钮,在运行里面输入CMD,然后敲回车2第二种:组合键WIN+R键,组合键后就会弹出窗口,然后输入 ...
随机推荐
- OSTaskCreateExt() 建立任务
OSTaskCreateExt()建立任务 NT8U OSTaskCreateExt (void (*task)(void *pd), void *pdata, OS_STK *ptos, ...
- ubuntu下wine打开自由们找不到MFC42.DLL重新安装的解决方法
一直在找ubuntu下的X墙工具,看到大部分的都是ssh和tor的,但是tor下载不到,找了很多方法,没有办法,只能用FG了.但是Fg是运行在windows系统下的程序. 只好再安装一遍wine,用终 ...
- Windows内存小结(有好多图,比较清楚)
以前写过一篇理解程序内存, 当时主要是针对用户态,下面再稍微深入一点: 我们以32位程序为例(不启用AWE), 总共4G虚拟空间,其中低2G属于用户态, 高2G属于操作系统内核, 每个程序都有自己的低 ...
- Android 给TextView添加点击事件
首先设定TextView的clickable属性为true. 可以在布局文件中进行设定,比如: <TextView android:id="@+id/phone" andro ...
- Smarty include使用
{include} {include}用于载入其他模板到当前模板中. 在包含模板中可用的变量,载入后在当前模板仍然可用. {include}必须设置file 属性,设置载入的文件资源路径. 设置了可选 ...
- python手记(38)
runfile(r'K:\testpro\testopencv.py', wdir=r'K:\testpro') http://blog.csdn.net/myhaspl myhaspl@qq.com ...
- mysql System Tablespace
System Tablespace 数据文件配置: mysql> show variables like '%innodb_data_file_path%'; +---------------- ...
- BZOJ3402: [Usaco2009 Open]Hide and Seek 捉迷藏
3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 51 Solved: 4 ...
- ACM2055_ctype.h_cctype
#include<iostream> int main() { using namespace std; int y,count; char x; cin>>count; wh ...
- Tomcat类加载器
1JVM类加载机制 JVM的ClassLoader通过Parent属性定义父子关系,可以形成树状结构.其中引导类.扩展类.系统类三个加载器是JVM内置的. 它们的作用分别是: 1)引导类加载器:使 ...