Comprendre les références d'objets C # et l'anomalie System.Drawing.Image
C # provoquent souvent de la confusion. Bien que les types de référence permettent généralement aux modifications de méthode d'imposer l'objet d'origine, System.Drawing.Image
présente une situation unique. Clarifions le comportement.
La nuance de l'objet passant
Il est crucial de comprendre que C # ne passe pas directement des objets; Il passe références aux objets. Pour les types de référence, cette référence est copiée par valeur. Cela signifie qu'une méthode reçoit une copie de la référence, pas l'objet lui-même.
System.Drawing.Image
comportement
Lorsque vous passez un objet System.Drawing.Image
à une méthode, toute modification que remplace L'objet entier (par exemple, l'attribution d'une nouvelle image) ne sera pas réfléchi en dehors de la méthode. En effet, la méthode fonctionne avec une copie de la référence. La réaffectation de la référence dans la méthode crée une nouvelle référence, laissant l'original inchangé.
Pass-by-Value vs pass-by-référence
Le comportement par défaut en C # est passant par valeur pour les types de valeur et les types de référence. Cependant, vous pouvez explicitement utiliser ref
ou out
Mots-clés pour forcer le pass-by-référence.
Pass-by-Value (par défaut): La méthode reçoit une copie de la référence (pour les types de référence) ou une copie de la valeur (pour les types de valeur). Les modifications apportées au paramètre dans la méthode n'affectent pas l'original.
Pass-by-Reference (ref
/ out
): La méthode accède directement à l'objet ou à la variable d'origine. Les modifications sont visibles pour l'appelant.
Exemples de code illustratif:
<code class="language-csharp">public void ModifyImage(Image image) // Pass-by-Value { // This reassigns the reference, NOT modifying the original. image = Image.FromFile("newImage.jpg"); } public void ModifyImage(ref Image image) // Pass-by-Reference { // This reassigns the reference, modifying the original. image = Image.FromFile("newImage.jpg"); } public void ManipulateImage(Image image) // Pass-by-Value { // This modifies the *contents* of the original image. image.RotateFlip(RotateFlipType.Rotate90FlipNone); }</code>
ModifyImage
démontre la différence. La première version ne modifie pas l'image d'origine; le second fait. ManipulateImage
, cependant, montre que la modification des propriétés de l'image (comme la rotation) affecte affecte l'original car il modifie l'état interne de l'objet, pas la référence elle-même. La distinction clé est entre le remplacement de l'objet entier par rapport à la modification de ses propriétés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!