1. Évitez les actions d'initialisation de variables dénuées de sens
Le CLR garantit que tous les objets sont initialisés avant d'y accéder en mettant à zéro la mémoire allouée. Il n’est donc pas nécessaire de réinitialiser les variables à 0, faux ou nul.
//Généralement expert 10 éléments ou moins
_items privés de HashTable = null ;
privé NameValueCollection = _queryString = null ;
chaîne privée _siteUrl = null ;
Uri privé _currentUri ;
chaîne rôlesCacheKey = null ;
chaîne AuthenticationType = "formulaires" ;
bool _isUrlRewriting = faux ;
chaîne _rawUrl = null ;
HttpContext _httpContext = nul
DateTime requestStarTime = DateTime.Now ;
Il convient de noter que les variables locales de la méthode ne sont pas allouées depuis le tas mais depuis la pile, donc C# ne les effacera pas. Si une variable locale non affectée est utilisée, une alarme se produira lors de la compilation. N'attribuez pas de valeurs aux variables membres de toutes les classes simplement à cause de cette impression. Les mécanismes des deux sont complètement différents !
2. ValueType et ReferenceType
(1). Transmettez les paramètres de type de valeur par référence.
Les types de valeur sont alloués à partir de la pile d’appels et les types de référence sont alloués à partir du tas géré. Lorsqu'un type valeur est utilisé comme paramètre de méthode, la copie de la valeur du paramètre est effectuée par défaut, ce qui annule l'avantage d'efficacité de l'allocation de type valeur. En tant que technique de base, la transmission de paramètres de type valeur par référence peut améliorer les performances.
privé void UseDateByRef(ref DateTime dt){ }
public vide foo()
{
DateTime maintenant = DateTime.Now ;
UseDateByRef (réf. maintenant);
}
(2), fournir la méthode Equals pour ValueType
La méthode ValueType.Equals implémentée par .net utilise la technologie de réflexion et s'appuie sur la réflexion pour obtenir les valeurs de toutes les variables membres à des fins de comparaison. Si la méthode Equals de l'objet valeur que nous écrivons doit être utilisée (par exemple, en plaçant l'objet valeur dans une HashTable), alors la méthode Equals doit être surchargée.
structure publique Rectangle
{
public double longueur;
double largeur publique;
public override bool Equals (objet ob)
{
si (ob est un rectangle)
retourner Equels ((Rectangle)ob))
autre
retourner faux ;
}
bool privé Égal à (Rectangle rect)
{
renvoie ceci .Length == rect.Length && this .Breadth == rect.Breach;
}
}
(3) Évitez d’emballer et de déballer
C# peut automatiquement convertir entre les types valeur et les types référence via le boxing et le unboxing. La boxe nécessite d'allouer des objets à partir du tas et de copier des valeurs, ce qui a un certain coût en termes de performances. Si ce processus se produit en boucle ou est appelé fréquemment comme méthode sous-jacente, vous devez vous méfier de l’effet cumulatif.
Une situation courante se produit lorsque vous travaillez avec des types de collections. Par exemple:
ArrayList al = new ArrayList();
pour (int je = 0 ; je < 1000 ; je ++ )
{
al.Add(i); // Implicitement encadré car Add() prend un objet
}
int f = ( int )al[ 0 ]; // L'élément est déballé
La solution à ce problème consiste à utiliser le type de collection générique pris en charge par .net2.0.