Rumah >pembangunan bahagian belakang >C++ >Mengapa perubahan kepada objek System.Drawing.Image diluluskan kepada kaedah C# tidak selalu berterusan?

Mengapa perubahan kepada objek System.Drawing.Image diluluskan kepada kaedah C# tidak selalu berterusan?

Patricia Arquette
Patricia Arquetteasal
2025-01-31 00:51:081010semak imbas

Why Do Changes to a System.Drawing.Image Object Passed to a C# Method Not Always Persist?

Memahami C# Rujukan Objek dan Anomali System.Drawing.Image

Mekanisme lulus objek C#sering menyebabkan kekeliruan. Walaupun jenis rujukan biasanya membenarkan perubahan dalam kaedah mempengaruhi objek asal,

membentangkan situasi yang unik. Mari kita jelaskan tingkah laku. System.Drawing.Image

nuansa objek lulus

sangat penting untuk memahami bahawa C# tidak langsung lulus objek; Ia melewati

rujukan ke objek. Untuk jenis rujukan, rujukan ini disalin oleh nilai. Ini bermakna kaedah menerima salinan rujukan, bukan objek itu sendiri.

tingkah laku System.Drawing.Image

Apabila anda lulus objek

ke kaedah, sebarang perubahan yang System.Drawing.Image menggantikan keseluruhan objek (mis., Menetapkan imej baru) tidak akan dapat dilihat di luar kaedah. Ini kerana kaedah ini berfungsi dengan salinan rujukan. Menetapkan semula rujukan dalam kaedah ini mencipta rujukan baru, meninggalkan asal tidak berubah.

pass-by-value vs. lulus-by-reference

Tingkah laku lalai dalam C# adalah lulus demi nilai untuk kedua-dua jenis nilai dan jenis rujukan. Walau bagaimanapun, anda boleh menggunakan kata kunci

atau ref secara eksplisit untuk memaksa lulus-oleh-rujukan. out

  • pass-by-value (lalai): Kaedah menerima salinan rujukan (untuk jenis rujukan) atau salinan nilai (untuk jenis nilai). Perubahan yang dibuat kepada parameter dalam kaedah tidak menjejaskan asal.

  • pass-by-reference (/ref): out Kaedah secara langsung mengakses objek asal atau pembolehubah. Perubahan dapat dilihat oleh pemanggil.

Contoh kod ilustrasi:

<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>

Menunjukkan perbezaannya. Versi pertama tidak mengubah imej asal; yang kedua tidak. Walau bagaimanapun, menunjukkan bahawa mengubahsuai sifat ModifyImage ManipulateImage imej (seperti putaran) tidak mempengaruhi asal kerana ia mengubah keadaan dalaman objek, bukan rujukan itu sendiri. Perbezaan utama adalah antara menggantikan keseluruhan objek berbanding mengubah suai sifatnya.

Atas ialah kandungan terperinci Mengapa perubahan kepada objek System.Drawing.Image diluluskan kepada kaedah C# tidak selalu berterusan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn