ВниМание
Не.путайте.ключевые.слова.dynamic.и.var .Объявление.локальной.переменной.с.клю-
чевым.слово.var.является.не.более.чем.синтаксическим.сокращением,.заставляющим.
компилятор.определить.тип.данных.по.выражению .Данное.ключевое.слово.служит.
только.для.объявления.локальных.переменных.внутри.метода,.в.то.время.как.клю-
чевое.слово.dynamic.используется.для.локальных.переменных,.полей.и.аргументов .
Невозможно.привести.выражение.к.типу.var,.но.такая.операция.вполне.допустима.
для.типа.dynamic .Переменные,.объявленные.с.ключевым.словом.var,.должны.ини-
циализироваться.явно,.что.не.обязательно.для.переменных.типа.dynamic .Более.
подробную.информацию.о.динамическом.типе.вы.найдете.в.главе.5
251
Передача.параметров.в.метод.по.ссылке
Передача параметров в метод по ссылке
По умолчанию CLR предполагает, что все параметры методов передаются по
значению. При передаче объекта ссылочного типа методу передается ссылка (или
указатель) на этот объект. То есть метод может изменить переданный объект, влияя
на состояние вызывающего кода. Если параметром является экземпляр значимого
типа, методу передается его копия. В этом случае метод получает собственную
копию объекта, а исходный экземпляр сохраняется неизменным.
ВниМание
Следует.знать.тип.каждого.объекта,.передаваемого.методу.в.качестве.параметра,.
поскольку.манипулирующий.параметрами.код.может.существенно.различаться.в.за-
висимости.от.типа.параметров
CLR также позволяет передавать параметры по ссылке, а не по значению. В C#
это делается с помощью ключевых слов
out
и
ref
. Оба заставляют компилятор
генерировать метаданные, описывающие параметр как переданный по ссылке.
Компилятор использует эти метаданные для генерирования кода, передающего
вместо самого параметра его адрес.
С точки зрения CLR, ключевые слова
out
и
ref
не различаются, то есть для них
генерируются одинаковый IL-код, а метаданные отличаются всего одним битом,
указывающим, какое ключевое слово было использовано при объявлении метода.
Однако компилятор C# различает эти ключевые слова при выборе метода, исполь-
зуемого для инициализации объекта, на который указывает переданная ссылка.
Если параметр метода помечен ключевым словом
out
, вызывающий код может не
инициализировать его, пока не вызван сам метод. В этом случае вызванный метод
не может прочитать значение параметра и должен записать его, прежде чем вернуть
управление. Если же параметр помечен ключевым словом
ref
, вызывающий код
должен инициализировать его перед вызовом метода, а вызванный метод может
как читать, так и записывать значение параметра.
Поведение ссылочных и значимых типов при использовании ключевых слов
out
и
ref
различается значительно. Вот как это выглядит в случае значимого типа:
public sealed class Program {
public static void Main() {
Int32 x; // Инициализация x
GetVal(out x); // Инициализация x не обязательна
Console.WriteLine(x); // Выводится 10
}
private static void GetVal(out Int32 v) {
v = 10; // Этот метод должен инициализировать переменную V
}
}
252
Do'stlaringiz bilan baham: |