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键,组合键后就会弹出窗口,然后输入 ...
随机推荐
- Linux企业级项目实践之网络爬虫(27)——多路IO复用
与多线程和多进程相比,I/O多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程. 主要应用: (1)客户程序需要同时处理交互式的输入和服务器之间的网络连接 (2) ...
- 【转】s3c2440 按键驱动 — 字符设备
原文网址:http://www.xuebuyuan.com/632893.html 主机:VM - redhat 9.0 开发板:FL2440,linux-2.6.12 arm-linux-gcc:3 ...
- delphi7调用webservice Java 传入参数为空
在delphi7中,new-webservices-wsdl importer中输入wsdl地址,会自动生成wsdl单元代码.在调用时,传入参数到服务器端时为空了. 网上说缺少 InvRegistry ...
- Jquery伪选择器学习笔记
对于我这个半路出家的前端,使用jquery已经很长时间了,对于选择器,一直都局限在id,class,element选择器.每次写一个元素都得想一个id,一个页面写下来想id名都想的累的慌.最近手头项目 ...
- Redis应用场景 及其数据对象 string hash list set sortedset
原文地址:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html Redis开创了一种新的数据存储思路,使用Redis,我们不用在 ...
- [LeetCode] 35. Search Insert Position 解决思路
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- GF(2^8)乘法优化
利用指数表和对数表,实现GF(2^8)的乘法优化. 首先利用简单的基础的GF(2^8)乘法,构造指数表和对数表.在这里选取生成元3. 指数表exp[i] = 3^i,对数表log[i] = log3( ...
- 玩转docker
开篇先论赌 (组词,赌博,....),时刻,每天都在赌! 何为赌?仁者见仁,智者必定又有一番见解,保持沉默,意见保留; ——改变思维模式,Ruiy让赌赢在“思维”!!!; 存在在IT界Ruiy定格,即 ...
- 异步的 SQL 数据库封装
引言 我一直在寻找一种简单有效的库,它能在简化数据库相关的编程的同时提供一种异步的方法来预防死锁. 我找到的大部分库要么太繁琐,要么灵活性不足,所以我决定自己写个. 使用这个库,你可以轻松地连接到任何 ...
- linux下的java远程调试jpda+tomcat
项目放到linux服务器了,服务器的环境或者数据可能和我们本地不一样,这个时候我们可能需要远程的断点进行调试,来查看请求过程中的各个变量的值.这里我们的应用服务器用的tomcat5.5.17 这个时候 ...