Я собираюсь попробовать свои силы в объяснении:
Я думаю, мы понимаем, как работают типы значений, верно? Типы значений (int, long, struct и т. Д.). Когда вы отправляете их в функцию без команды ref, она КОПИРУЕТ данные . Все, что вы делаете с этими данными в функции, влияет только на копию, а не на оригинал. Команда ref отправляет ФАКТИЧЕСКИЕ данные, и любые изменения будут влиять на данные вне функции.
Хорошо, запутанная часть, типы ссылок:
Позволяет создать тип ссылки:
List<string> someobject = new List<string>()
Когда вы обновляетесь Someobject , создаются две части:
- Блок памяти, в котором хранятся данные для someobject .
- Ссылка (указатель) на этот блок
данных.
Теперь, когда вы отправляете someobject в метод без ссылки на него, КОПИРУЕТ указатель reference , НЕ данные. Итак, теперь у вас есть это:
(outside method) reference1 => someobject
(inside method) reference2 => someobject
Две ссылки, указывающие на один и тот же объект. Если вы измените свойство в someobject , используя reference2, это повлияет на те же данные, на которые указывает reference1.
(inside method) reference2.Add("SomeString");
(outside method) reference1[0] == "SomeString" //this is true
Если вы обнулите эталон2 или укажете на новые данные, это не повлияет на эталон1 или на эталон данных1.
(inside method) reference2 = new List<string>();
(outside method) reference1 != null; reference1[0] == "SomeString" //this is true
The references are now pointing like this:
reference2 => new List<string>()
reference1 => someobject
Что происходит, когда вы отправляете someobject по ссылке на метод?
фактическая ссылка на someobject отправляется методу. Теперь у вас есть только одна ссылка на данные:
(outside method) reference1 => someobject;
(inside method) reference1 => someobject;
Но что это значит? Он действует так же, как отправка объекта не по ссылке, за исключением двух основных вещей:
1) Когда вы обнуляете ссылку внутри метода, она обнуляет ссылку за пределами метода.
(inside method) reference1 = null;
(outside method) reference1 == null; //true
2) Теперь вы можете указать ссылку на совершенно другое местоположение данных, а ссылка вне функции теперь будет указывать на новое местоположение данных.
(inside method) reference1 = new List<string>();
(outside method) reference1.Count == 0; //this is true