1. Hindari tindakan inisialisasi variabel yang tidak berarti
CLR memastikan bahwa semua objek diinisialisasi sebelum mengaksesnya dengan memusatkan perhatian pada memori yang dialokasikan. Oleh karena itu, tidak perlu menginisialisasi ulang variabel ke 0, false, atau null.
//Umumnya ahli 10 item atau kurang
pribadi HashTable _items = null;
pribadi NameValueCollection = _queryString = null;
string pribadi _siteUrl = null;
Uri pribadi _currentUri;
string roleCacheKey = null;
string otentikasiType = "formulir";
bool _isUrlRewrite = salah;
string _rawUrl = nol;
HttpContext _httpContext = nol
DateTime requestStarTime = DateTime.Sekarang;
Perlu dicatat bahwa variabel lokal dalam metode ini tidak dialokasikan dari heap tetapi dari stack, jadi C# tidak akan menghapusnya. Jika variabel lokal yang tidak ditetapkan digunakan, alarm akan berbunyi selama kompilasi. Jangan memberikan nilai pada variabel anggota semua kelas hanya karena kesan ini. Mekanisme keduanya sangat berbeda!
2. Tipe Nilai dan Tipe Referensi
(1). Lewati parameter tipe nilai dengan referensi.
Tipe nilai dialokasikan dari tumpukan panggilan dan tipe referensi dialokasikan dari tumpukan terkelola. Ketika tipe nilai digunakan sebagai parameter metode, penyalinan nilai parameter dilakukan secara default, yang meniadakan keunggulan efisiensi alokasi tipe nilai. Sebagai teknik dasar, meneruskan parameter tipe nilai dengan referensi dapat meningkatkan kinerja.
kekosongan pribadi UseDateByRef(ref DateTime dt){ }
kekosongan publik foo()
{
DateTime sekarang = DateTime.Sekarang;
UseDateByRef(ref sekarang);
}
(2), Berikan metode Equals untuk ValueType
Metode ValueType.Equals yang diterapkan oleh .net secara default menggunakan teknologi refleksi dan mengandalkan refleksi untuk mendapatkan nilai semua variabel anggota untuk perbandingan. Jika metode Equals dari objek nilai yang kita tulis akan digunakan (misalnya, menempatkan objek nilai di HashTable), maka metode Equals harus di-overload.
struct publik Persegi Panjang
{
Panjang ganda publik;
luasnya ganda publik;
public override bool Sama dengan (objek objek)
{
if (ob adalah Persegi Panjang)
return Equels ((Persegi Panjang)ob))
kalau tidak
kembali salah;
}
private bool Sama dengan (Persegi Panjang persegi panjang)
{
kembalikan .Length == rect.Length && ini .Breadth == rect.Breach;
}
}
(3) Hindari pengepakan dan unboxing
C# dapat secara otomatis mengkonversi antara tipe nilai dan tipe referensi melalui boxing dan unboxing. Boxing memerlukan pengalokasian objek dari heap dan nilai penyalinan, yang memiliki biaya kinerja tertentu. Jika proses ini terjadi dalam satu putaran atau sering disebut sebagai metode yang mendasarinya, Anda harus waspada terhadap efek kumulatifnya.
Situasi umum muncul ketika bekerja dengan tipe koleksi. Misalnya:
Daftar Array al = Daftar Array baru();
untuk ( ke dalam saya = 0 ; saya < 1000 ; saya ++ )
{
al.Add(i); // Secara implisit dimasukkan ke dalam kotak karena Add() mengambil sebuah objek
}
int f = ( int )al[ 0 ]; // Elemen tidak dikotakkan
Solusi untuk masalah ini adalah dengan menggunakan tipe koleksi generik yang didukung oleh .net2.0.