1. Избегайте бессмысленных действий по инициализации переменных.
CLR гарантирует, что все объекты инициализируются перед доступом к ним, обнуляя выделенную память. Поэтому нет необходимости повторно инициализировать переменные значениями 0, false или null.
//Обычно эксперт 10 или меньше предметов
частная HashTable _items = null;
частный NameValueCollection = _queryString = null;
частная строка _siteUrl = null;
частный Uri _currentUri;
строка rolesCacheKey = null;
строка аутентификацииType = «формы»;
bool _isUrlRewrite = ложь;
строка _rawUrl = ноль;
HttpContext _httpContext = ноль
DateTime requestStarTime = DateTime.Now;
Следует отметить, что локальные переменные в методе выделяются не из кучи, а из стека, поэтому C# не будет их очищать. Если используется неназначенная локальная переменная, во время компиляции возникнет предупреждение. Не присваивайте значения переменным-членам всех классов только из-за этого впечатления. Механизмы этих двух совершенно разные!
2. Тип значения и Тип ссылки.
(1) Передача параметров типа значения по ссылке.
Типы значений выделяются из стека вызовов, а ссылочные типы — из управляемой кучи. Когда тип значения используется в качестве параметра метода, копирование значения параметра выполняется по умолчанию, что сводит на нет преимущество в эффективности выделения типа значения. В качестве базового метода передача параметров типа значения по ссылке может повысить производительность.
частная пустота UseDateByRef (ref DateTime dt) { }
публичная пустота foo()
{
ДатаВремя сейчас = ДатаВремя.Сейчас;
UseDateByRef (ссылка сейчас);
}
(2). Предоставьте метод Equals для ValueType.
Метод ValueType.Equals, реализованный в .net, по умолчанию использует технологию отражения и полагается на отражение для получения значений всех переменных-членов для сравнения. Это крайне неэффективно. Если необходимо использовать метод Equals объекта значения, который мы пишем (например, помещая объект значения в HashTable), то метод Equals следует перегрузить.
общественная структура Rectangle
{
общественная двойная длина;
общественная двойная широта;
публичное переопределение bool Equals (объект ob)
{
if (ob — прямоугольник)
вернуть Equels ((Прямоугольник)ob))
еще
вернуть ложь;
}
частный bool Equals (прямоугольник, прямоугольник)
{
верните это .Length == rect.Length && this .Breadth == rect.Breach;
}
}
(3) Избегайте упаковки и распаковки.
C# может автоматически преобразовывать типы значений в ссылочные типы посредством упаковки и распаковки. Бокс требует выделения объектов из кучи и копирования значений, что требует определенных затрат производительности. Если этот процесс происходит в цикле или часто вызывается как базовый метод, вам следует опасаться накопительного эффекта.
Распространенная ситуация возникает при работе с типами коллекций. Например:
ArrayList al = новый ArrayList();
для ( int я = 0 ; я < 1000 ; я ++ )
{
al.Add(i); // Неявно упаковано, поскольку Add() принимает объект
}
int f = (int)al[0] // Элемент распакован
Решением этой проблемы является использование универсального типа коллекции, поддерживаемого .net2.0.