Читайте также:
|
|
Основные понятия
Руководство по программированию в C#
Ссылки
Ключевые слова C#
Модификаторы (Справочник по C#)
Другие ресурсы
Справочник по C#
Уровни доступности (Справочник по C#)
http://msdn.microsoft.com/ru-ru/library/ba0a1yw2.aspx
Модификаторы доступа public, protected, internal или private используются для указания одного из следующих объявленных уровней доступности к членам.
Объявленная доступность | Значение |
public | Неограниченный доступ. |
protected | Доступ ограничен содержащим классом или типами, которые являются производными от содержащего класса. |
internal | Доступ ограничен текущей сборкой. |
protectedinternal | Доступ ограничен текущей сборкой или типами, которые являются производными от содержащего класса. |
private | Доступ ограничен содержащим типом. |
Только один модификатор доступа может быть указан для члена или типа, за исключением случая, когда используется сочетание protectedinternal.
Модификаторы доступа не могут быть указаны для пространств имен. Пространства имен не имеют ограничений доступа.
В зависимости от контекста, в котором производится объявление члена, допускаются только некоторые объявленные уровни доступности. Если модификатор доступа не указывается в объявлении члена, используется доступность по умолчанию.
Типы верхнего уровня, не вложенные в другие типы, могут иметь только уровень доступности internal или public. Для этих типов уровнем доступности по умолчанию является internal.
Вложенные типы, которые являются членами других типов, могут иметь объявленные уровни доступности, указанные в следующей таблице.
Члены типа | Уровень доступности членов по умолчанию | Допустимые объявленные уровни доступности члена |
enum | public | Отсутствуют |
class | private | public protected internal private protectedinternal |
interface | public | Отсутствуют |
struct | private | public internal private |
Доступность вложенного типа зависит от домена доступности, который определяется объявленной доступностью члена и доменом доступности типа, непосредственно содержащего вложенный тип. Однако домен доступности вложенного типа не может выходить за границы домена доступности содержащего его типа.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:
Область доступности (Справочник по C#)
http://msdn.microsoft.com/ru-ru/library/zd74a9ww.aspx
Область доступности члена определяет, в каких разделах программы может присутствовать ссылка на этот член. Если член является вложенным членом другого типа, его область доступности определяется как уровнем доступности самого члена, так и доменом доступности типа, непосредственно содержащего вложенный тип.
Домен доступности типа верхнего уровня — это, по крайней мере, текст программы проекта, в котором он объявлен. Таким образом, домен включает все исходные файлы данного проекта. Домен доступности вложенного типа — это, по крайней мере, текст программы типа, в котором он объявлен. Таким образом, доменом является тело типа, включающее все вложенные типы. Домен доступности вложенного типа никогда не выходит за границы домена доступности содержащего его типа. Эти принципы продемонстрированы в следующем примере.
Пример
Этот пример содержит тип верхнего уровня T1 и два вложенных класса: M1 и M2. Классы содержат поля, имеющие различную объявленную доступность. В методе Main после каждого оператора следует комментарий, указывающий домен доступности для каждого члена. Обратите внимание, что операторы, ссылающиеся на недоступные члены, закомментированы. Если необходимо просмотреть сообщения об ошибках, выдаваемые компилятором при попытке ссылки на недоступный член, удаляйте комментарии по одному.
Язык C#
Копировать код
namespace AccessibilityDomainNamespace
{
public class T1
{
public static int publicInt;
internal static int internalInt;
private static int privateInt = 0; // CS0414
public class M1
{
public static int publicInt;
internal static int internalInt;
private static int privateInt = 0; // CS0414
}
private class M2
{
public static int publicInt = 0;
internal static int internalInt = 0;
private static int privateInt = 0; // CS0414
}
}
class MainClass
{
static void Main()
{
// Access is unlimited:
T1.publicInt = 1;
// Accessible only in current assembly:
T1.internalInt = 2;
// Error: inaccessible outside T1:
// T1.myPrivateInt = 3;
// Access is unlimited:
T1.M1.publicInt = 1;
// Accessible only in current assembly:
T1.M1.internalInt = 2;
// Error: inaccessible outside M1:
// T1.M1.myPrivateInt = 3;
// Error: inaccessible outside T1:
// T1.M2.myPublicInt = 1;
// Error: inaccessible outside T1:
// T1.M2.myInternalInt = 2;
// Error: inaccessible outside M2:
// T1.M2.myPrivateInt = 3;
}
}
}
Спецификация языка C#
Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:
Справочник по языку C#
Ограничения на использование уровней доступности (справочник по C#)
http://msdn.microsoft.com/ru-ru/library/cx03xt0t.aspx
При объявлении типа убедитесь, что можно определить, должен ли этот тип иметь по крайней мере такой же уровень доступности, как и другой член или тип. Например, прямой базовый класс должен иметь по крайней мере такой же уровень доступности, как и производный класс. Следующие объявления вызовут ошибку компиляции, так как базовый класс BaseClass менее доступен, чем MyClass:
Копировать код
class BaseClass {...}
public class MyClass: BaseClass {...} // Error
В следующей таблице приведены все ограничения на использование объявленных уровней доступности.
Контекст | Примечания |
Классы | Прямой базовый класс для типа класса должен иметь по крайней мере такой же уровень доступности, как и сам тип класса. |
Интерфейсы | Явные базовые интерфейсы для типа интерфейса должны иметь по крайней мере такой же уровень доступности, как и сам тип интерфейса. |
Делегаты | Тип возвращаемого значения и типы параметров для типа делегата должны иметь по крайней мере такой же уровень доступности, как и сам тип делегата. |
Константы | Тип константы должен иметь по крайней мере такой же уровень доступности, как и сама константа. |
Поля | Тип поля должен иметь по крайней мере такой же уровень доступности, как и само поле. |
Методы | Тип возвращаемого значения и типы параметров для метода должны иметь по крайней мере такой же уровень доступности, как и сам метод. |
Свойства | Тип свойства должен иметь по крайней мере такой же уровень доступности, как и само свойство. |
События | Тип события должен иметь по крайней мере такой же уровень доступности, как и само событие. |
Индексаторы | Тип и типы параметров для индексатора должны иметь по крайней мере такой же уровень доступности, как и сам индексатор. |
Операторы | Тип возвращаемого значения и типы параметров для оператора должны иметь по крайней мере такой же уровень доступности, как и сам оператор. |
Конструкторы | Типы параметров для конструктора должны иметь по крайней мере такой же уровень доступности, как и сам конструктор. |
Пример
В следующем примере содержатся ошибочные объявления различных типов. Комментарий после каждого объявления указывает на предполагаемую ошибку компиляции.
Копировать код
// Restrictions on Using Accessibility Levels
// CS0052 expected as well as CS0053, CS0056, and CS0057
// To make the program work, change access level of both class B
// and MyPrivateMethod() to public.
using System;
// A delegate:
delegate int MyDelegate();
class B
{
// A private method:
static int MyPrivateMethod()
{
return 0;
}
}
public class A
{
// Error: The type B is less accessible than the field A.myField.
public B myField = new B();
// Error: The type B is less accessible
// than the constant A.myConst.
public readonly B myConst = new B();
public B MyMethod()
{
// Error: The type B is less accessible
// than the method A.MyMethod.
return new B();
}
// Error: The type B is less accessible than the property A.MyProp
public B MyProp
{
set
{
}
}
MyDelegate d = new MyDelegate(B.MyPrivateMethod);
// Even when B is declared public, you still get the error:
// "The parameter B.MyPrivateMethod is not accessible due to
// protection level."
public static B operator +(A m1, B m2)
{
// Error: The type B is less accessible
// than the operator A.operator +(A,B)
return new B();
}
static void Main()
{
Console.Write("Compiled successfully");
}
}
Спецификация языка C#
Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:
Справочник по языку C#
internal (Справочник по C#)
http://msdn.microsoft.com/ru-ru/library/7c5ka91b.aspx
Ключевое слово internal является модификатором доступа для типов и членов типов. Внутренние типы или члены доступны только внутри файлов в одной и той же сборке (см. следующий пример).
Копировать код
public class BaseClass
{
// Only accessible within the same assembly
internal static int x = 0;
}
Сравнение модификатора internal с другими модификаторами доступа см. в разделах Уровни доступности (Справочник по C#) и Модификаторы доступа (Руководство по программированию в C#).
Дополнительные сведения о сборках см. в разделе Сборки и глобальный кэш сборок (Руководство по программированию на C#).
Внутренний доступ чаще всего используется в разработке на основе компонентов, так как он позволяет группе компонентов взаимодействовать в закрытой форме, не открывая доступ остальной части кода приложения. Например, структура для построения графических пользовательских интерфейсов может предоставлять классы Control и Form, взаимодействующие при помощи членов с внутренним доступом. Так как эти члены являются закрытыми, они не предоставляются коду, использующему структуру.
Создание ссылки на тип или член с внутренним доступом за пределами сборки, в которой он был определен, приведет к ошибке.
Примечание. |
Метод internalvirtual можно переопределить в некоторых языках, таких как MSIL, при помощи средства Ilasm.exe, даже если его не удается переопределить в языке C#. |
Пример
В этом примере содержится два файла: Assembly1.cs и Assembly2.cs. Первый файл содержит внутренний базовый класс BaseClass. Попытка создания экземпляра BaseClass во втором файле приведет к ошибке.
Копировать код
// Assembly1.cs
// Compile with: /target:library
internal class BaseClass
{
public static int intM = 0;
}
Копировать код
// Assembly1_a.cs
// Compile with: /reference:Assembly1.dll
class TestAccess
{
static void Main()
{
BaseClass myBase = new BaseClass(); // CS0122
}
}
В этом примере используются те же файлы, что и в примере 1, но уровень доступности BaseClass изменен на public. Кроме того, уровень доступности члена IntM изменен на internal. В этом случае можно создать экземпляр класса, но доступ к внутреннему члену отсутствует.
Копировать код
// Assembly2.cs
// Compile with: /target:library
public class BaseClass
{
internal static int intM = 0;
}
Копировать код
// Assembly2_a.cs
// Compile with: /reference:Assembly1.dll
public class TestAccess
{
static void Main()
{
BaseClass myBase = new BaseClass(); // Ok.
BaseClass.intM = 444; // CS0117
}
}
Спецификация языка C#
Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:
Справочник по языку C#
private (Справочник по C#)
http://msdn.microsoft.com/ru-ru/library/st6sy9xe.aspx
Ключевое слово private является модификатором доступа к члену. Закрытый (private) доступ является уровнем доступа с минимальными правами. Доступ к закрытым членам можно получить только внутри тела класса или структуры, в которой они объявлены, как показано в следующем примере:
Копировать код
class Employee
{
private int i;
double d; // private access by default
}
Вложенные типы в том же теле могут также обращаться к таким закрытым членам.
Ошибка времени компиляции возникнет в том случае, если создать ссылку на закрытый член за пределами класса или структуры, в которой он объявлен.
Сравнение модификатора private с другими модификаторами доступа см. в разделах Уровни доступности (Справочник по C#) и Модификаторы доступа (Руководство по программированию в C#).
Пример
В этом примере класс Employee содержит два закрытых элемента данных – name и salary. Как к закрытым членам, к ним нельзя получить доступ кроме как через методы членов. Для получения управляемого доступа к закрытым членам можно использовать методы с именем GetName и Salary. Доступ к методу name можно получить через открытый метод, а к методу salary – через открытое свойство только для чтения. (Дополнительные сведения см. в разделе Свойства (руководство по программированию в C#)).
Язык C#
Копировать код
class Employee2
{
private string name = "FirstName, LastName";
private double salary = 100.0;
public string GetName()
{
return name;
}
public double Salary
{
get { return salary; }
}
}
class PrivateTest
{
static void Main()
{
Employee2 e = new Employee2();
// The data members are inaccessible (private), so
// they can't be accessed like this:
// string n = e.name;
// double s = e.salary;
// 'name' is indirectly accessed via method:
string n = e.GetName();
// 'salary' is indirectly accessed via property
double s = e.Salary;
}
}
Спецификация языка C#
Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:
Справочник по языку C#
protected (справочник по C#)
http://msdn.microsoft.com/ru-ru/library/bcd5672a.aspx
Ключевое слово protected является модификатором доступа к члену. Доступ к члену с модификатором protected возможен внутри класса и из производных экземпляров класса. Для сравнения ключевого слова protected с другими модификаторами доступа см. раздел Уровни доступности.
Пример
Член базового класса с модификатором protected доступен в производном классе только в том случае, если доступ осуществляется через тип производного класса. В качестве примера рассмотрим следующий фрагмент кода:
Язык C#
Копировать код
class A
{
protected int x = 123;
}
class B: A
{
static void Main()
{
A a = new A();
B b = new B();
// Error CS1540, because x can only be accessed by
// classes derived from A.
// a.x = 10;
// OK, because this class derives from A.
b.x = 10;
}
}
Оператор a.x = 10 генерирует ошибку, поскольку он произведен внутри статического метода Main, а не внутри экземпляра класса B.
Элементы структур не могут использоваться с модификатором protected, потому что наследование от структуры невозможно.
В этом примере класс DerivedPoint является производным от класса Point. Следовательно, доступ к членам базового класса с модификатором protected можно осуществлять непосредственно из производного класса.
Язык C#
Копировать код
class Point
{
protected int x;
protected int y;
}
class DerivedPoint: Point
{
static void Main()
{
DerivedPoint dpoint = new DerivedPoint();
// Direct access to protected members:
dpoint.x = 10;
dpoint.y = 15;
Console.WriteLine("x = {0}, y = {1}", dpoint.x, dpoint.y);
}
}
// Output: x = 10, y = 15
Если изменить уровень доступа к переменным x и y на private, то компилятор выдаст следующие сообщения об ошибке:
'Point.y' is inaccessible due to its protection level.
'Point.x' is inaccessible due to its protection level.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:
Справочник по языку C#
public (справочник по C#)
http://msdn.microsoft.com/ru-ru/library/yzh058ae.aspx
Ключевое слово public является модификатором доступа для типов и членов типов. Общий (public) доступ является уровнем доступа с максимальными правами. Ограничений доступа к общим членам не существует, как показано в следующем примере:
Копировать код
class SampleClass
{
public int x; // No access restrictions.
}
Дополнительные сведения см. в разделах Модификаторы доступа (Руководство по программированию в C#) и Уровни доступности (Справочник по C#).
Пример
В следующем примере объявляются два класса: Point и MainClass. Доступ к общим членам x и y класса Point осуществляется непосредственно из класса MainClass.
Язык C#
Копировать код
class PointTest
{
public int x;
public int y;
}
class MainClass4
{
static void Main()
{
PointTest p = new PointTest();
// Direct access to public members:
p.x = 10;
p.y = 15;
Console.WriteLine("x = {0}, y = {1}", p.x, p.y);
}
}
// Output: x = 10, y = 15
Если уровень доступа public изменить на private или protected, то в результате будет выводиться следующее сообщение об ошибке:
Доступ к элементу "Point.y" невозможен из-за его уровня защиты.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:
Дата добавления: 2015-08-21; просмотров: 65 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Задание 4.Использование модификатора Tessellate | | | Пролог |