Le RAII s'applique-t-il au C#? Plus précisément, lors de la déclaration de variables, existe-t-il une différence interne entre déclarer une variable utilisée dans différentes méthodes au niveau de la classe (ce que je fais mais pas thread safe) ou à chaque niveau de méthode où elle est déclarée/instanciée plusieurs fois est nécessaire, puis sort de la portée?Déclaration des variables réutilisées au niveau de la classe ou de la méthode lorsqu'elles sont requises
Par exemple, un objet SqlConnection peut être utilisé dans différentes méthodes d'une classe - devrait-il être déclaré au niveau supérieur/classe ou séparément dans chaque méthode?
class Test
{
SqlConnection conn;
....
instanciés dans un bloc à l'aide et est hors de portée dans plusieurs méthodes différentes.
Ou ...
public void A()
{
SqlConnection conn = new SqlConnection();
}
Et de même pour plusieurs méthodes.
Merci
Alors, en réalité, c'est à la sémantique (par exemple, utiliser le tas quand le type de valeur est déclaré au niveau de la classe)? Je peux annuler l'effet knockon pour le GC si je déclare au niveau de la classe, mais ensuite disposer/ré-instancier la même variable? Idéalement, la meilleure approche semble fixer les objets au niveau de la classe lorsqu'ils sont utilisés dans toute la classe, puis les éliminer le plus tôt possible. – dotnetdev
Cela dépend: si vous déclarez un int, alors vous utilisez vraiment la mémoire pour cet int. Si vous déclarez une référence d'objet, votre référence utilise la mémoire (l'instance d'objet entière n'est pas allouée, mais la référence 32/64 bits est). Au-delà, je pense qu'il vaut mieux déclarer localement que si l'objet appartient réellement à l'état de votre objet. Dans votre exemple de connexion, si vous allez plusieurs fois l'utiliser, puis l'annuler à chaque appel de méthode, je dirais que c'est une variable locale (méthode). – JMarsch
Oh, et juste pour être clair, si vous déclarez une variable de type référence dans votre corps de méthode (comme votre sqlconnection), puis que vous remettez en place l'objet et l'assignez à la variable locale, l'objet vit sur le tas, la référence (sorte de pointeur, mais pas vraiment) vit sur la pile. – JMarsch