1. Evite acciones de inicialización de variables sin sentido
El CLR garantiza que todos los objetos se inicialicen antes de acceder a ellos poniendo a cero la memoria asignada. Por lo tanto, no es necesario reinicializar las variables a 0, falso o nulo.
//Generalmente experto en 10 o menos elementos
HashTable privada _items = nulo;
Private NameValueCollection = _queryString = null;
cadena privada _siteUrl = nulo;
Uri privado _currentUri;
cadena rolesCacheKey = nulo;
tipo de autenticación de cadena = "formularios";
bool _isUrlRewrite = falso;
cadena _rawUrl = nulo;
HttpContext _httpContext = nulo
DateTime requestStarTime = DateTime.Now;
Cabe señalar que las variables locales en el método no se asignan desde el montón sino desde la pila, por lo que C# no las borrará. Si se utiliza una variable local no asignada, se producirá una alarma durante la compilación. ¡No asigne valores a las variables miembro de todas las clases solo por esta impresión! ¡Los mecanismos de los dos son completamente diferentes!
2. Tipo de valor y tipo de referencia
(1). Pasar parámetros de tipo de valor por referencia.
Los tipos de valor se asignan desde la pila de llamadas y los tipos de referencia se asignan desde el montón administrado. Cuando se utiliza un tipo de valor como parámetro de método, la copia del valor del parámetro se realiza de forma predeterminada, lo que anula la ventaja de eficiencia de la asignación de tipos de valor. Como técnica básica, pasar parámetros de tipo de valor por referencia puede mejorar el rendimiento.
vacío privado UseDateByRef(ref DateTime dt){ }
público vacío foo()
{
FechaHora ahora = FechaHora.Ahora;
UseDateByRef(referencia ahora);
}
(2), Proporcionar el método Igual para ValueType
El método ValueType.Equals implementado por .net de forma predeterminada utiliza tecnología de reflexión y se basa en la reflexión para obtener los valores de todas las variables miembro para comparar. Si se va a utilizar el método Equals del objeto de valor que escribimos (por ejemplo, colocar el objeto de valor en una HashTable), entonces el método Equals debe sobrecargarse.
rectángulo de estructura pública
{
público doble Longitud;
doble amplitud pública;
bool de anulación pública es igual a (objeto ob)
{
si (ob es rectángulo)
volver Equels ((Rectangle)ob))
demás
devolver falso;
}
bool privado Igual (Rectángulo rect)
{
devuelve este .Longitud == rect.Longitud && este .Anchura == rect.Breach;
}
}
(3) Evite empacar y desempaquetar
C# puede convertir automáticamente entre tipos de valor y tipos de referencia mediante boxing y unboxing. El boxeo requiere asignar objetos del montón y copiar valores, lo que tiene un cierto costo de rendimiento. Si este proceso ocurre en un bucle o se llama con frecuencia como método subyacente, debe tener cuidado con el efecto acumulativo.
Una situación común surge cuando se trabaja con tipos de colecciones. Por ejemplo:
ArrayList al = nueva ArrayList();
para (int i = 0; i < 1000; i ++)
{
al.Add(i); // Implícitamente encuadrado porque Add() toma un objeto
}
int f = (int)al[ 0 ]; // El elemento no está encajonado
La solución a este problema es utilizar el tipo de colección genérica admitida por .net2.0.