Попробую объяснить:
Я думаю, мы правильно понимаем, как работают типы значений? Типы значений (int, long, struct и т. Д.). Когда вы отправляете их в функцию без команды ref, она КОПИРУЕТ данные. Все, что вы делаете с этими данными в функции, влияет только на копию, а не на оригинал. Команда ref отправляет ФАКТИЧЕСКИЕ данные, и любые изменения повлияют на данные вне функции.
Хорошо, перейдем к запутанной части, ссылочные типы:
Создадим ссылочный тип:
List<string> someobject = new List<string>()
Когда вы обновляете someobject, создаются две части:
- Блок памяти, содержащий данные для someobject.
- Ссылка (указатель) на этот блок данных.
Теперь, когда вы отправляете someobject в метод без ссылки, он КОПИРУЕТ указатель ссылки, а НЕ данные. Итак, теперь у вас есть это:
(outside method) reference1 => someobject
(inside method) reference2 => someobject
Две ссылки, указывающие на один и тот же объект. Если вы измените свойство someobject с помощью ссылки2, это повлияет на те же данные, на которые указывает ссылка1.
(inside method) reference2.Add("SomeString");
(outside method) reference1[0] == "SomeString" //this is true
Если вы обнуляете reference2 или указываете на новые данные, это не повлияет ни на reference1, ни на ссылку data1, на которую указывает.
(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
person
James Roland
schedule
23.09.2010
MyClass
будетclass
типом, то есть ссылочным типом. В этом случае переданный вами объект может быть изменен с помощьюmyFunction
даже без ключевого слова _4 _ / _ 5_.myFunction
получит новую ссылку, указывающую на тот же объект, и сможет изменять этот же объект сколько угодно. Отличие ключевого словаref
будет заключаться в том, чтоmyFunction
получит такую же ссылку на тот же объект. Это было бы важно только в том случае, если быmyFunction
изменил ссылку на другой объект. - person Jeppe Stig Nielsen   schedule 08.06.2013