Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Bahasa C

C# Akses Pengubah

Pengubah Akses C#

Dalam tutorial ini, kita akan belajar tentang pengubah akses publik, privat, terlindungi, dan internal di C# dengan bantuan contoh.

Dalam C#, pengubah akses menentukan aksesibilitas tipe (kelas, antarmuka, dll) dan anggota tipe (bidang, metode, dll). Misalnya,

class Student {

  public string name;
    
  private int num;

  }

Di sini,

Jenis Pengubah Akses

Dalam C#, ada 4 tipe dasar pengubah akses.


1. pengubah akses publik

Saat kita mendeklarasikan suatu tipe atau tipe anggota public , dapat diakses dari mana saja. Misalnya,

using System;

namespace MyApplication {

  class Student {
    public string name = "Sheeran";
      
    public void print() {
      Console.WriteLine("Hello from Student class");
     }
  }

  class Program {
    static void Main(string[] args) {
    
      // creating object of Student class
      Student student1 = new Student();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + student1.name);

      // accessing print method from Student
      student1.print();
      Console.ReadLine();
    }
  }
}

Keluaran

Name: Sheeran
Hello from Student class

Pada contoh di atas, kita telah membuat sebuah kelas bernama Student dengan bidang nama dan metode print() .

// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);

// accessing print method from Student
student1.print();

Karena bidang dan metode bersifat publik, kami dapat mengaksesnya dari Program kelas.

Catatan :Kami telah menggunakan objek student1 dari Siswa kelas untuk mengakses anggotanya. Untuk mempelajari lebih lanjut, kunjungi kelas dan objek C# .


2. pengubah akses pribadi

Saat kami mendeklarasikan anggota tipe dengan private pengubah akses, hanya dapat diakses dalam class yang sama atau struct . Misalnya,

using System;

namespace MyApplication {

  class Student {
    private string name = "Sheeran";
      
    private void print() {
      Console.WriteLine("Hello from Student class");
     }
  }

  class Program {
    static void Main(string[] args) {
    
      // creating object of Student class
      Student student1 = new Student();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + student1.name);

      // accessing print method from Student
      student1.print();

      Console.ReadLine();
    }
  }
}

Pada contoh di atas, kita telah membuat sebuah kelas bernama Student dengan bidang nama dan metode print() .

// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);

// accessing print method from Student
student1.print();

Karena bidang dan metode bersifat pribadi, kami tidak dapat mengaksesnya dari Program kelas. Di sini, kode akan menghasilkan kesalahan berikut.

Error    CS0122    'Student.name' is inaccessible due to its protection level    
Error    CS0122    'Student.print()' is inaccessible due to its protection level    

3. pengubah akses yang dilindungi

Saat kita mendeklarasikan anggota tipe sebagai protected , itu hanya dapat diakses dari kelas yang sama dan kelas turunannya. Misalnya,

using System;

namespace MyApplication {

  class Student {
    protected string name = "Sheeran";
  }

  class Program {
    static void Main(string[] args) {
    
      // creating object of student class
      Student student1 = new Student();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + student1.name);
      Console.ReadLine();
    }
  }
}

Pada contoh di atas, kita telah membuat sebuah kelas bernama Student dengan bidang nama . Karena bidang ini dilindungi, kami tidak dapat mengaksesnya dari Program kelas.

Di sini, kode akan menghasilkan kesalahan berikut.

Error    CS0122    'Student.name' is inaccessible due to its protection level    

Sekarang, mari kita coba mengakses protected anggota dari kelas turunan.

using System;

namespace MyApplication {

  class Student {
    protected string name = "Sheeran";
  }
  
  // derived class
  class Program : Student {
    static void Main(string[] args) {

      // creating object of derived class
      Program program = new Program();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + program.name);
      Console.ReadLine();
    }
  }
}

Keluaran

Name: Sheeran

Pada contoh di atas, kita telah membuat kelas Student dengan bidang yang dilindungi nama . Perhatikan bahwa kita telah mewarisi Program kelas dari Siswa kelas.

// accessing name field and printing it
Console.WriteLine("Name: " + program.name);

Sejak protected anggota dapat diakses dari kelas turunan, kami dapat mengakses nama dari Program kelas.


4. pengubah akses internal

Saat kita mendeklarasikan tipe atau anggota tipe sebagai internal , itu hanya dapat diakses dalam majelis yang sama.

Majelis adalah kumpulan tipe (kelas, antarmuka, dll) dan sumber daya (data). Mereka dibangun untuk bekerja bersama dan membentuk unit fungsionalitas logis.

Itu sebabnya ketika kami menjalankan Majelis, semua kelas dan antarmuka di dalam Majelis berjalan bersama. Untuk mempelajari lebih lanjut, kunjungi Majelis C#.


Contoh:internal dalam Majelis yang sama

using System;

namespace Assembly {

  class Student {
   internal string name = "Sheeran";
  }

  class Program {
    static void Main(string[] args) {
    
      // creating object of Student class
      Student theStudent = new Student();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + theStudent.name);
      Console.ReadLine();
    }
  }
}

Keluaran

Name: Sheeran

Pada contoh di atas, kita telah membuat sebuah kelas bernama Student dengan bidang nama . Karena bidangnya adalah internal , kami dapat mengaksesnya dari Program kelas karena mereka berada di majelis yang sama.

Jika kita menggunakan internal dalam satu Majelis, ia bekerja seperti public pengubah akses.


Contoh:internal di Majelis yang berbeda

Mari kita buat satu assembly terlebih dahulu.

// Code on Assembly1
using System;

namespace Assembly1 {

  public class StudentName {
    internal string name = "Sheeran";
  }

  class Program {
    static void Main(string[] args) {
    }
  }
}

Di sini, kode ini ada di Assembly1 . Kami telah membuat bidang internal nama di dalam kelas StudentName . Sekarang, bidang ini hanya dapat diakses dari Majelis yang sama Assembly1 .

Sekarang, mari buat perakitan lain.

// Code on Assembly2
using System;

// access Assembly1
using Assembly1;

namespace Assembly2 {
  class Program {
    static void Main(string[] args) {
      StudentName student = new StudentName();

      // accessing name field from Assembly1
      Console.Write(student.name);
      Console.ReadLine();
     }
  }
}

Di sini, kode ini ada di Assembly2 . Kami mencoba mengakses nama bidang StudentName kelas(Assembly1 ).

Untuk mengakses bidang dari Assembly1 , pertama-tama kita harus menyetel referensi Assembly1 di Assembly2 . Sekarang kodenya

using Assembly1;

memungkinkan kami menggunakan kode dari Assembly1 ke Assembly2 .

Di sini, ketika kami mencoba mengakses name bidang dari Assembly2 , kami mendapatkan kesalahan.

Error    CS0122    'StudentName.name' is inaccessible due to its protection level

Ini karena nama adalah bidang internal yang ada di Assembly1 .


5. pengubah akses internal yang dilindungi

protected internal adalah kombinasi dari protected dan internal pengubah akses.

Saat kami mendeklarasikan anggota protected internal , itu dapat diakses dari rakitan yang sama dan kelas turunan dari kelas yang memuatnya dari rakitan lain.

// Code on Assembly1
using System;

namespace Assembly1 {
  public class Greet {
    protected internal string msg="Hello";
  }

  class Program {
    static void Main(string[] args) {
      Greet greet = new Greet();
      Console.WriteLine(greet.msg);
      Console.ReadLine();
     }
  }
}

Keluaran

Hello

Kode di atas ada di Assembly1 .

Pada contoh di atas, kita telah membuat sebuah kelas bernama Sapa dengan bidang msg . Karena bidang ini dilindungi internal, kami dapat mengaksesnya dari Program kelas karena mereka berada di majelis yang sama.

Mari kita turunkan kelas dari Sapa di Majelis lain dan coba akses bidang internal yang dilindungi msg dari itu.

// Code on Assembly2
using System;

// access Assembly1
using Assembly1;

namespace Assembly2 {

  // derived class of Greet
  class Program: Greet {
    static void Main(string[] args) {
      Program greet = new Program();

      // accessing name field from Assembly1
      Console.Write(greet.msg);
      Console.ReadLine();
    }
  }
}

Keluaran

Hello

Kode di atas ada di Assembly2 .

Dalam contoh di atas, kami mewarisi Program kelas dari Sapa kelas(dari Assembly1 ).

// accessing name field from Assembly1
Console.Write(greet.msg);

Kami dapat mengakses msg dari Salam kelas Assembly1 dari Assembly2 .

Ini karena msg adalah bidang internal yang dilindungi dan kami mencoba mengaksesnya dari kelas anak Sapa .


6. pengubah akses pribadi yang dilindungi

private protected pengubah akses adalah kombinasi dari private dan protected . Ini tersedia dari C# versi 7.2 dan yang lebih baru.

Saat kami mendeklarasikan anggota private protected , itu hanya dapat diakses dalam kelas yang sama, dan kelas turunannya dalam majelis yang sama. Misalnya,

// Code in Assembly1
using System;

namespace Assembly1 {
  public class StudentName {
    private protected string name = "Sheeran";
  }

  //derived class of StudentName class
  class Program1 : StudentName {

    static void Main(string[] args) {

      Program1 student = new Program1();

      //  accessing name field from base class
      Console.Write(student.name);
      Console.ReadLine();
    }
  }
}

Keluaran

Sheeran

Kode di atas ada di Assembly1

Pada contoh di atas, kita telah membuat kelas StudentName dengan private protected bidang nama .

Perhatikan bahwa kita telah mewarisi Program1 kelas dari StudentName kelas.

Sejak private protected anggota dapat diakses dari kelas turunan dalam majelis yang sama, kami dapat mengakses nama dari Program1 kelas.

Mari kita turunkan kelas dari StudentName di Majelis lain dan coba akses bidang yang dilindungi pribadi nama dari itu. Misalnya,

// Code in Assembly2
using System;
//access Assembly1
using Assembly1;

namespace Assembly2 {

  //derived class of StudentName
  class Program : StudentName {
    static void Main(string[] args) {
      Program student = new Program();
    
      // accessing name field from Assembly1
      Console.Write(student.name);
      Console.ReadLine();
     }
  }
}

Kode di atas ada di Assembly2

Pada contoh di atas, ketika kita mencoba mengakses name bidang dari kelas turunan StudentName , kami mendapatkan kesalahan.

Error    CS0122    'StudentName.name' is inaccessible due to its protection level    

Ini karena nama bidang ada di Assembly1 dan kelas turunannya ada di Assembly2 .

Catatan :Kami juga dapat menggunakan pengubah akses dengan tipe (kelas, antarmuka, dll). Namun, kami hanya dapat menggunakan tipe dengan pengubah akses publik dan internal.


Bahasa C

  1. C# Kelas dan Objek
  2. C# Kata Kunci statis
  3. C# kelas abstrak dan metode
  4. C# Kelas Bersarang
  5. C# Kelas Parsial dan Metode Parsial
  6. C# kelas dan metode tersegel
  7. Template Kelas C++
  8. Kelas Penyimpanan C
  9. Java - Jenis Pengubah
  10. Polimorfisme dalam C++