Bagikan melalui


internal yang dilindungi (Referensi C#)

Kombinasi protected internal kata kunci adalah pengubah akses anggota. Anggota internal yang dilindungi dapat diakses dari assembly saat ini atau dari tipe yang berasal dari kelas yang berisi. Untuk perbandingan protected internal dengan pengubah akses lainnya, lihat Tingkat Aksesibilitas.

Contoh

Anggota terlindungi internal dari kelas dasar dapat diakses dari segala jenis dalam rakitannya. Ini juga dapat diakses di kelas turunan yang terletak di rakitan lain hanya jika akses terjadi melalui variabel jenis kelas turunan. Misalnya, pertimbangkan segmen kode berikut:

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
   protected internal int myValue = 0;
}

class TestAccess
{
    void Access()
    {
        var baseObject = new BaseClass();
        baseObject.myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass : BaseClass
{
    static void Main()
    {
        var baseObject = new BaseClass();
        var derivedObject = new DerivedClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 10;

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

Contoh ini berisi dua file, Assembly1.cs dan Assembly2.cs. File pertama berisi kelas dasar publik, BaseClass, dan kelas lain, TestAccess. BaseClass memiliki anggota internal yang dilindungi, myValue, yang diakses oleh tipe TestAccess karena mereka berada dalam assembly yang sama. Dalam file kedua, upaya untuk mengakses myValue melalui instans BaseClass akan menghasilkan kesalahan, sementara akses ke anggota ini melalui instans kelas turunan, DerivedClass akan berhasil. Ini menunjukkan bahwa protected internal memungkinkan akses dari kelas mana pun dalam rakitan yang sama atau kelas turunan di rakitan mana pun, menjadikannya yang paling permisif dari pengubah akses yang dilindungi.

Anggota struct tidak boleh protected internal karena struktur tidak dapat diwariskan.

Mengambil alih anggota internal yang dilindungi

Saat mengesampingkan anggota virtual, pengubah aksesibilitas metode yang ditimpa tergantung pada rakitan tempat kelas turunan ditetapkan.

Ketika kelas turunan didefinisikan dalam rakitan yang sama dengan kelas dasar, semua anggota yang digantikan memiliki akses protected internal. Jika kelas turunan didefinisikan dalam rakitan yang berbeda dari kelas dasar, anggota yang ditimpa memiliki protected akses.

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
    protected internal virtual int GetExampleValue()
    {
        return 5;
    }
}

public class DerivedClassSameAssembly : BaseClass
{
    // Override to return a different example value, accessibility modifiers remain the same.
    protected internal override int GetExampleValue()
    {
        return 9;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClassDifferentAssembly : BaseClass
{
    // Override to return a different example value, since this override
    // method is defined in another assembly, the accessibility modifiers
    // are only protected, instead of protected internal.
    protected override int GetExampleValue()
    {
        return 2;
    }
}

Spesifikasi bahasa C#

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

Lihat juga