Rumah >pembangunan bahagian belakang >C++ >Mengapa C# Tidak Membenarkan Medan Memegang Rujukan, dan Apakah Alternatifnya?

Mengapa C# Tidak Membenarkan Medan Memegang Rujukan, dan Apakah Alternatifnya?

DDD
DDDasal
2025-01-06 03:12:39727semak imbas

Why Doesn't C# Allow Fields to Hold References, and What Are the Alternatives?

Tugasan Rujukan dalam Medan Kelas C#

Dalam C#, cubaan untuk menetapkan melalui "rujukan" kepada medan kelas boleh mengakibatkan tingkah laku yang tidak dijangka. Pertimbangkan kod berikut:

public class X
{
    public X()
    {
        string example = "X";

        new Y(ref example);

        new Z(ref example);

        System.Diagnostics.Debug.WriteLine(example);
    }
}

public class Y
{
    public Y(ref string example)
    {
        example += " (Updated By Y)";
    }
}

public class Z
{
    private string _Example;

    public Z(ref string example)
    {
        this._Example = example;

        this._Example += " (Updated By Z)";
    }
}

var x = new X();

Output yang dijangkakan ialah "X (Dikemas Kini Oleh Y) (Dikemas Kini Oleh Z)", tetapi sebaliknya, hanya "X (Dikemas Kini Oleh Y)" dicetak. Tingkah laku ini berlaku kerana memberikan "parameter rujukan" kepada medan kehilangan rujukan.

Mengapa Medan Tidak Boleh Memegang Rujukan?

Terdapat tiga pilihan yang mungkin apabila mempertimbangkan medan "jenis ref":

  1. Larang medan rujukan type: Ini ialah gelagat semasa dalam C#.
  2. Benarkan medan tidak selamat bagi jenis ref: Ini akan membolehkan kemungkinan mengakses memori tidak selamat, yang berpotensi membawa kepada tingkah laku yang tidak dapat diramalkan.
  3. Simpan pembolehubah tempatan di luar timbunan: Ini akan menghalang pengoptimuman menyimpan setempat pembolehubah dalam kumpulan memori sementara, yang tidak diingini.

Pilihan 1 dipilih untuk memastikan kestabilan program dan menghalang penciptaan bom jangka dalam kod.

Bagaimana untuk Mencapai Tingkah Laku Seperti Rujukan

Walaupun anda tidak boleh mempunyai medan jenis rujukan, terdapat cara alternatif untuk capai tingkah laku seperti rujukan:

  • Mencipta kelas yang merangkum rujukan: Anda boleh mencipta kelas yang menyediakan kaedah pengambil dan penetap untuk mengakses dan mengubah suai pembolehubah yang dirujuk. Ini ialah cara tidak langsung untuk merujuk pembolehubah lain.
  • Menggunakan ciri C# 7 (Ref Locals dan Ref Returning Methods): Walaupun C# tidak menyokong penyimpanan rujukan dalam medan, ia menyokong ref locals dan kaedah pemulangan ref. Ini membolehkan anda mencipta pembolehubah ref yang boleh diluluskan melalui rujukan dan diubah suai dengan pelbagai kaedah.

Atas ialah kandungan terperinci Mengapa C# Tidak Membenarkan Medan Memegang Rujukan, dan Apakah Alternatifnya?. 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