C # ‘ref’ mot-clé, performance

Si vous avez un object Bitmap qui doit être transmis à de nombreuses méthodes (environ 10), et finalement à un événement dans lequel il sera finalement supprimé après son utilisation, serait-il (sage) judicieux de le transmettre à chacun ces méthodes par référence au lieu de valeur?

En passant par valeur, l’object est copié, en passant par référence à son pas.

(Les performances sont essentielles dans cette situation. L’application doit être exécutée aussi rapidement que possible.)

Bitmap est un type de référence. Passer un type de référence par valeur ne copie pas l’object, mais simplement la référence à l’object. Il n’y aurait aucun avantage en termes de performances à transmettre le bitmap par référence plutôt que par valeur.

Comme Bitmap est un type de référence, il n’y a pas de différence pratique en termes de performances dans ce scénario car il est déjà passé par référence à la méthode.

Je recommanderais l’article de Jon Skeet sur le sujet pour une explication détaillée de la façon dont “par référence” et “par valeur” fonctionnent en C #.

Quel type utilisez-vous exactement pour contenir le bitmap? Par exemple, System.Drawing.Bitmap est un type / classe de référence. Lorsque vous passez une référence à une méthode (en tant qu’argument), la référence est passée par valeur. ( Une copie de la référence est faite … pas de l’object ) Donc, quatre octets seraient alloués sur un ordinateur 32 bits pour contenir la copie.

L’utilisation du mot-clé ref n’a pas beaucoup d’incidence sur les performances, si ce n’est 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

  • Efface uniquement que la méthode utilisant le paramètre peut le modifier et que l’appelant puisse obtenir une valeur modifiée après exécution.
  • Et la variable doit être initialisée par l’appelé avant d’être transmise en tant qu’argument à la fonction appelée en prenant le paramètre ref.

Le ‘ref’ ne transmet pas l’object lui-même à la fonction, mais une référence à la variable dans laquelle il est stocké /.

Si l’object est une classe ou une interface, chaque fois que vous accédez à cette variable dans la fonction, il doit la déréférencer, puis accéder à la variable. S’il était passé sans le mot-clé ‘ref’, il n’aurait pas à effectuer l’étape de déréférence (il sera donc légèrement plus rapide).

Si l’object est une structure (ou une énumération ou un autre type de base), le mot-clé ‘ref’ transmet une référence à la variable qui stocke la structure, ce qui provoque toujours la frappe rapide de déréférencement chaque fois que vous l’utilisez, mais si vous ne l’utilisez pas. Si vous ne le spécifiez pas, le programme doit allouer de la mémoire pour une nouvelle instance de la structure, puis la copier. Dans la plupart des cas, il est plus rapide de passer des structures via le mot clé ref, mais ce n’est peut-être pas le cas s’il s’agit d’une structure vraiment petite ou si elle est fortement déréférencée (et je veux dire BEAUCOUP).

Donc, si vous passez une structure, alors ref est habituellement la solution, sinon il n’y aura pas vraiment de différence (les frais généraux lors de la phase de déréférencement sont minimes).

Oh, et pour répondre à la question, un bitmap est une classe. Par conséquent, le mot clé “ref” ne fera pas vraiment une différence de vitesse par rapport à un paramètre non “ref”.