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键,组合键后就会弹出窗口,然后输入 ...
随机推荐
- HBase笔记--自定义filter
自定义filter需要继承的类:FilterBase 类里面的方法调用顺序 方法名 作用 1 boolean filterRowKey(Cell cell) 根据row key过滤row.如果需要 ...
- GET异步 请求图片步骤
- (IBAction)getImage:(id)sender { //1,准备URL NSString *str = @"http://e.hiphotos.baidu.com/image ...
- iOS 摇一摇的实现-备用
- (void)viewDidLoad { [super viewDidLoad]; [[UIApplication sharedApplication] setApplicationSupports ...
- 路由器WDS桥接教程
因为有吧友买了此款路由又不会桥接,因此做这个教程.老鸟自动路过,废话不多说,下面开始讲解. 1.wifi密码破解和路由器用户名和密码部分请自行解决,我只讲桥接部分.首先,在浏览器里输入192.168. ...
- 修改apk显示或隐藏桌面图标
反编译CM设置,打开AndroidManifest.xml,搜索“DEFAULT”,把他替换为"LAUNCHER",然后回编译,回编译之后签名在用RE放到system\app下该权 ...
- html标签引入外部html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Activity大致会经过如下四个状态
1.活动主题:当前Activity位于前台,用户可见,可以获得焦点.2.暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点.3.停止状态:该Activity不可见,失 ...
- Delphi从内存流中判断图片格式(好多相关文章)
废话不多说了,利用内存流来判断文件的格式,其实判断文件的前几个字节就可以简单的判断这个文件是什么类型的文件,例如jpg文件 是 FFD8 (从低位到高位就要反过来 D8FF 下面都是一样)BMP文件 ...
- [置顶] 白话最小边覆盖总结--附加 hdu1151结题报告
刚开始看到这个题目的时候就觉得想法很明了,就是不知道如何去匹配... 去网上看了不少人的解题报告,但是对于刚接触“最小边覆盖”的我来说....还是很困难滴....于是自己又开始一如以往学习“最大独立集 ...
- [Qt] QString 和 char* 转换
(1) QString 转 char* char acResult[10240]; //QByteArray baResult = strResult.toLatin1(); QByteArray b ...