1. Evite ações de inicialização de variáveis sem sentido
O CLR garante que todos os objetos sejam inicializados antes de acessá-los, zerando a memória alocada. Portanto, não há necessidade de reinicializar variáveis para 0, falso ou nulo.
//Geralmente especialista em 10 ou menos itens
private HashTable _items = null;
private NameValueCollection = _queryString = null;
string privada _siteUrl = null;
Uri privado _currentUri;
string roleCacheKey = null;
string authenticationType = "formulários";
bool _isUrlRewrite = falso;
string _rawUrl = null;
HttpContext _httpContext=nulo
DateTime requestStarTime = DateTime.Agora;
Deve-se observar que as variáveis locais no método não são alocadas no heap, mas na pilha, portanto, o C# não as limpará. Se uma variável local não atribuída for usada, ocorrerá um alarme durante a compilação. Não atribua valores às variáveis-membro de todas as classes apenas por causa dessa impressão. Os mecanismos das duas são completamente diferentes!
2. ValueType e ReferenceType
(1). Passe parâmetros de tipo de valor por referência.
Os tipos de valor são alocados na pilha de chamadas e os tipos de referência são alocados no heap gerenciado. Quando um tipo de valor é usado como parâmetro de método, a cópia do valor do parâmetro é executada por padrão, o que anula a vantagem de eficiência da alocação do tipo de valor. Como técnica básica, passar parâmetros de tipo de valor por referência pode melhorar o desempenho.
privado void UseDateByRef(ref DateTime dt){ }
público vazio foo()
{
DateTime agora = DateTime.Agora;
UseDateByRef(ref agora);
}
(2), Fornecer método Equals para ValueType
O método ValueType.Equals implementado por .net por padrão usa tecnologia de reflexão e depende da reflexão para obter os valores de todas as variáveis de membro para comparação. Se o método Equals do objeto de valor que escrevemos for usado (por exemplo, colocando o objeto de valor em uma HashTable), então o método Equals deverá ser sobrecarregado.
estrutura pública retângulo
{
comprimento duplo público;
largura dupla pública;
substituição pública bool Igual a (objeto ob)
{
if (ob é retângulo)
retornar Equels ((Retângulo)ob))
outro
retornar falso;
}
private bool Igual a (retângulo reto)
{
retorne este .Length == rect.Length && este .Breadth == rect.Breach;
}
}
(3) Evite embalar e desembalar
C# pode converter automaticamente entre tipos de valor e tipos de referência por meio de boxing e unboxing. O boxe requer a alocação de objetos do heap e a cópia de valores, o que tem um certo custo de desempenho. Se esse processo ocorrer em loop ou for chamado frequentemente como um método subjacente, você deverá ter cuidado com o efeito cumulativo.
Uma situação comum surge ao trabalhar com tipos de coleção. Por exemplo:
ArrayList al = new ArrayList();
para (int eu = 0; eu <1000; eu++)
{
al.Add(i); // Encaixotado implicitamente porque Add() pega um objeto
}
int f = ( int )al[ 0 ]; // O elemento está sem caixa
A solução para este problema é usar o tipo de coleção genérico suportado por .net2.0.