C# Language
Модификаторы доступа
Поиск…
замечания
Если модификатор доступа опущен,
- классы по умолчанию являются
internal
- методы по deault
private
- геттеры и сеттеры наследуют модификатор свойства, по умолчанию это
private
Модификаторы доступа на сеттерах или получателях свойств могут ограничивать доступ, а не расширять его: public string someProperty {get; private set;}
общественности
Ключевое слово public
делает класс (включая вложенные классы), свойство, метод или поле доступным для каждого потребителя:
public class Foo()
{
public string SomeProperty { get; set; }
public class Baz
{
public int Value { get; set; }
}
}
public class Bar()
{
public Bar()
{
var myInstance = new Foo();
var someValue = foo.SomeProperty;
var myNestedInstance = new Foo.Baz();
var otherValue = myNestedInstance.Value;
}
}
частный
private
ключевое слово отмечает свойства, методы, поля и вложенные классы для использования внутри класса:
public class Foo()
{
private string someProperty { get; set; }
private class Baz
{
public string Value { get; set; }
}
public void Do()
{
var baz = new Baz { Value = 42 };
}
}
public class Bar()
{
public Bar()
{
var myInstance = new Foo();
// Compile Error - not accessible due to private modifier
var someValue = foo.someProperty;
// Compile Error - not accessible due to private modifier
var baz = new Foo.Baz();
}
}
внутренний
Внутреннее ключевое слово делает класс (включая вложенные классы), свойство, метод или поле доступным для каждого потребителя в той же сборке:
internal class Foo
{
internal string SomeProperty {get; set;}
}
internal class Bar
{
var myInstance = new Foo();
internal string SomeField = foo.SomeProperty;
internal class Baz
{
private string blah;
public int N { get; set; }
}
}
Это может быть нарушено, чтобы тестовая сборка могла получить доступ к коду посредством добавления кода в файл AssemblyInfo.cs:
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]
защищенный
protected
ключевое слово отмечает поле, свойства методов и вложенные классы для использования только внутри одного класса и только с производными классами:
public class Foo()
{
protected void SomeFooMethod()
{
//do something
}
protected class Thing
{
private string blah;
public int N { get; set; }
}
}
public class Bar() : Foo
{
private void someBarMethod()
{
SomeFooMethod(); // inside derived class
var thing = new Thing(); // can use nested class
}
}
public class Baz()
{
private void someBazMethod()
{
var foo = new Foo();
foo.SomeFooMethod(); //not accessible due to protected modifier
}
}
защищенный внутренний
protected internal
ключевое слово отмечает поле, методы, свойства и вложенные классы для использования внутри одного и того же сборного или производного классов в другой сборке:
Ассамблея 1
public class Foo
{
public string MyPublicProperty { get; set; }
protected internal string MyProtectedInternalProperty { get; set; }
protected internal class MyProtectedInternalNestedClass
{
private string blah;
public int N { get; set; }
}
}
public class Bar
{
void MyMethod1()
{
Foo foo = new Foo();
var myPublicProperty = foo.MyPublicProperty;
var myProtectedInternalProperty = foo.MyProtectedInternalProperty;
var myProtectedInternalNestedInstance =
new Foo.MyProtectedInternalNestedClass();
}
}
Ассамблея 2
public class Baz : Foo
{
void MyMethod1()
{
var myPublicProperty = MyPublicProperty;
var myProtectedInternalProperty = MyProtectedInternalProperty;
var thing = new MyProtectedInternalNestedClass();
}
void MyMethod2()
{
Foo foo = new Foo();
var myPublicProperty = foo.MyPublicProperty;
// Compile Error
var myProtectedInternalProperty = foo.MyProtectedInternalProperty;
// Compile Error
var myProtectedInternalNestedInstance =
new Foo.MyProtectedInternalNestedClass();
}
}
public class Qux
{
void MyMethod1()
{
Baz baz = new Baz();
var myPublicProperty = baz.MyPublicProperty;
// Compile Error
var myProtectedInternalProperty = baz.MyProtectedInternalProperty;
// Compile Error
var myProtectedInternalNestedInstance =
new Baz.MyProtectedInternalNestedClass();
}
void MyMethod2()
{
Foo foo = new Foo();
var myPublicProperty = foo.MyPublicProperty;
//Compile Error
var myProtectedInternalProperty = foo.MyProtectedInternalProperty;
// Compile Error
var myProtectedInternalNestedInstance =
new Foo.MyProtectedInternalNestedClass();
}
}
Диаграммы доступа Модификаторы
Вот все модификаторы доступа в диаграммах venn, от более ограничивающих доступ к более доступным:
Модификатор доступа | схема |
---|---|
частный | |
внутренний | |
защищенный | |
защищенный внутренний | |
общественности |
Ниже вы можете найти дополнительную информацию.