C# для профессионалов. Том II
Шрифт:
Первый шаг по использованию делегатов состоит в определении делегата. Наш тестовый делегат определяется в строке
Подробно о классах
Как в Java, как и в C#, класс является скелетом, который содержит методы, но не данные. Это структура потенциального объекта. Образование экземпляра класса создает объект на основе этой структуры. Существуют различные ключевые слова и концепции, связанные с классами, которые, были рассмотрены ранее. В этом разделе мы повторим эти ключевые слова и введем новые.
Модификаторы
Как и в Java, модификаторы в C# используются для модификации объявлений типа и членов. Далее представлен список модификаторов C#. Более подробное определение значений отдельных идентификаторов дано в разделе о ключевых словах данного приложения. Однако некоторые из перечисленных модификаторов являются новыми и будут рассмотрены в ближайших разделах.
Модификатор класса | Описание |
---|---|
abstract | Нельзя создавать экземпляры абстрактных классов. Производные классы, которые их расширяют, должны реализовать все абстрактные методы класса, и модификатор sealed нельзя применять к этим классам. |
sealed | Используется для предотвращения случайного наследования, так как от класса, определенного как sealed , нельзя наследовать. |
Модификатор члена | Цель | Эквивалент в Java | Описание |
---|---|---|---|
virtual | Методы, методы доступа | недоступно | Позволяет переопределять целевые члены классам-наследникам. |
static | Все | static | Целевой член, помеченный как static , принадлежит классу, а не экземпляру этого класса. Поэтому не требуется создавать экземпляр класса, чтобы получить к нему доступ. |
event | Поля, свойства | недоступно | Используемый для связывания клиентского кода с событиями класса, модификатор event позволяет определить делегата, который будет вызываться, когда в коде произойдет некоторое "событие". Отметим, что программист класса определяет, где и когда инициируется событие, а подписчик определяет, как его обработать. |
abstract | Методы, методы доступа | abstract | Указывает, что целевой член является неявно виртуальным и не имеет кода реализации. Производный класс должен предоставить эту реализацию, при этом реализованный метод помечается как override . |
const | Поля, локальные переменные | final | Указывает, что целевой член не может быть изменен. Java также имеет ключевое слово const , которое в данный момент является просто зарезервированным словом. |
readonly | Поля | недоступно | Указывает, что целевому члену можно присвоить значение только при его объявлении или в конструкторе класса, содержащего этот член. |
extern | Методы | недоступно | Указывает, что целевой член реализуется внешне. Этот модификатор обычно используется с атрибутом DllImport . |
override | Методы | недоступно | Указывает, что целевой член предоставляет новую реализацию члена, унаследованного из базового класса. |
Модификатор доступа | Цель | Эквивалент в Java | Описание | По умолчанию |
---|---|---|---|---|
public | Все | public | Без ограничений. | Члены enum
interface , а также пространства имен. |
private | Все | private | Доступны только объявляющему классу. | Члены class и struct . |
internal | Все | недоступно | Доступны файлам в той же сборке. | |
protected | Все | недоступно | Доступны для объявляющего класса и любых его подклассов. В C# protected более ограничен, чем в Java. Закрытый (protected ) доступ не позволит другим файлам в той же сборке иметь доступ к члену. | |
protected internal | Все | protected | Доступны для файлов сборки и подклассов объявляющего класса. |
Конструкторы
Первый метод, который будет вызван в классе в процессе создания экземпляра объекта,— это конструктор. Утверждение справедливо для Java, C++, C# и других языков. Фактически, даже если специально не писать свой собственный конструктор, будет создан конструктор по умолчанию. Но в C# обращение к объекту-предку или другому конструктору обрабатывается совершенно по-другому, чем в Java:
Из этого примера видно, что выполнение вызова конструктора предка или даже другого конструктора можно сделать, "расширяя" его с помощью символа "
C# вводит концепцию деструкторов, позаимствованную из C++. Они работают аналогично завершителям (
Рекомендация в отношении кода деструктора: "сборщик мусора" в .NET не вызывается сразу же после того, как переменная покидает область действия. На самом деле имеется некоторый интервал времени или условия памяти, которые инициируют поток выполнения. Бывают случаи, когда деструктор запускается в условиях нехватки памяти, поэтому желательно делать его код как можно короче. Также неплохо вызывать
Методы
Java и C# существенно различаются в синтаксисе и идеологии в отношении способа, которым объект образовывает методы. Это связано с одной причиной — не все параметры типа ссылочных данных передаются как ссылки и не все простые типы данных должны передаваться по значению. Имеется возможность передавать аргументы по значению, как параметр