使用值類型的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;
From:http://tw.wingwit.com/Article/program/net/201311/13198.html