В примере с веб-сайтом Microsoft ниже приведены коды:
class TestRef
{
static void FillArray(ref int[] arr)
{
// Create the array on demand:
if (arr == null)
{
arr = new int[10];
}
// Fill the array:
arr[0] = 1111;
arr[4] = 5555;
}
}
Если я удалю строку if (arr == null)
, выход ошибки будет 0 0 0 0 0
не 1 2 3 4 5
. Зачем?
Это связано с тем, что вы передаете ref
это означает, что вы меняете указатель на эту переменную в main
методе.
Вы назначаете его новому int[]
который заполняется значением по умолчанию int
которое равно 0
Здесь, в функции FillArray
вы передаете массив по ссылке
но когда вы удаляете блок if
вы повторно инициализируете массив
когда вы инициализируете массив типа значения, элементы принимают значение по умолчанию для типа значения
В этом случае это int
которые имеют значение по умолчанию 0
Вы должны понимать pass by value vs pass by reference в С#
http://www.programminginterviews.info/2011/05/pass-by-value-versus-reference-in-c.html
также тип значения vs ref type
http://www.albahari.com/valuevsreftypes.aspx
это происходит потому, что когда вы помещаете свой код, так как это означает, что вы передаете свой intArray методу, но когда вы удаляете строки, как вы упомянули в этом случае, new int [] присваивается переменной, которая будет заполнять значение по умолчанию 0 в вашем массиве,
эта строка arr = new int[10];
присваивает новый int [] при удалении условий.
Как указано на официальном сайте: -
Параметр ref массива может быть изменен в результате вызова. Например, массиву может быть присвоено нулевое значение или может быть инициализировано в другой массив.
new int[]
массивnew int[]
, все элементы инициализируются в0
. Это ты спрашиваешь?