C # (и .NET) включают как ссылочные типы, так и типы значений.
Обычно (отсутствуют ключевые слова ref
или out
), параметры передаются в методы by value
.Таким образом, если вы передаете целое число в функцию, передается значение целого числа.Если вы поместите переменную, ссылающуюся на массив, в вызове функции (помня, что все массивы являются экземплярами ссылочного типа System.Array), значение этой переменной, то есть ссылка на массив, передается функции.
Таким образом, внутри функции код воспроизводится в этом массиве.Когда функция возвращается, эта переменная (в области вызова) все еще ссылается на тот же объект.Однако функция может иметь мутировавший этот массив, поэтому переменная (в области видимости вызывающей стороны) может ссылаться на измененный объект.
Если вы передаете тип значения по ссылке (сref
ключевое слово), функция может изменить значение параметра, и когда функция вернется, переменная (в области вызова) получит новое значение.
Но, если вы используете ref
(или out
) для параметра ссылочного типа вы передаете ссылку по ссылке .Так, например, вы можете передать массив из пяти целых чисел, и функция может назначить этот параметр и массив из десяти целых чисел (они одного типа, но определенно разные объекты).В вызывающей программе, когда функция вернется, переменная, связанная с этим параметром, увидит, что она указывает на полное изменение во время вызова.
В вашем примере вызывающая сторона создаст два массива одного типа и совместимых длин(обычно одинаковой длины, если исходный и целевой индексы равны 0, а длина равна sourceArray.Length
).Функция не изменяет объект, на который ссылается параметр массива назначения, она просто заполняет пункт назначения из источника.
Фактически, если пункт назначения был by ref
, он не был бы таким гибким.Рассмотрим случай, когда длина назначения составляет 30 записей, и вы намерены заполнить середину десяти записей массива источником.Это просто работает.Это не было бы с ref
параметром назначения (без большой дополнительной работы).