// позже, при вызове метода
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
.
Можно опустить любой из методов доступе get
или set
из определения свойства, и в этом случае свойство осуществляет соответственно либо только запись, либо только чтение.
Операторы
Значение и синтаксис операторов в большинстве случаев те же в C#, что и в C++. Следующие операторы по умолчанию имеют в C# такое же значение и синтаксис как и в C++:
□ Бинарные арифметические операторы +
, -
, *
, /
, %
□ Соответствующие арифметические операторы присваивания +=
, - =
, *=
, /=
, %=
□ Унарные операторы ++
и --
(обе — префиксная и постфиксная формы)
□ Операторы сравнения !=
, ==
, <
, <=
, >=
□ Операторы сдвига >>
и <<
□ Логические операторы &
, |
, &&
, ||
, ~
, ^
, !
□ Операторы присваивания, соответствующие логическим операторам: >>=
, <<=
, &=
, |=
, ^=
□ Тернарный (условный) оператор
Символы ()
, []
, и ,
(запятая) также имеют в общих чертах такой же эффект в C#, как и в C++.
Необходимо быть осторожным со следующими операторами, так как они действуют в C# иначе, чем в C++:
□ Присваивание (=
), new
, this
.
Оператор разрешения области видимости в C# представлен .
, а не ::
(::
не имеет смысла в C#). Также в C# не существуют операторы delete
и