1、 避免無意義的變數初始化動作
CLR保證所有物件在存取前已初始化,其做法是將分配的記憶體清除。因此,不需要將變數重新初始化為0、false或null。
//Generally expert 10 or less items
private HashTable _items = null;
private NameValueCollection = _queryString = null;
private string _siteUrl = null;
private Uri _currentUri;
string rolesCacheKey = null;
string authenticationType = "forms";
bool _isUrlRewritten = false;
string _rawUrl = null;
HttpContext _httpContext = null
DateTime requestStarTime = DateTime.Now;
要注意的是:方法中的局部變數不是從堆疊而是從堆疊上分配,所以C#不會做清零工作。如果使用了未賦值的局部變量,編譯期間即會警報。不要因為有這個印象而對所有類別的成員變數也做賦值動作,兩者的機製完全不同!
2、 ValueType 和ReferenceType
(1)、 以引用方式傳遞值型別參數
值類型從呼叫堆疊分配,引用類型從託管堆分配。當值類型用作方法參數時,預設會進行參數值複製,這抵消了值類型分配效率上的優勢。作為一項基本技巧,以引用方式傳遞值類型參數可以提高效能。
private void UseDateByRef(ref DateTime dt){ }
public void foo()
{
DateTime now = DateTime.Now;
UseDateByRef(ref now);
}
(2)、 為ValueType 提供Equals 方法
.net 預設實作的ValueType.Equals 方法使用了反射技術,依靠反射來獲得所有成員變數值做比較,這個效率極低。如果我們寫的值物件其Equals 方法要被用到(例如將值物件放到HashTable 中),那麼就應該重載Equals 方法。
public struct Rectangle
{
public double Length;
public double Breadth;
public override bool Equals ( object ob)
{
if (ob is Rectangle)
return Equels ((Rectangle)ob))
else
return false ;
}
private bool Equals (Rectangle rect)
{
return this .Length == rect.Length && this .Breadth == rect.Breach;
}
}
(3)、避免裝箱及拆箱
C#可以在值型別和參考型別之間自動轉換,方法是裝箱和拆箱。裝箱需要從堆上分配物件並拷貝值,有一定性能消耗。如果這個過程發生在循環中或是作為底層方法被頻繁調用,則應該警惕累計的效應。
一種經常的情況出現在使用集合類型時。例如:
ArrayList al = new ArrayList();
for ( int i = 0 ; i < 1000 ; i ++ )
{
al.Add(i); // Implicitly boxed because Add() takes an object
}
int f = ( int )al[ 0 ]; // The element is unboxed
解決這個問題的方法是使用.net2.0支援的泛型集合類型。