Чтение онлайн

на главную

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

}

public static void Main(string[] args) {

Sample sm = new Sample;

TestDelegate aDelegate = new TestDelegate(sm.test);

TestDelegate anotherDelegate = new TestDelegate(sm.test2);

aDelegate("test");

anotherDelegate("test2");

}

 }

}

Первый шаг по использованию делегатов состоит в определении делегата. Наш тестовый делегат определяется в строке

public delegate void TestDelegate(string k);
 . Затем определяется класс с методами, которые имеют сигнатуру, аналогичную делегату. Конечный шаг заключается в создании экземпляра делегата который создается так же, как экземпляр класса и реализуется с помощью оператора
new
. Единственное различие состоит в том, что имя целевого метода передается
делегату как аргумент. Затем вызывается делегат. В примере вызывается экземпляр
aDelegate
с помощью вызова
aDelegate("test");
.

Подробно о классах

Как в 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:

public class Parent {

}

public class Sample: Parent {

 private string internalVal;

 private string newVal;

 public Sample:base {}

 public Sample(String s) {

internalVal = s;

 }

 public Sample(String s, String t) : this(s) {

newVal = t;

 }

}

Из этого примера видно, что выполнение вызова конструктора предка или даже другого конструктора можно сделать, "расширяя" его с помощью символа "

:
". В случае конструктора предка используется ключевое слово
base
для идентификации источника, исходящего из объекта предка, в то время как это используется для идентификации источника, исходящего из другого конструктора объекта. Применение подходящей сигнатуры к
base
вызовет соответствующий конструктор предка, так же как применение правильной сигнатуры вызовет правильный внутренний конструктор. Мы подчеркнем это, делая некоторые изменения в класс
Sample
:

public class Parent {

 protected Parent(string a) {

Console.WriteLine(a);

 }

 protected Parent {

Console.WriteLine("This is the base constructor");

 }

}

public class Sample: Parent {

 public Sample {

 }

 public Sample(String s):base(s) {

 }

 public Sample(String s, String t): this(s) {

Console.WriteLine(t);

 }

}

C# вводит концепцию деструкторов, позаимствованную из C++. Они работают аналогично завершителям (

finalizer
) в Java, их синтаксис, однако, существенно отличается. Деструкторы используют логический знак отрицания (
~
) в качестве префикса для имени класса:

~Sample {

}

Рекомендация в отношении кода деструктора: "сборщик мусора" в .NET не вызывается сразу же после того, как переменная покидает область действия. На самом деле имеется некоторый интервал времени или условия памяти, которые инициируют поток выполнения. Бывают случаи, когда деструктор запускается в условиях нехватки памяти, поэтому желательно делать его код как можно короче. Также неплохо вызывать

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

Методы

Java и C# существенно различаются в синтаксисе и идеологии в отношении способа, которым объект образовывает методы. Это связано с одной причиной — не все параметры типа ссылочных данных передаются как ссылки и не все простые типы данных должны передаваться по значению. Имеется возможность передавать аргументы по значению, как параметр

in
(это способ передачи параметров по умолчанию), по ссылке, как параметр
ref
, или как параметр
out
. Следующий код:

Поделиться:
Популярные книги

Неудержимый. Книга XII

Боярский Андрей
12. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XII

Мастер 5

Чащин Валерий
5. Мастер
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Мастер 5

Идущий в тени 5

Амврелий Марк
5. Идущий в тени
Фантастика:
фэнтези
рпг
5.50
рейтинг книги
Идущий в тени 5

Три `Д` для миллиардера. Свадебный салон

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Три `Д` для миллиардера. Свадебный салон

Проклятый Лекарь. Род II

Скабер Артемий
2. Каратель
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Проклятый Лекарь. Род II

Вальдиры миры. Кроу-3

Михайлов Дем Алексеевич
3. Кроу
Фантастика:
фэнтези
рпг
8.38
рейтинг книги
Вальдиры миры. Кроу-3

Новый Рал 8

Северный Лис
8. Рал!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Новый Рал 8

Приручитель женщин-монстров. Том 7

Дорничев Дмитрий
7. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 7

Системный Нуб

Тактарин Ринат
1. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Системный Нуб

Объединитель

Астахов Евгений Евгеньевич
8. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Объединитель

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода

Мимик нового Мира 7

Северный Лис
6. Мимик!
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 7

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Приручитель женщин-монстров. Том 2

Дорничев Дмитрий
2. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 2