Verständnis für C# -Leitungsreferenzen und die System.Drawing.Image
-Anomalie
c#verursachen häufig Verwirrung. Während Referenztypen in den Methoden normalerweise zulassen, dass sich Änderungen auf das ursprüngliche Objekt auswirken, zeigt System.Drawing.Image
eine einzigartige Situation. Lassen Sie uns das Verhalten klarstellen.
Die Nuance des Objekts passieren
Es ist entscheidend zu verstehen, dass C# keine direkten Objekte übergibt. Es übergibt Referenzen an Objekte. Als Referenztypen wird diese Referenz nach Wert kopiert. Dies bedeutet, dass eine Methode eine Kopie der Referenz empfängt, nicht das Objekt selbst.
System.Drawing.Image
Verhalten
Wenn Sie ein System.Drawing.Image
-Objekt an eine Methode übergeben, ändert sich alle Änderungen, die das gesamte Objekt ersetzen (z. B. das Zuweisen eines neuen Bildes) nicht außerhalb der Methode reflektiert werden. Dies liegt daran, dass die Methode mit einer Kopie der Referenz arbeitet. Durch die Neuzuweisung der Referenz innerhalb der Methode wird eine neue Referenz erstellt, wobei das Original unverändert bleibt.
pass-by-value vs. pass-by-referenz
Das Standardverhalten in C# ist für Werttypen und Referenztypen Pass-by-Wert. Sie können jedoch explizit oder ref
Schlüsselwörter verwenden, um Pass-by-Referenz zu erzwingen. out
pass-by-value (Standard): Die Methode empfängt eine Kopie der Referenz (als Referenztypen) oder eine Kopie des Werts (für Werttypen). Änderungen am Parameter innerhalb der Methode beeinflussen nicht das Original.
Pass-by-Reference (/ref
): out
Die Methode greift direkt auf das ursprüngliche Objekt oder die Variable zu. Änderungen sind für den Anrufer sichtbar.
Beispiele für veranschaulichende Code:
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); }
zeigt den Unterschied. Die erste Version verändert das Originalbild nicht. der zweite tut. ModifyImage
zeigt jedoch, dass das Ändern der ManipulateImage
-Formen des Bildes (wie Rotation) das Original beeinflusst, weil es den internen Zustand des Objekts ändert, nicht die Referenz selbst. Die wichtigste Unterscheidung besteht darin, das gesamte Objekt zu ersetzen und seine Eigenschaften zu ändern.
Das obige ist der detaillierte Inhalt vonWarum wechselt Änderungen an einem System.Drawing.image -Objekt, das an eine C# -Methode übergeben wird, nicht immer bestehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!