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

ЖАНРЫ

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

Ватсон Карли

Шрифт:

this

Оператор

this
имеет то же самое значение, что и в C++, но это скорее ссылка, а не указатель. Например, в C++ можно записать:

this->m_MyField = 10;

В C# это будет выглядеть так:

this.MyField = 10;

this
используется в C# таким же образом, как и в C++. Например, можно передавать его в качестве параметра в вызовах методов или использовать его, чтобы сделать явным доступ к полю-члену класса. В C# существует пара других ситуаций, которые синтаксически требуют использования
this
,
о них будет упомянуто в разделе о классах.

new

Как сообщалось ранее, оператор

new
, интерпретируемый как конструктор, имеет другое значение в C#, поскольку он обеспечивает инициализацию объекта а не запрос динамического выделения памяти.

Классы и структуры

В C++ классы и структуры очень похожи. Формально единственное различие состоит в том, что члены структуры являются по умолчанию открытыми, в то время как члены класса являются по умолчанию закрытыми. На практике, однако, многие программисты предпочитают использовать структуры и классы различным образом, сохраняя использование структур для объектов данных, которые содержат только члены-переменные (другими словами, без функций членов или явных конструкторов).

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

□ Структуры не поддерживают наследование, кроме того факта, что они являются производными из

System.ValueType
. Невозможно наследовать от структуры и структура не может наследовать от другой структуры или класса.

□ Структуры являются типами данных значений. Классы всегда являются ссылочными типами данных.

□ Структуры позволяют организовать способ размещения полей в памяти и определяют эквивалент объединений C++.

□ Конструктор структуры по умолчанию (без параметров; всегда поставляется компилятором и не может быть заменен.

Поскольку классы и структуры сильно отличаются в C#, они в этом приложении рассматриваются по отдельности.

Классы 

Классы в C# следуют в основном тем же самым принципам, что и в C++, однако существует разница в свойствах и синтаксисе. Мы рассмотрим отличия между классами C++ и классами C# в этом разделе.

Определение класса

Классы определяются в C# с помощью синтаксиса, который на первый взгляд выглядит как синтаксис C++:

class MyClass : MyBaseClass {

 private string SomeField;

public int SomeMethod {

return 2;

 }

}

За этим первоначальным сходством скрываются многочисленные различия в деталях.

□ Не существует модификатора доступа по имени базового класса. Наследование всегда открытое.

□ Класс может быть выведен только из одного базового класса (хотя из любого числа интерфейсов). Если базовый класс явно не определен, то класс будет автоматически выводиться из

System.Object
, который
предоставит ему всю функциональность
System.Object
, из которой чаще всего используется
ToString
.

□ Каждый член явно объявляется с модификатором доступа. Не существует эквивалента синтаксису C++, где один модификатор доступа может применяться к нескольким членам.

public: // нельзя использовать этот синтаксис в C#

 int MyMethod;

 int MyOtherMethod;

□ Методы не могут объявляться как

inline
. Это связано с тем, что C# компилируется в промежуточный язык (IL). Любые вставки кода происходят на второй стадии компиляции, когда JIT-компилятор выполняет преобразование из IL в собственный код машины. JIT-компилятор имеет доступ ко всей информации в IL при определении, какие методы могут подходить для вставки без необходимости каких-либо указаний в исходном коде разработчика.

□ Реализация методов всегда помещается вместе с определением. Невозможно написать реализацию вне класса, как позволяет C++.

□ В то время как в ANSI C++ единственными типами члена класса являются переменные, функции, конструкторы, деструкторы и перезагружаемые версии операторов, C# имеет в наличии также делегатов, события и свойства.

□ Модификаторы доступа

public
,
private
и
protected
обладают тем же самым значением, как и в C++, но существуют два дополнительных модификатора доступа:

 □ 

internal
ограничивает доступ к другому коду внутри той же сборки.

 □ 

protected internal
ограничивает доступ к производным классам, которые находятся внутри той же сборки.

□ Инициализация переменных разрешается в C# в определении класса.

□ В C++ ставится точка с запятой после закрывающейся фигурной скобки в конце определения класса. Это не требуется в C#.

Инициализация полей членов

Синтаксис, используемый для инициализации полей членов в C#, очень отличается от синтаксиса C++, хотя конечный результат одинаковый.

Члены экземпляра

В C++ поля членов экземпляра обычно инициализируются в списке инициализации конструктора:

MyClass::MyClass : m_MyField(6) {

 // и т.д.

В C# этот синтаксис недопустим. Можно помещать в инициализатор конструктора (который является эквивалентом C# списка инициализации конструктора в C++) другой конструктор. Вместо этого инициализированное значение помечается с помощью определения члена в определении класса:

class MyClass {

 private int MyField = 6;

Отметим, что в C++ это будет ошибкой, так как C++ использует примерно такой же синтаксис для определения чисто виртуальных функций. В C# такое действие считается нормой, так как C# не применяет синтаксис

=0
для этой цели (он использует вместо этого ключевое слово
abstract
).

Статические поля

В C++ статические поля инициализируются с помощью отдельного определения вне класса:

Поделиться с друзьями: