Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Модификаторы доступа C#

Модификаторы доступа C#

В этом руководстве мы узнаем об общедоступных, частных, защищенных и внутренних модификаторах доступа в C# с помощью примеров.

В C# модификаторы доступа определяют доступность типов (классов, интерфейсов и т. д.) и элементов типа (полей, методов и т. д.). Например,

class Student {

  public string name;
    
  private int num;

  }

Здесь

Типы модификаторов доступа

В C# существует 4 основных типа модификаторов доступа.

<час>

1. модификатор общего доступа

Когда мы объявляем тип или член типа public , к нему можно получить доступ из любого места. Например,

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();
    }
  }
}

Вывод

Name: Sheeran
Hello from Student class

В приведенном выше примере мы создали класс с именем Student. с полем имя и метод print() .

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

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

Поскольку поле и метод общедоступны, мы можем получить к ним доступ из Программы. класс.

Примечание :мы использовали объект student1 Студент класс для доступа к его членам. Чтобы узнать больше, посетите классы и объекты C#. .

<час>

2. модификатор закрытого доступа

Когда мы объявляем член типа с помощью private модификатор доступа, к нему можно получить доступ только в пределах одного и того же class или struct . Например,

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();
    }
  }
}

В приведенном выше примере мы создали класс с именем Student. с полем имя и метод print() .

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

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

Поскольку поле и метод являются приватными, мы не можем получить к ним доступ из Программы. учебный класс. Здесь код выдаст следующую ошибку.

Error    CS0122    'Student.name' is inaccessible due to its protection level    
Error    CS0122    'Student.print()' is inaccessible due to its protection level    
<час>

3. защищенный модификатор доступа

Когда мы объявляем элемент типа как protected , к нему можно получить доступ только из того же класса и его производных классов. Например,

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();
    }
  }
}

В приведенном выше примере мы создали класс с именем Student. с полем имя . Поскольку поле защищено, мы не можем получить к нему доступ из Программы. класс.

Здесь код выдаст следующую ошибку.

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

Теперь попробуем получить доступ к protected член производного класса.

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();
    }
  }
}

Вывод

Name: Sheeran

В приведенном выше примере мы создали класс Student. с защищенным полем имя . Обратите внимание, что мы унаследовали Program класс из раздела Студент класс.

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

Поскольку protected Доступ к члену можно получить из производных классов, мы можем получить доступ к name из Программы класс.

<час>

4. внутренний модификатор доступа

Когда мы объявляем тип или член типа как internal , к нему можно получить доступ только в пределах той же сборки.

Сборка — это набор типов (классов, интерфейсов и т. д.) и ресурсов (данных). Они созданы для совместной работы и образуют функциональную логическую единицу.

Вот почему, когда мы запускаем сборку, все классы и интерфейсы внутри сборки выполняются вместе. Чтобы узнать больше, посетите C# Assembly.

<час>

Пример:внутренний внутри одной сборки

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();
    }
  }
}

Вывод

Name: Sheeran

В приведенном выше примере мы создали класс с именем Student. с полем имя . Поскольку поле равно internal , мы можем получить к нему доступ из Программы класса, поскольку они находятся в одной сборке.

Если мы используем internal внутри одной сборки он работает точно так же, как public модификатор доступа.

<час>

Пример:внутреннее в другой сборке

Давайте сначала создадим одну сборку.

// Code on Assembly1
using System;

namespace Assembly1 {

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

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

Здесь этот код находится в Assembly1. . Мы создали внутреннее поле имя внутри класса ИмяСтудента . Теперь это поле доступно только из той же сборки Assembly1. .

Теперь давайте создадим еще одну сборку.

// 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();
     }
  }
}

Здесь этот код находится в Assembly2. . Мы пытаемся получить доступ к имя поле ИмяСтудента класс(Сборка1 ).

Доступ к полям из Assembly1 , нам сначала нужно установить ссылку на Assembly1 в Сборке2 . Теперь код

using Assembly1;

позволяет нам использовать код из Assembly1 в Сборка2 .

Здесь, когда мы пытаемся получить доступ к name поле из Assembly2 , мы получаем ошибку.

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

Это потому, что имя внутреннее поле, присутствующее в Assembly1 .

<час>

5. защищенный внутренний модификатор доступа

protected internal представляет собой комбинацию protected и internal модификаторы доступа.

Когда мы объявляем элемент protected internal , к нему можно получить доступ из той же сборки и к производному классу содержащего класса из любой другой сборки.

// 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();
     }
  }
}

Вывод

Hello

Приведенный выше код находится в Assembly1. .

В приведенном выше примере мы создали класс с именем Приветствие. с полем msg . Поскольку поле защищено изнутри, мы можем получить к нему доступ из Программы. класса, поскольку они находятся в одной сборке.

Давайте создадим класс из Приветствие в другой сборке и попытаться получить доступ к защищенному внутреннему полю msg из него.

// 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();
    }
  }
}

Вывод

Hello

Приведенный выше код находится в Assembly2. .

В приведенном выше примере мы унаследовали Program класс из Приветствие класс (из Assembly1 ).

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

Мы можем получить доступ к msg из Приветствие класс Assembly1 из Assembly2 .

Это связано с тем, что msg является защищенным внутренним полем, и мы пытаемся получить к нему доступ из дочернего класса Greet .

<час>

6. частный защищенный модификатор доступа

private protected модификатор доступа представляет собой комбинацию private и protected . Он доступен в C# версии 7.2 и выше.

Когда мы объявляем элемент private protected , к нему можно получить доступ только в том же классе и его производном классе в той же сборке. Например,

// 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();
    }
  }
}

Вывод

Sheeran

Приведенный выше код находится в Assembly1.

В приведенном выше примере мы создали класс ИмяСтудента. с private protected поле имя .

Обратите внимание, что мы унаследовали Program1 класса из ИмяСтудента класс.

Поскольку private protected Доступ к члену можно получить из производных классов в той же сборке, мы можем получить доступ к name из Программы1 класс.

Давайте создадим класс из StudentName. в другой сборке и попытаться получить доступ к частному защищенному полю name от него. Например,

// 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();
     }
  }
}

Приведенный выше код находится в Assembly2.

В приведенном выше примере, когда мы пытаемся получить доступ к name поле из класса, производного от StudentName , получаем ошибку.

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

Это потому, что имя поле находится в Assembly1 и производный класс находится в Assembly2 .

Примечание :мы также можем использовать модификаторы доступа с типами (классы, интерфейс и т. д.). Однако мы можем использовать только типы с общедоступными и внутренними модификаторами доступа.


Язык C

  1. Класс и объект С#
  2. C# статическое ключевое слово
  3. Абстрактный класс и метод С#
  4. Вложенный класс С#
  5. Частичный класс C# и частичный метод
  6. Запечатанный класс и метод С#
  7. Шаблоны классов С++
  8. Класс хранения C
  9. Java — Типы модификаторов
  10. Полиморфизм в С++