Модификаторы доступа C#
Модификаторы доступа C#
В этом руководстве мы узнаем об общедоступных, частных, защищенных и внутренних модификаторах доступа в C# с помощью примеров.
В C# модификаторы доступа определяют доступность типов (классов, интерфейсов и т. д.) и элементов типа (полей, методов и т. д.). Например,
class Student {
public string name;
private int num;
}
Здесь
- имя - открытое поле, к которому можно получить доступ из любого места
- число - доступ к приватному полю возможен только из Student класс
Типы модификаторов доступа
В 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