действуют по большей части так же, как ссылочные параметры. Но они предназначены для случаев, когда вызываемый метод задает значение для параметра, а не изменяет его. Следовательно, инициализации параметров будут отличаться. C# требует, чтобы параметр
ref
инициализировался внутри вызываемого метода до своего использования.
Перезагрузка методов
Методы могут быть перезагружены таким же образом, как в C++. Однако C# не допускает в методах параметров по умолчанию. Это можно смоделировать с помощью перезагружаемой версии:
Свойства не имеют эквивалента в 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
и
delete[]
. Они не нужны, так как сборщик мусора автоматически управляет очисткой памяти в куче. Однако C# предоставляет также три других оператора, которые не существуют в C++, а именно,
is
,
as
и
typeof
. Эти операторы связаны с получением информации о типе объекта или класса.
Оператор присваивания (=)
Для простых типов данных = просто копирует данные. Однако при определении своих собственных классов C++ считает в большой степени, что обязанность разработчика указать значение
=
для этих классов. По умолчанию в C++
=
требует поверхностного почленного копирования всех переменных, классов или структур. Однако программисты перезагружают этот оператор для выполнения более сложных операций присваивания.
В C# правила, определяющие, что означает оператор присваивания, значительно проще. Вообще не разрешается перезагружать =, его значение неявно определено во всех ситуациях.
Ситуация в C# будет следующая:
□ Для простых типов данных
=
просто копирует значения, как в C++.
□ Для структур
=
делает поверхностное копирование структуры — прямую копию памяти данных в экземпляре структуры. Это аналогично поведению в C++.
□ Для классов
=
копирует ссылку, то есть адрес, а не объект. Это не соответствует поведению в C++.
Если требуется скопировать экземпляры классов, обычный способ в C# состоит в переопределении метода
MemberwiseCopy
, который все классы в C# по умолчанию наследуют из класса
System.Object
— общего класса-предка, из которого неявно выводятся все классы C#.