|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。1.制止将多个类放在一个文件内里。
2.一个文件应当只要一个定名空间,制止将多个定名空间放在统一个文件内里。
3.一个文件最好不要凌驾500行的代码(不包含呆板发生的代码)。
4.一个办法的代码长度最好不要凌驾25行。
5.制止办法中有凌驾5个参数的情形。利用布局来传送多个参数。
6.每行代码不要凌驾80个字符。
7.不要手工的修正呆板发生的代码。
a)假如必要编纂呆板发生的代码,编纂格局微风格要切合该编码尺度。
b)Usepartialclasseswheneverpossibletofactoroutthemaintainedportions.
8.制止使用正文注释不言而喻的代码。
a)代码应当能够自注释。好的代码由可读的变量和办法定名因而不必要正文。
9.Documentonlyoperationalassumptions,algorithminsightsandsoon.
10.制止利用办法级的文档。
a)利用扩大的API文档申明之。
b)只要在该办法必要被其他的开辟者利用的时分才利用办法级的正文。(在C#中就是///)
11.不要硬编码数字的值,老是利用机关函数设定其值。
12.只要是天然布局才干间接利用const,好比一个礼拜的天数。
13.制止在只读的变量上利用const。假如想完成只读,能够间接利用readonly。
publicclassMyClass{
publicreadonlyintNumber;
publicMyClass(intsomeValue)
{
Number=someValue;
}
publicconstintDaysInWeek=7;
}
14.每一个假定必需利用Assert反省
a)均匀每15行要有一次反省(Assert)
usingSystem.Diagnostics;
objectGetObject(){…}
objectobj=GetObject();
Debug.Assert(obj!=null);
15.代码的每行都应当经由过程白盒体例的测试。
16.只抛出已显现处置的非常。
17.在捕捉(catch)语句的抛出非常子句中(throw),老是抛出原始非常保护原始毛病的仓库分派。
catch(Exceptionexception)
{
MessageBox.Show(exception.Message);
throw;//和throwexception一样。
}
18.制止办法的前往值是毛病代码。
19.只管制止界说自界说非常类。
20.当必要界说自界说的非常时:
a)自界说非常要承继于ApplicationException。
b)供应自界说的序列化功效。
21.制止在单个程序集里利用多个Main办法。
22.只对外发布需要的操纵,其他的则为internal。
23.Avoidfriendassemblies,asitincreasesinter-assemblycoupling.
24.Avoidcodethatreliesonanassemblyrunningfromaparticularlocation.
25.使使用程序集只管为最小化代码(EXE客户程序)。利用类库来交换包括的商务逻辑。
26.制止给列举变量供应显式的值。
//准确办法
publicenumColor
{
Red,Green,Blue
}
//制止
publicenumColor{
Red=1,Green=2,Blue=3
}
27.制止指定特别范例的列举变量。
//制止
publicenumColor:long{Red,Green,Blue}
28.即便if语句只要一句,也要将if语句的内容用年夜括号扩起来。
29.制止利用trinary前提操纵符。
30.制止在前提语句中挪用前往bool值的函数。可使用部分变量并反省这些部分变量。
boolIsEverythingOK()
{…}
//制止
if(IsEverythingOK())
{…}
//交换计划
boolok=IsEverythingOK();
if(ok)
{…}
31.老是利用基于0入手下手的数组。
32.在轮回中老是显式的初始化援用范例的数组。
publicclassMyClass{
MyClass[]array=newMyClass[100];
for(intindex=0;index<array.Length;index++)
array[index]=newMyClass();
}
33.不要供应public和protected的成员变量,利用属性取代他们。
34.制止在承继中利用new而利用override交换。
35.在不是sealed的类中老是将public和protected的办法标志成virtual的。
36.除非利用interop(COM+或其他的dll)代码不然不要利用不平安的代码(unsafecode)。
37.制止显现的转换,利用as操纵符举行兼容范例的转换。
Dogdog=newGermanShepherd();
GermanShepherdshepherd=dogasGermanShepherd;
if(shepherd!=null)
{…}
38.当类成员包含托付的时分
a)Copyadelegatetoalocalvariablebeforepublishingtoavoidconcurrencyracecondition.
b)在挪用托付之前必定要反省它是不是为null
publicclassMySource
{
publiceventEventHandlerMyEvent;
publicvoidFireEvent()
{
EventHandlertemp=MyEvent;
if(temp!=null)
{
temp(this,EventArgs.Empty);
}
}
}
39.不要供应大众的事务成员变量,利用事务会见器交换这些变量。
publicclassMySource
{
MyDelegatem_SomeEvent;
publiceventMyDelegateSomeEvent
{
add
{
m_SomeEvent+=value;
}
remove
{
m_SomeEvent-=value;
}
}
}
40.利用一个事务匡助类来发布事务的界说。
41.老是利用接口。
42.类和接口中的办法和属性最少为2:1的比例。
43.制止一个接口中只要一个成员。
44.只管使每一个接口中包括3-5个成员。
45.接口中的成员不该该凌驾20个。
a)实践情形大概限定为12个
46.制止接口成员中包括事务。
47.制止利用笼统办法而利用接口交换。
48.在类条理中显现接口。
49.保举利用显式的接话柄现。
50.从不假定一个范例兼容一个接口。
Defensivelyqueryforthatinterface.
SomeTypeobj1;
IMyInterfaceobj2;
/*假定已有代码初始化过obj1,接上去*/
obj2=obj1asIMyInterface;
if(obj2!=null)
{
obj2.Method1();
}
else
{
//处置毛病
}
51.体现给终极用户的字符串不要利用硬编码而要利用资本文件交换之。
52.不要硬编码大概变动的基于设置的字符串,好比毗连字符串。
53.当必要构建长的字符串的时分,利用StringBuilder不要利用string
54.制止在布局内里供应办法。
a)倡议利用参数化机关函数
b)能够重裁操纵符
55.老是要给静态变量供应静态机关函数。
56.能利用初期绑定就不要利用前期绑定。
57.利用使用程序的日记和跟踪。
58.除非在不完整的switch语句中不然不要利用goto语句。
59.在switch语句中老是要有default子句来显现信息(Assert)。
intnumber=SomeMethod();
switch(number)
{
case1:
Trace.WriteLine("Case1:");
break;
case2:
Trace.WriteLine("Case2:");
break;
default:
Debug.Assert(false);
break;
}
60.除非在机关函数中挪用其他机关函数不然不要利用this指针。
//准确利用this的例子
publicclassMyClass
{
publicMyClass(stringmessage)
{
}
publicMyClass():this("hello")
{
}
}
61.除非你想重写子类中存在称号抵触的成员大概挪用基类的机关函数不然不要利用base来会见基类的成员。
//准确利用base的例子
publicclassDog
{
publicDog(stringname)
{}
virtualpublicvoidBark(inthowLong)
{}
}
publicclassGermanShepherd:Dog
{
publicGermanShepherd(stringname):base(name)
{}
overridepublicvoidBark(inthowLong)
{
base.Bark(howLong);
}
}
62.基于模板的时分要完成Dispose()和Finalize()两个办法。
63.一般情形下制止有从System.Object转换来和由System.Object转换往的代码,而利用强迫转换大概as操纵符交换。
classSomeClass
{}
//制止:
classMyClass<T>
{
voidSomeMethod(Tt)
{
objecttemp=t;
SomeClassobj=(SomeClass)temp;
}
}
//准确:
classMyClass<T>whereT:SomeClass
{
voidSomeMethod(Tt)
{
SomeClassobj=t;
}
}
64.在一样平常情形下不要定影无限制符的接口。接口的限定级别一般能够用强范例来交换之。
publicclassCustomer
{…}
//制止:
publicinterfaceIList<T>whereT:Customer
{…}
//准确:
publicinterfaceICustomerList:IList<Customer>
{…}
65.不断定在接口内的详细办法的限定前提。
66.老是选择利用C#内置(一样平常的generics)的数据布局。学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。 |
|