C# " ref " mot-clé, la performance
Si vous avez un objet Bitmap doit être passée à de nombreuses méthodes (environ 10), et enfin à un événement où il doit enfin être jetés après utilisation, serait-il (performance sage) bénéfique pour le passer à chacune de ces méthodes par référence au lieu de la valeur?
Passage par valeur, l'objet est copié, le passage par référence à ses pas.
(Performance est critique dans cette situation. L'application a besoin de courir aussi vite que possible.)
vb.net: which-is-faster-byval-or-byref
Il y a maintenant moyen, comment pourrait-on être en mesure de passer une image en valeur.
Il y a maintenant moyen, comment pourrait-on être en mesure de passer une image en valeur.
OriginalL'auteur David Anderson | 2009-05-23
Vous devez vous connecter pour publier un commentaire.
Bitmap est un type de référence. Le passage d'un type de référence par la valeur n'est pas la copie de l'objet, simplement la référence à l'objet. Il n'y aurait pas de gain de performance en passant de l'image Bitmap par référence et non par valeur.
OriginalL'auteur David Nelson
Depuis Bitmap est un type de référence, il n'existe pas de différence pratique pour les performances dans ce scénario car il est déjà passé par référence à la méthode.
Je le recommande Jon Skeet de l'article sur le sujet pour une explication détaillée de comment "par référence" et "par la valeur" travail en C#.
Bel article recommandation. C'est une excellente lecture pour bien comprendre la valeur et les types référence et passage de paramètres par valeur/référence.
OriginalL'auteur Jeromy Irvine
Quel type êtes-vous en utilisant exactement pour la tenue de la Bitmap? Par exemple, Système.De dessin.Bitmap est un type de référence/de classe. Lorsque vous passez une référence à une méthode (un argument), la référence est passé par valeur. (Une copie de la référence qui est faite... pas l'objet) Donc quatre octets répartis sur une machine 32 bits pour contenir la copie.
En utilisant le mot-clé ref n'a pas beaucoup d'incidence sur les performances sauf que la même référence est passée (une copie de la référence n'est pas faite). Il a les avantages suivants
"En utilisant le mot-clé ref ... n'efface intention". Ummm, je ne pense pas que c'est vrai. Une référence passée byref (objet**) peut être reasigned par l'appelant; affectant l'objet sur lequel les appelants points de référence. Passer une référence par la valeur (objet*) transmet une copie de la référence, en isolant les appelants de référence de changements au sein de la calle. Cet article preview.tinyurl.com/oda4jz a un exemple en C#.
Correct. D'où la méthode en prenant un paramètre de référence forces les appelants à écrire explicitement ref avant l'argument - pour s'assurer que les personnes qui les appellent à comprendre et à accepter pour la sémantique. Il clarifie l'intention de l'appelant est le passage d'un argument pleinement conscient que l'argument peut être différent de la valeur/l'état post l'appel de la méthode.
OriginalL'auteur Gishu
La " ref " ne passe pas à l'objet lui-même dans la fonction, au contraire, il passe une référence à la variable est stockée dans/à.
Si l'objet est une classe ou une interface, alors à chaque fois que vous accédez à cette variable dans la fonction, il a déréférencer, puis accéder à la variable. S'il avait été adopté sans le " ref " mot-clé, il ne voulait pas avoir à faire le déréférencement de l'étape (donc il sera un peu plus rapide).
Si l'objet est une structure (ou enum ou autre type de base), le " ref " mot clé passe une référence à la variable qui stocke la structure, ce qui provoque toujours la LÉGÈRE vitesse frappé de référence à chaque fois que vous l'utilisez, mais si vous ne spécifiez pas, puis le programme a pour allouer de la mémoire pour une nouvelle instance de la structure, puis de le copier. Dans la plupart des cas, il est plus rapide de passer des structures via le mot-clé ref, mais cela peut ne pas être le cas si c'est vraiment une petite structure, ou si c'est déréférencé beaucoup (et je veux dire BEAUCOUP).
Donc, si vous êtes de passage à une structure (struct), puis ref est généralement la voie à suivre, sinon il n'y aura pas vraiment beaucoup d'une différence (la surcharge dans le déréférencement de phase est minuscule).
Oh, et pour répondre à la question, une image Bitmap est une classe, de sorte que le " ref " mot-clé ne sera pas vraiment faire une différence de vitesse au cours d'une non-'ref' paramètre.
OriginalL'auteur Grant Peters