C#源代码缺陷说明.docx
《C#源代码缺陷说明.docx》由会员分享,可在线阅读,更多相关《C#源代码缺陷说明.docx(23页珍藏版)》请在冰豆网上搜索。
C#源代码缺陷说明
1.1 资源管理类
资源泄漏
缺陷描述:
实现Idisposable接口的对象使用结束后未调用Dispose方法。
缺陷危害:
资源泄漏可能导致非托管资源长时间被占用而无法释放,进而可能导致资源耗尽而系统不可用。
修复或避错建议:
实现Idisposable接口的对象使用结束后调用Dispose方法释放非托管资源或者将实现Idisposable接口的对象放到using语句中。
示例1:
不规范用法
publicvoidExampleFun(stringname)
{
StreamReaderreader=newStreamReader(name);
//使用reader对象
...
}//方法退出前未释放reader对象的资源
示例2:
规范用法
try
}
catch(Exceptione)
finally
reader.Close();//Close方法调用了Dispose方法释放reader对象的资源
示例3:
using(StreamReaderreader=newStreamReader(name))
1.2 解引用类
null解引用
对于值可能为null的引用类型变量,未检查变量是否为null而直接解引用该变量。
null解引用会导致程序抛出NullReferenceException类型的异常。
在解引用变量前检查变量是否为null并对变量值为null的情况进行处理。
示例4:
publicvoidExampleFun()
strings1=null;
strings2=s1.Trim();//null解引用
示例5:
if(s1!
=null)
strings2=s1.Trim();
1.3 控制语句类
用于控制程序流程的条件表达式为常量
用于控制程序流程的条件表达式的结果恒为真或恒为假。
用于控制程序流程的条件表达式为常量时,代码的部分分支路径永远不会被执行,条件表达式变得毫无意义。
当用于控制循环的条件表达式的结果恒为真时,可能导致程序进入死循环。
示例:
strings="";
if(s==null)//用于控制程序流程的条件表达式“s==null”恒为假
return;
“If”语句的“then”分支无语句
“If”语句的“then”分支无语句。
“If”语句的“then”分支无语句通常不是程序的本意。
“If”语句的“then”分支无语句通常是遗漏了代码,可能会导致程序出错或程序功能实现不正确。
补充“then”分支的代码。
publicvoidExampleFun(booleancond)
if(cond)
//“If”语句的“then”分支无语句
“If”语句的“then”分支只有分号
“If”语句的“then”分支只有分号。
“If”语句的“then”分支只有分号通常不是程序的本意。
“If”语句的“then”分支只有分号通常是打字错误,可能会导致“If”语句的“then”分支部分的代码在不满足判断条件时也进行执行。
修复打字错误。
inta=0;
if(a>0);//“If”语句的“then”分支只有分号
a++;
1.4 运算处理类
非法计算
对于某些算术运算的操作数,其取值是受到限制的,如%,/,%=,/=后面的除数都不应该为0。
一些数学函数的参数是有定义域的,如果变量的取值范围中包括不合法的数据则会引起异常。
如asin,acos,atan2,div,fmod,ldiv,log,log10,sqrt等。
非法计算错误会产生运行时异常处理逻辑,导致未知错误。
在使用算术运算前应检查操作数或运算参数,判断其是否符合相应的约束,并对不符合的情况进行处理。
示例6:
publicvoidExampleFun(inti)
if(i<10)
i=20/i;//非法计算
示例7:
if((i<10)&&(i!
=0))
i=20/i;
公共引用类型重载等于运算符
公共的引用类型通过定义Equals方法重载等于运算符。
对于引用类型,默认的等于运算符通常是正确的,不需要重载。
即默认情况下,只有两个引用指向同一个对象时才相等。
若重载公共引用类型的等于运算符,可能导致对该类使用等于运算符时产生歧义。
publicclassMyClass
publicboolEquals(objecto)
精度丢失
两个整数相除,结果赋值给一个浮点类型的变量。
两个整数相除时,即使不能整除,其结果仍然为整数。
若程序的本意为获取相除后的浮点数,则会造成精度丢失。
先将两个整数分别转换成浮点数类型后再进行相除运算。
示例8:
publicvoidfoo(inta,intb)
floatf;
f=a/b;//精度丢失
示例9:
f=((float)a)/((float)b);
浮点数的相等或不等比较
两个浮点型或双精度浮点型的值使用“==”或“!
=”运算符进行比较。
浮点数在计算机中的存储和计算是不精确的,因此对浮点数采用“==”或“!
=”运算符进行比较可能得到与期望结果相反的结果。
通过计算两个浮点数之间的差的绝对值是否小于一个允许的误差值判断浮点数之间是否相等或不等。
publicboolExampleFun(doublea,doubleb)
if(a==b)//浮点数的相等比较
returntrue;
returnfalse;
自身相除或比较
在表达式中变量与自己相除或作比较。
自身相除或比较通常不是程序的本意,程序中可能存在打字错误,自身相除可能导致程序出错或程序功能实现不正确,自身比较可能导致部分代码永远不会被执行。
修复程序中存在的打字错误。
示例10:
publicboolExampleFun(inta,intb)
if(a{returntrue;}returnfalse;}示例11:规范用法publicboolExampleFun(inta,intb){if(a{returntrue;}returnfalse;}1.5 比较判断类Equals方法的参数为对象自身缺陷描述:代码中调用Equals方法的对象和Equals方法的参数对象相同。缺陷危害:若代码中调用Equals方法的对象和Equals方法的参数对象相同,则返回值恒为true,当作为条件表达式用于控制程序流程时,代码的部分分支路径永远不会被执行,条件表达式无意义。当作为条件表达式用于控制循环语句时,可能导致程序进入死循环。示例:不规范用法publicvoidExampleFun(){strings="abc";if(s.Equals(s))//“s.Equals(s)”恒为真{...}...}Equals方法的参数为null缺陷描述:调用Equals方法时参数为null。缺陷危害:调用Equals方法时参数为null则返回值恒为假,作为条件表达式时会导致部分代码永远不会被执行,条件表达式无意义。示例:不规范用法publicvoidExampleFun(){strings="abc";if(s.Equals(null))//“s.Equals(null)”恒为假{...}...}this引用与null比较缺陷描述:用this引用与null进行比较。缺陷危害:this引用不可能为null,因此使用this引用与null进行比较无意义。修复或避错建议:删除this引用与null进行比较的代码。示例:不规范用法publicvoidExampleFun(){strings="abc";if(this==null)//“this==null”恒为假{...}...}Equals方法的错误使用缺陷描述:Equals方法的错误使用情况包括:两个数组间使用Equals方法进行比较、数组和非数组间使用Equals方法进行比较、不兼容的类型间使用Equals方法进行比较。缺陷危害:两个数组间使用Equals方法进行比较就相当于“==”运算符,比较的是数组对象的引用而不是数组的值,可能导致判断逻辑错误;数组和非数组间、不兼容的类型间使用Equals方法进行比较,比较的结果总是false,可能导致部分代码永远不会被执行,条件表达式无意义。修复或避错建议:两个数组间的值比较应对数组的每个元素的值分别进行比较,两个数组间的引用比较应使用“==”运算符。示例:不规范用法publicclassMyClass{string[]names;publicboolequals(Objecto){if(!(oisMyClass)){returnfalse;}MyClassm=(MyClass)o;returnthis.names.Equals(m.names);//两个数组间采用Equals方法进行比较}}值类型与null进行比较缺陷描述:当泛型中的类型参数没有限制为引用类型时,将该类型的变量与null进行比较。缺陷危害:当使用泛型时,若类型参数为值类型,将值类型的变量与null进行相等比较结果恒为假,导致部分代码永远不会被执行。修复或避错建议:限制泛型中的类型参数为引用类型。示例12:不规范用法classMyClass{publicvoidExampleFun(Tt){if(t==null)//t可能为值类型,将值类型与null进行相等比较结果恒为假{...}}}示例13:规范用法classMyClasswhereT:class//限制参数类型T只能为引用类型{publicvoidExampleFun(Tt){if(t==null){...}}}1.6 类型转换类类型转换错误缺陷描述:对象强制转换的目标类型不为对象创建时的类型或其父类。缺陷危害:对象强制转换的目标类型不为对象创建时的类型或其父类会导致程序抛出InvalidCastException类型的异常。修复或避错建议:如果不确定转换的目标类型是否为对象创建时的类型或其父类,可采用“as”关键字进行类型转换,并判断类型转换的结果是否为null。示例14:不规范用法publicvoidExampleFun(){Objectobj="abc";//obj对象为string类型,无法转换成StringBuilder类型StringBuildersb=(StringBuilder)obj;}示例15:规范用法publicvoidExampleFun(Objectobj){StringBuildersb=objasStringBuilder;if(sb==null){return;}}1.7 声明定义类相同标识符缺陷描述:局部变量或方法参数与类或结构体的成员变量具有相同的标识符。缺陷危害:当局部变量或方法参数与类或结构体的成员变量具有相同的标识符时,局部变量或方法参数会隐藏类或结构体的成员变量,使用时容易造成混淆。示例:不规范用法publicclassMyClass{privateinta;privatestrings;publicvoidExampleFun(inta)//方法参数与类或结构体的成员变量具有相同的标识符{strings;//局部变量与类或结构体的成员变量具有相同的标识符}}非构造器的方法命名与类名相同缺陷描述:方法命名与类名相同,且包含返回类型。缺陷危害:方法与构造器名字相同容易造成混淆,可能造成不期望的结果。修复或避错建议:对非构造器的方法进行命名时不要与类名相同。若为构造器,则不应包含返回类型。示例16:不规范用法publicclassMyClass{publicstringname;publicvoidMyClass(stringname)//方法名与类名相同,返回类型为“void”{this.name=name;}}示例17:规范用法publicclassMyClass{publicstringname;publicMyClass(stringname){this.name=name;}}1.8 调用返回类忽略只作用在返回值上的方法的返回值缺陷描述:调用只作用在返回值上的方法,该方法不改变其他对象的值,并且调用该方法的返回值未赋值给变量保存。缺陷危害:方法只作用在返回值上却忽略返回值则方法调用无任何意义,可能会导致程序出错或程序功能实现不正确。修复或避错建议:调用只作用在返回值上的方法时,保存方法的返回值。示例18:不规范用法publicstringExampleFun(strings){s.Trim();//未保存s.trim方法的返回值returns;}示例19:规范用法publicstringExampleFun(strings){stringstr;str=s.Trim();returnstr;}忽略新创建的对象缺陷描述:使用“new”关键字创建对象时,未保存对象的引用,也未直接调用对象的方法。缺陷危害:忽略新创建对象会造成程序代码难以理解,也有可能隐藏逻辑错误。修复或避错建议:保存新创建的对象的引用,或直接调用新创建的对象的方法。示例20:不规范用法publicvoidExampleFun(){newObject();//新创建对象被忽略...}示例21:规范用法publicvoidExampleFun(){Objecto=newObject();...}1.9 冗余类自我赋值缺陷描述:变量赋值给自己。缺陷危害:自我赋值通常是一个打字错误,可能会导致程序出错或程序功能实现不正确。示例22:不规范用法publicvoidExampleFun(){stringt="abc";strings;t=t;//自我赋值}示例23:规范用法publicvoidExampleFun(){stringt="abc";strings;s=t;}变量赋值后未被使用缺陷描述:程序对变量赋值后,变量从未被使用。缺陷危害:在大多数情况下,未使用的变量属于程序的冗余代码,但也有可能是程序的逻辑错误造成变量赋值后未被使用。修复或避错建议:删除冗余代码或修复程序中的逻辑错误。示例24:不规范用法publicstringExampleFun(){strings="abc";//变量s赋值后未被使用return"def";}示例25:规范用法publicstringExampleFun(){strings="abc";returns+"def";}使用变量时变量恒为null缺陷描述:在表达式中使用变量时变量恒为null。缺陷危害:在表达式中使用变量时变量恒为null通常不是程序的本意,可能是忘记了对变量进行赋值,可能会导致程序功能实现不正确。修复或避错建议:在使用变量前对变量进行赋值。示例26:不规范用法publicstringExampleFun(stringfirstName,stringlastName){stringfullName=null;returnfullName;//name总是为null}示例27:规范用法publicstringExampleFun(stringfirstName,stringlastName){stringfullName=null;fullName=firstName+lastName;returnfullName;}往容器中添加容器自身缺陷描述:在容器中调用addAll方法,但方法的参数是容器自身。缺陷危害:往容器中添加容器自身无意义。示例:不规范用法publicvoidExampleFun(Collectionc){c.addAll(c);//往容器中添加容器自身return;}1.10 程序效率类在循环体中使用“+”或“+=”运算符拼接字符串缺陷描述:在循环体中使用“+”或“+=”运算符拼接字符串。缺陷危害:在循环体中使用“+”或“+=”运算符拼接字符串可能会创建大量的字符串对象,从而导致程序执行效率低下。修复或避错建议:使用StringBuilder类完成字符串拼接后再转换为string类型字符串。示例28:不规范用法publicstringExampleFun(intn,stringa){stringb="";for(inti=0;i{b+=a;//在循环体中使用“+=”运算符拼接字符串}returnb;}示例29:规范用法publicstringExampleFun(intn,stringa){StringBuilderb=newStringBuilder();for(inti=0;i{b.append(a);}returnb.ToString();}调用string.ToString方法缺陷描述:调用string.ToString方法。缺陷危害:调用string.ToString方法会创建额外的字符串对象,导致消耗更多的内存和降低程序的运行效率,无任何功能作用。修复或避错建议:直接使用string对象自身,避免调用string.ToString方法。示例30:不规范用法publicstringExampleFun(stringa,Objectb){returna.ToString()+b.ToString();//调用string.ToString方法}示例31:规范用法publicstringExampleFun(stringa,Objectb){returna+b.ToString();}1.11 异常处理类catch语句块为空缺陷描述:catch语句块中无任何语句。缺陷危害:catch语句块为空即捕获了异常但不对异常进行任何处理,这可能导致异常被忽略。修复或避错建议:对捕获的异常进行处理,如将异常记录到日志中。示例:不规范用法publicvoidExampleFun(){try{...}catch(Exceptione){//catch语句块为空}}1.12 其他类ReferenceEquals方法的参数为值类型缺陷描述:Object.ReferenceEquals方法的参数为值类型。缺陷危害:若Object.ReferenceEquals方法的参数为值类型,该方法的返回值恒为假,可能导致程序功能实现不正确。示例:不规范用法publicboolExampleFun(inta,Objecto){returnObject.ReferenceEquals(a,o);//a为值类型}空接口缺陷描述:是指接口没有声明任何成员且没有继承两个或两个以上的其他接口。缺陷危害:空的接口没有任何意义。示例32:不规范用法//接口未继承其他接口且未声明任何成员publicinterfaceEmptyInterface{}示例33:不规范用法//接口只继承了一个接口且未声明任何成员publicinterfaceMyInterface:IComparable{}构造器调用虚方法缺陷描述:构造器调用带有“virtual”关键字的方法。缺陷危害:在构造器中调用虚方法可能导致子类的构造器未执行前先执行子类的方法,即子类的实例未完成初始化之前先调用了子类的方法。示例:不规范用法classMyClass{publicMyClass(){ExampleFun();//构造器调用虚方法}publicvirtualvoidExampleF
示例11:
if(a
1.5 比较判断类
Equals方法的参数为对象自身
代码中调用Equals方法的对象和Equals方法的参数对象相同。
若代码中调用Equals方法的对象和Equals方法的参数对象相同,则返回值恒为true,当作为条件表达式用于控制程序流程时,代码的部分分支路径永远不会被执行,条件表达式无意义。
当作为条件表达式用于控制循环语句时,可能导致程序进入死循环。
strings="abc";
if(s.Equals(s))//“s.Equals(s)”恒为真
Equals方法的参数为null
调用Equals方法时参数为null。
调用Equals方法时参数为null则返回值恒为假,作为条件表达式时会导致部分代码永远不会被执行,条件表达式无意义。
if(s.Equals(null))//“s.Equals(null)”恒为假
this引用与null比较
用this引用与null进行比较。
this引用不可能为null,因此使用this引用与null进行比较无意义。
删除this引用与null进行比较的代码。
if(this==null)//“this==null”恒为假
Equals方法的错误使用
Equals方法的错误使用情况包括:
两个数组间使用Equals方法进行比较、数组和非数组间使用Equals方法进行比较、不兼容的类型间使用Equals方法进行比较。
两个数组间使用Equals方法进行比较就相当于“==”运算符,比较的是数组对象的引用而不是数组的值,可能导致判断逻辑错误;数组和非数组间、不兼容的类型间使用Equals方法进行比较,比较的结果总是false,可能导致部分代码永远不会被执行,条件表达式无意义。
两个数组间的值比较应对数组的每个元素的值分别进行比较,两个数组间的引用比较应使用“==”运算符。
string[]names;
publicboolequals(Objecto)
if(!
(oisMyClass))
MyClassm=(MyClass)o;
returnthis.names.Equals(m.names);//两个数组间采用Equals方法进行比较
值类型与null进行比较
当泛型中的类型参数没有限制为引用类型时,将该类型的变量与null进行比较。
当使用泛型时,若类型参数为值类型,将值类型的变量与null进行相等比较结果恒为假,导致部分代码永远不会被执行。
限制泛型中的类型参数为引用类型。
示例12:
classMyClass
publicvoidExampleFun(Tt)
if(t==null)//t可能为值类型,将值类型与null进行相等比较结果恒为假
示例13:
classMyClasswhereT:
class//限制参数类型T只能为引用类型
if(t==null)
1.6 类型转换类
类型转换错误
对象强制转换的目标类型不为对象创建时的类型或其父类。
对象强制转换的目标类型不为对象创建时的类型或其父类会导致程序抛出InvalidCastException类型的异常。
如果不确定转换的目标类型是否为对象创建时的类型或其父类,可采用“as”关键字进行类型转换,并判断类型转换的结果是否为null。
示例14:
Objectobj="abc";
//obj对象为string类型,无法转换成StringBuilder类型
StringBuildersb=(StringBuilder)obj;
示例15:
publicvoidExampleFun(Objectobj)
StringBuildersb=objasStringBuilder;
if(sb==null)
1.7 声明定义类
相同标识符
局部变量或方法参数与类或结构体的成员变量具有相同的标识符。
当局部变量或方法参数与类或结构体的成员变量具有相同的标识符时,局部变量或方法参数会隐藏类或结构体的成员变量,使用时容易造成混淆。
privateinta;
privatestrings;
publicvoidExampleFun(inta)//方法参数与类或结构体的成员变量具有相同的标识符
strings;//局部变量与类或结构体的成员变量具有相同的标识符
非构造器的方法命名与类名相同
方法命名与类名相同,且包含返回类型。
方法与构造器名字相同容易造成混淆,可能造成不期望的结果。
对非构造器的方法进行命名时不要与类名相同。
若为构造器,则不应包含返回类型。
示例16:
publicstringname;
publicvoidMyClass(stringname)//方法名与类名相同,返回类型为“void”
this.name=name;
示例17:
publicMyClass(stringname)
1.8 调用返回类
忽略只作用在返回值上的方法的返回值
调用只作用在返回值上的方法,该方法不改变其他对象的值,并且调用该方法的返回值未赋值给变量保存。
方法只作用在返回值上却忽略返回值则方法调用无任何意义,可能会导致程序出错或程序功能实现不正确。
调用只作用在返回值上的方法时,保存方法的返回值。
示例18:
publicstringExampleFun(strings)
s.Trim();//未保存s.trim方法的返回值
returns;
示例19:
stringstr;
str=s.Trim();
returnstr;
忽略新创建的对象
使用“new”关键字创建对象时,未保存对象的引用,也未直接调用对象的方法。
忽略新创建对象会造成程序代码难以理解,也有可能隐藏逻辑错误。
保存新创建的对象的引用,或直接调用新创建的对象的方法。
示例20:
newObject();//新创建对象被忽略
示例21:
Objecto=newObject();
1.9 冗余类
自我赋值
变量赋值给自己。
自我赋值通常是一个打字错误,可能会导致程序出错或程序功能实现不正确。
示例22:
stringt="abc";
strings;
t=t;//自我赋值
示例23:
s=t;
变量赋值后未被使用
程序对变量赋值后,变量从未被使用。
在大多数情况下,未使用的变量属于程序的冗余代码,但也有可能是程序的逻辑错误造成变量赋值后未被使用。
删除冗余代码或修复程序中的逻辑错误。
示例24:
publicstringExampleFun()
strings="abc";//变量s赋值后未被使用
return"def";
示例25:
returns+"def";
使用变量时变量恒为null
在表达式中使用变量时变量恒为null。
在表达式中使用变量时变量恒为null通常不是程序的本意,可能是忘记了对变量进行赋值,可能会导致程序功能实现不正确。
在使用变量前对变量进行赋值。
示例26:
publicstringExampleFun(stringfirstName,stringlastName)
stringfullName=null;
returnfullName;//name总是为null
示例27:
fullName=firstName+lastName;
returnfullName;
往容器中添加容器自身
在容器中调用addAll方法,但方法的参数是容器自身。
往容器中添加容器自身无意义。
publicvoidExampleFun(Collectionc)
c.addAll(c);//往容器中添加容器自身
1.10 程序效率类
在循环体中使用“+”或“+=”运算符拼接字符串
在循环体中使用“+”或“+=”运算符拼接字符串。
在循环体中使用“+”或“+=”运算符拼接字符串可能会创建大量的字符串对象,从而导致程序执行效率低下。
使用StringBuilder类完成字符串拼接后再转换为string类型字符串。
示例28:
publicstringExampleFun(intn,stringa)
stringb="";
for(inti=0;i{b+=a;//在循环体中使用“+=”运算符拼接字符串}returnb;}示例29:规范用法publicstringExampleFun(intn,stringa){StringBuilderb=newStringBuilder();for(inti=0;i{b.append(a);}returnb.ToString();}调用string.ToString方法缺陷描述:调用string.ToString方法。缺陷危害:调用string.ToString方法会创建额外的字符串对象,导致消耗更多的内存和降低程序的运行效率,无任何功能作用。修复或避错建议:直接使用string对象自身,避免调用string.ToString方法。示例30:不规范用法publicstringExampleFun(stringa,Objectb){returna.ToString()+b.ToString();//调用string.ToString方法}示例31:规范用法publicstringExampleFun(stringa,Objectb){returna+b.ToString();}1.11 异常处理类catch语句块为空缺陷描述:catch语句块中无任何语句。缺陷危害:catch语句块为空即捕获了异常但不对异常进行任何处理,这可能导致异常被忽略。修复或避错建议:对捕获的异常进行处理,如将异常记录到日志中。示例:不规范用法publicvoidExampleFun(){try{...}catch(Exceptione){//catch语句块为空}}1.12 其他类ReferenceEquals方法的参数为值类型缺陷描述:Object.ReferenceEquals方法的参数为值类型。缺陷危害:若Object.ReferenceEquals方法的参数为值类型,该方法的返回值恒为假,可能导致程序功能实现不正确。示例:不规范用法publicboolExampleFun(inta,Objecto){returnObject.ReferenceEquals(a,o);//a为值类型}空接口缺陷描述:是指接口没有声明任何成员且没有继承两个或两个以上的其他接口。缺陷危害:空的接口没有任何意义。示例32:不规范用法//接口未继承其他接口且未声明任何成员publicinterfaceEmptyInterface{}示例33:不规范用法//接口只继承了一个接口且未声明任何成员publicinterfaceMyInterface:IComparable{}构造器调用虚方法缺陷描述:构造器调用带有“virtual”关键字的方法。缺陷危害:在构造器中调用虚方法可能导致子类的构造器未执行前先执行子类的方法,即子类的实例未完成初始化之前先调用了子类的方法。示例:不规范用法classMyClass{publicMyClass(){ExampleFun();//构造器调用虚方法}publicvirtualvoidExampleF
b+=a;//在循环体中使用“+=”运算符拼接字符串
returnb;
示例29:
StringBuilderb=newStringBuilder();
for(inti=0;i{b.append(a);}returnb.ToString();}调用string.ToString方法缺陷描述:调用string.ToString方法。缺陷危害:调用string.ToString方法会创建额外的字符串对象,导致消耗更多的内存和降低程序的运行效率,无任何功能作用。修复或避错建议:直接使用string对象自身,避免调用string.ToString方法。示例30:不规范用法publicstringExampleFun(stringa,Objectb){returna.ToString()+b.ToString();//调用string.ToString方法}示例31:规范用法publicstringExampleFun(stringa,Objectb){returna+b.ToString();}1.11 异常处理类catch语句块为空缺陷描述:catch语句块中无任何语句。缺陷危害:catch语句块为空即捕获了异常但不对异常进行任何处理,这可能导致异常被忽略。修复或避错建议:对捕获的异常进行处理,如将异常记录到日志中。示例:不规范用法publicvoidExampleFun(){try{...}catch(Exceptione){//catch语句块为空}}1.12 其他类ReferenceEquals方法的参数为值类型缺陷描述:Object.ReferenceEquals方法的参数为值类型。缺陷危害:若Object.ReferenceEquals方法的参数为值类型,该方法的返回值恒为假,可能导致程序功能实现不正确。示例:不规范用法publicboolExampleFun(inta,Objecto){returnObject.ReferenceEquals(a,o);//a为值类型}空接口缺陷描述:是指接口没有声明任何成员且没有继承两个或两个以上的其他接口。缺陷危害:空的接口没有任何意义。示例32:不规范用法//接口未继承其他接口且未声明任何成员publicinterfaceEmptyInterface{}示例33:不规范用法//接口只继承了一个接口且未声明任何成员publicinterfaceMyInterface:IComparable{}构造器调用虚方法缺陷描述:构造器调用带有“virtual”关键字的方法。缺陷危害:在构造器中调用虚方法可能导致子类的构造器未执行前先执行子类的方法,即子类的实例未完成初始化之前先调用了子类的方法。示例:不规范用法classMyClass{publicMyClass(){ExampleFun();//构造器调用虚方法}publicvirtualvoidExampleF
b.append(a);
returnb.ToString();
调用string.ToString方法
调用string.ToString方法。
调用string.ToString方法会创建额外的字符串对象,导致消耗更多的内存和降低程序的运行效率,无任何功能作用。
直接使用string对象自身,避免调用string.ToString方法。
示例30:
publicstringExampleFun(stringa,Objectb)
returna.ToString()+b.ToString();//调用string.ToString方法
示例31:
returna+b.ToString();
1.11 异常处理类
catch语句块为空
catch语句块中无任何语句。
catch语句块为空即捕获了异常但不对异常进行任何处理,这可能导致异常被忽略。
对捕获的异常进行处理,如将异常记录到日志中。
//catch语句块为空
1.12 其他类
ReferenceEquals方法的参数为值类型
Object.ReferenceEquals方法的参数为值类型。
若Object.ReferenceEquals方法的参数为值类型,该方法的返回值恒为假,可能导致程序功能实现不正确。
publicboolExampleFun(inta,Objecto)
returnObject.ReferenceEquals(a,o);//a为值类型
空接口
是指接口没有声明任何成员且没有继承两个或两个以上的其他接口。
空的接口没有任何意义。
示例32:
//接口未继承其他接口且未声明任何成员
publicinterfaceEmptyInterface
示例33:
//接口只继承了一个接口且未声明任何成员
publicinterfaceMyInterface:
IComparable
构造器调用虚方法
构造器调用带有“virtual”关键字的方法。
在构造器中调用虚方法可能导致子类的构造器未执行前先执行子类的方法,即子类的实例未完成初始化之前先调用了子类的方法。
publicMyClass()
ExampleFun();//构造器调用虚方法
publicvirtualvoidExampleF
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1