1. 無意味な変数初期化アクションを避ける
CLR は、割り当てられたメモリをゼロにすることで、すべてのオブジェクトがアクセス前に初期化されていることを確認します。したがって、変数を 0、false、または null に再初期化する必要はありません。
//一般エキスパート 10項目以下
プライベートハッシュテーブル_items = null;
プライベート NameValueCollection = _queryString = null;
プライベート文字列 _siteUrl = null;
プライベート Uri _currentUri;
文字列roleCacheKey = null;
文字列認証タイプ = "フォーム";
bool _isUrlRewrite = false;
文字列 _rawUrl = null;
HttpContext _httpContext = null
DateTime requestStarTime = DateTime.Now;
メソッド内のローカル変数はヒープからではなくスタックから割り当てられるため、C# はそれらをクリアしないことに注意してください。未割り当てのローカル変数を使用すると、コンパイル時にアラームが発生します。この印象だけですべてのクラスのメンバ変数に値を代入しないでください。両者の仕組みはまったく異なります。
2. ValueType と ReferenceType
(1). 値型パラメータを参照で渡します。
値型はコール スタックから割り当てられ、参照型はマネージド ヒープから割り当てられます。値型がメソッド パラメーターとして使用される場合、パラメーター値のコピーがデフォルトで実行され、値型の割り当てによる効率の利点が無効になります。基本的な手法として、値型パラメーターを参照渡しするとパフォーマンスが向上します。
private void UseDateByRef(ref DateTime dt){ }
パブリック void foo()
{
現在の日付時刻 = DateTime.Now;
UseDateByRef(今参照);
}
(2)、ValueTypeにEqualsメソッドを用意する
.net によってデフォルトで実装される ValueType.Equals メソッドはリフレクション テクノロジを使用し、比較のためにすべてのメンバー変数の値を取得するのにリフレクションに依存します。これは非常に非効率です。作成する値オブジェクトの Equals メソッドを使用する場合 (たとえば、値オブジェクトを HashTable に配置する場合)、Equals メソッドをオーバーロードする必要があります。
パブリック構造体 Rectangle
{
public double 長さ;
パブリック倍幅。
public override bool Equals (オブジェクト ob)
{
if (ob が長方形)
Equels ((Rectangle)ob)) を返す
それ以外
false を返します。
}
private bool Equals (長方形 Rectangle)
{
return this .Length ==ect.Length && this .Breadth ==ect.Breach;
}
}
(3) 梱包、開梱は避けてください。
C# では、ボックス化およびボックス化解除を通じて、値型と参照型の間で自動的に変換できます。ボックス化では、ヒープからオブジェクトを割り当て、値をコピーする必要があるため、一定のパフォーマンス コストがかかります。このプロセスがループ内で発生する場合、または基礎となるメソッドとして頻繁に呼び出される場合は、累積的な影響に注意する必要があります。
コレクション型を使用する場合、一般的な状況が発生します。例えば:
ArrayList al = 新しい ArrayList();
for ( int i = 0 ; i < 1000 ; i ++ )
{
al.Add(i); // Add() はオブジェクトを受け取るため、暗黙的にボックス化されます。
}
int f = ( int )al[ 0 ]; // 要素はボックス化されません。
この問題の解決策は、.net2.0 でサポートされている汎用コレクション型を使用することです。