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

на главную

Жанры

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

Ватсон Карли

Шрифт:

// будут неинициализированы

Struct = new MyStruct; // вызывает конструктор, поэтому

// инициализирует поля, но не выделяет

// никакой памяти, так как Struct уже

// существует в стеке

Можно использовать

new
для того, чтобы вызвать конструктор для предопределенных типов данных:

int X = new int;

Это имеет такой же результат, как:

int X = 0;

Отметим, что это то же самое, что и

int X;

Последняя

инструкция оставит
X
неинициализированной (если переменная
X
является локальной переменной метода).

Методы 

Методы в C# определяются таким же образом, как функции в C++, с учетом факта, что методы C# всегда должны быть членами класса, и определение и объявление в C# всегда объединены:

class MyClass {

public int MyMethod {

 // реализация

Есть одно ограничение, состоящее в том, что методы-члены не могут объявляться как

const
в C#. Свойство C++ явно объявлять методы как
const
(другими словами, не изменяющими содержащий их экземпляр класса) выглядело первоначально как хорошее средство проверки на наличие ошибок во время компиляции, но оказалось вызывающим проблемы на практике. Это было связано с тем, что методы, чтобы сохранять открытое состояние класса, изменяют значения закрытых переменных членов, например, переменных, которые задаются при первом обращении. В коде C++ вполне можно встретить оператор
const_cast
, используемый для того, чтобы обойти метод, объявленный как
const
. В связи с этими проблемами компания Microsoft решила не использовать константные методы в C#.

Параметры методов

Как и в C++, по умолчанию параметры передаются в методы по значению. Если требуется это изменить, можно использовать ключевое слово

ref
, указывающее, что параметр передается по ссылке, и
out
, чтобы указать, что это параметр вывода (всегда передается по ссылке). Если это сделано, то необходимо объявлять этот факт как в определении метода, так и при его вызове.

public void MultiplyByTwo(ref double d, out double square) {

 d *= 2;

 square = d*d;

}

// позже, при вызове метода

double Value, Square Value = 4.0;

MultiplyByTwo(ref Value, out Square);

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

const
к параметрам, как это делает C++.

Параметры типа

out
действуют по большей части так же, как ссылочные параметры. Но они предназначены для случаев, когда вызываемый метод задает значение для параметра, а не изменяет его. Следовательно, инициализации параметров
будут отличаться. C# требует, чтобы параметр
ref
инициализировался внутри вызываемого метода до своего использования.

Перезагрузка методов

Методы могут быть перезагружены таким же образом, как в C++. Однако C# не допускает в методах параметров по умолчанию. Это можно смоделировать с помощью перезагружаемой версии:

Для C++ можно сделать следующую запись:

double DoSomething(int someData, bool Condition=true) {

 // и т.д.

В то время как в C# необходимо выполнить такие действия:

double DoSomething(int someData) {

 DoSomething(someData, true);

}

double DoSomething(int someData, bool condition) {

 // и т.д.

Свойства

Свойства не имеют эквивалента в ANSI C++, хотя они были введены как расширение в Microsoft Visual C++. Свойство является методом или парой методов, которые синтаксически оформлены для представления в вызывающем коде, как будто свойство является полем. Они существуют для ситуации, когда интуитивно удобнее вызывать метод с помощью синтаксиса поля, очевидным примером будет случай закрытого поля, которое должно быта инкапсулировано с помощью оболочки из открытых методов доступа. Предположим, что класс имеет такое поле

length
типа
int
. Тогда в C++ оно инкапсулируется с помощью методов
GetLength
и
SetLength
. Необходимо будет обращаться к нему извне класса:

// MyObject является экземпляром рассматриваемого класса

MyObject.SetLength(10);

int Length = MyObject.GetLength;

В C# можно реализовать эти методы, как аксессоры (методы доступа)

get
и
set
свойства
Length
. Тогда запишем

// MyObject является экземпляром рассматриваемого класса

MyObject.Length = 10;

int length = MyObject.Length;

Чтобы определись эти методы доступа, свойство будет определяться следующим образом:

class MyClass {

 private int length;

 public int Length {

get {

return length;

}

set {

Length = value;

}

Хотя методы доступа

get
и
set
реализованы здесь, чтобы просто возвращать или задавать поле
length
, в эти методы можно поместить любой другой требуемый код C# так же, как это обычно делается в методе. Например, добавить некоторую проверку данных в метод доступа
set
. Отметим, что метод доступа
set
возвращает
void
и получает дополнительный неявный параметр с именем
value
.

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

Часовое имя

Щерба Наталья Васильевна
4. Часодеи
Детские:
детская фантастика
9.56
рейтинг книги
Часовое имя

Ох уж этот Мин Джин Хо 4

Кронос Александр
4. Мин Джин Хо
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 4

Аутсайдер

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

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье

Блуждающие огни 2

Панченко Андрей Алексеевич
2. Блуждающие огни
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Блуждающие огни 2

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Волк: лихие 90-е

Киров Никита
1. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк: лихие 90-е

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Релокант. По следам Ушедшего

Ascold Flow
3. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант. По следам Ушедшего

(Не) Все могут короли

Распопов Дмитрий Викторович
3. Венецианский купец
Фантастика:
попаданцы
альтернативная история
6.79
рейтинг книги
(Не) Все могут короли

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

(Бес) Предел

Юнина Наталья
Любовные романы:
современные любовные романы
6.75
рейтинг книги
(Бес) Предел

Отверженный VIII: Шапка Мономаха

Опсокополос Алексис
8. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VIII: Шапка Мономаха

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок