使用值类型的ToString方法
在连接字符串时经常使用+号直接将数字添加到字符串中这种方法虽然简单也可以得到正确结果但是由于涉及到不同的数据类型数字需要通过装箱操作转化为引用类型才可以添加到字符串中但是装箱操作对性能影响较大因为在进行这类处理时将在托管堆中分配一个新的对象原有的值复制到新创建的对象中
使用值类型的ToString方法可以避免装箱操作从而提高应用程序性能
int num=;
string str=go+numToString();
运用StringBuilder类
String类对象是不可改变的对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象其方法ToString对性能的提高并非很显着
在处理字符串时最好使用StringBuilder类其NET 命名空间是SystemText该类并非创建新的对象而是通过AppendRemoveInsert等方法直接对字符串进行操作通过ToString方法返回操作结果
其定义及操作语句如下所示
int num;
SystemTextStringBuilder str = new SystemTextStringBuilder(); //创建字符串
strAppend(numToString()); //添加数值num
ResponseWrite(strToString); //显示操作结果
使用 HttpServerUtilityTransfer 方法在同一应用程序的页面间重定向
采用 ServerTransfer 语法在页面中使用该方法可避免不必要的客户端重定向(ResponseRedirect)
避免使用ArrayList
因为任何对象添加到ArrayList都要封箱为SystemObject类型从ArrayList取出数据时要拆箱回实际的类型建议使用自定义的集合类型代替ArrayList 提供了一个新的类型叫泛型这是一个强类型使用泛型集合就可以避免了封箱和拆箱的发生提高了性能
使用HashTale代替其他字典集合类型
(如StringDictionaryNameValueCollectionHybridCollection)存放少量数据的时候可以使用HashTable
为字符串容器声明常量不要直接把字符封装在双引号 里面
//避免
MyObject obj = new MyObject();
objStatus = ACTIVE;
//推荐
const string C_STATUS = ACTIVE;
MyObject obj = new MyObject();
objStatus = C_STATUS;
不要用ToUpper()ToLower()转换字符串进行比较用StringCompare代替它可以忽略大小写进行比较
例
const string C_VALUE = COMPARE;
if (StringCompare(sVariable C_VALUE true) == )
{
ConsoleWrite( 相同);
}
也可以用str == StringEmpty或者strLength == 判断是否为空(注意判断输入数据的长度可防止sql注入式攻击)
将String对象的Length属性与比较是最快的方法避免不必要的调用 ToUpper 或 ToLower 方法
类型转化IntTryParse()优于IntParse()优于ConvertToInt()
建议NET下用IntParse()NET用IntTryParse()
因为
ConvertToInt 会把最终的解析工作代理给 IntParse
IntParse 会把最终的解析工作代理给NumberParseInt
IntTryParse 会把最终的解析工作代理给NumberTryParseInt
如果只是从XML对象读取数据用只读的XPathDocument代替XMLDocument可以提高性能
//避免
XmlDocument xmld = new XmlDocument();
xmldLoadXml(sXML);
txtNameText = xmldSelectSingleNode( /packet/child)InnerText;
//推荐
XPathDocument xmldContext = new XPathDocument(new StringReader(oContextValue));
XPathNavigator xnav = xmldContextCreateNavigator();
XPathNodeIterator xpNodeIter = xnavSelect( packet/child);
iCount = xpNodeIterCount;
xpNodeIter = xnavSelectDescendants(XPathNodeTypeElement false);
while(xpNodeIterMoveNext())
{
sCurrValues += xpNodeIterCurrentValue+ ;
}
避免在循环体里声明变量应该在循环体外声明变量在循环体里初始化
C#程序开发要遵循的一个基本原则就是避免不必要的对象创建
//避免
for(int i=; i<; i++)
{
SomeClass objSC = new SomeClass();
}
//推荐
SomeClass objSC = null;
for(int i=; i <; i++)
{
objSC = new SomeClass();
}
捕获指定的异常不要使用通用的SystemException
//避免
try
{
<some logic>
}
catch(Exception exc)
{
<Error handling>
}
//推荐
try
{
<some logic>
}
catch(SystemNullReferenceException exc)
{
<Error handling>
}
catch(SystemArgumentOutOfRangeException exc)
{
<Error handling>
}
catch(SystemInvalidCastException exc)
{
<Error handling>
}
使用Trycatchfinally时 要在finally里释放占用的资源如连接文件流等
不然在Catch到错误后占用的资源不能释放
try
{}
catch
{}
finally
{
conntionclose();
}
不要用Exception控制程序流程
有些程序员可能会使用异常来实现一些流程控制例如
try{
result=/num;
}
Catch(Exception e)
{
result=;
}
但实际上Exception是非常消耗系统性能的除非必要不应当使用异常控制来实现程序流程上面的代码应当写为
if(num!=)
result=/num;
else
result=;
避免使用递归调用和嵌套循环使用他们会严重影响性能在不得不用的时候才使用
禁用和Jscript动态数据类型
应当始终显示地申明变量数据类型这能够节约程序的执行时间以往开发人员喜欢使用 Visual BasicVBScript 和 JScript 的原因之一就是它们所谓无类型的性质变量不需要显式类型声明并能够简单地通过使用来创建它们当从一个类型到另一个类型进行分配时转换将自动执行不过这种便利会大大损害应用程序的性能
如
为了获得最佳的性能当声明 JScript NET 变量时请为其分配一个类型例如var A : String;