Bagikan melalui


dilindungi (Referensi C#)

Pengubah akses anggota adalah kata kunci protected.

Nota

Halaman ini mencakup akses protected. Kata kunci protected juga merupakan bagian dari pengubah akses protected internal dan private protected.

Anggota yang dilindungi dapat diakses dalam kelasnya dan oleh instans kelas turunan.

Untuk perbandingan protected dengan pengubah akses lainnya, lihat Tingkat Aksesibilitas.

Contoh 1

Anggota kelas dasar yang dilindungi dapat diakses di kelas turunan hanya jika akses terjadi melalui jenis kelas turunan. Misalnya, pertimbangkan segmen kode berikut:

namespace Example1
{
    class BaseClass
    {
        protected int myValue = 123;
    }

    class DerivedClass : BaseClass
    {
        static void Main()
        {
            var baseObject = new BaseClass();
            var derivedObject = new DerivedClass();

            // Error CS1540, because myValue can only be accessed through
            // the derived class type, not through the base class type.
            // baseObject.myValue = 10;

            // OK, because this class derives from BaseClass.
            derivedObject.myValue = 10;
        }
    }
}

Pernyataan baseObject.myValue = 10 menghasilkan kesalahan karena mengakses anggota yang dilindungi melalui referensi kelas dasar (baseObject berjenis BaseClass). Anggota yang dilindungi hanya dapat diakses melalui kelas turunan atau kelas yang berasal darinya.

Tidak seperti private protected, pengubah akses protected memungkinkan akses dari kelas turunan di rakitan apa pun. Tidak seperti protected internal, tidak mengizinkan akses dari kelas yang tidak diturunkan dalam assembly yang sama.

Anggota struct tidak dapat dilindungi karena struktur tidak dapat diwariskan.

Contoh 2

Dalam contoh ini, kelas DerivedPoint berasal dari Point. Oleh karena itu, Anda dapat mengakses anggota kelas dasar yang dilindungi langsung dari kelas turunan.

namespace Example2
{
    class Point
    {
        protected int x;
        protected int y;
    }

    class DerivedPoint: Point
    {
        static void Main()
        {
            var dpoint = new DerivedPoint();

            // Direct access to protected members.
            dpoint.x = 10;
            dpoint.y = 15;
            Console.WriteLine($"x = {dpoint.x}, y = {dpoint.y}");
        }
    }
    // Output: x = 10, y = 15
}

Jika Anda mengubah tingkat x akses dan y menjadi privat, pengkompilasi akan mengeluarkan pesan kesalahan:

'Point.y' is inaccessible due to its protection level.

'Point.x' is inaccessible due to its protection level.

Akses perakitan silang

Contoh berikut menunjukkan bahwa anggota kelas protected dapat diakses dari kelas turunan bahkan ketika berada di assembly yang berbeda.

// Assembly1.cs
// Compile with: /target:library
namespace Assembly1
{
    public class BaseClass
    {
        protected int myValue = 0;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
namespace Assembly2
{
    using Assembly1;
    
    class DerivedClass : BaseClass
    {
        void Access()
        {
            // OK, because protected members are accessible from
            // derived classes in any assembly
            myValue = 10;
        }
    }
}

Aksesibilitas perakitan silang inilah yang membedakan protected dari private protected (yang membatasi akses ke rakitan yang sama) tetapi mirip dengan protected internal (meskipun protected internal juga memungkinkan akses ke rakitan yang sama dari kelas-kelas yang tidak diturunkan).

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat Aksesibilitas yang dinyatakan dalam Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.

Lihat juga