Чтобы понять поведение типов классов, включая строки, рассмотрите все параметры типа класса, переменные, поля, элементы массива и т. Д. Как содержащие «идентификаторы объектов».Если Foo
является переменной типа string
, оператор Foo = 12345.ToString();
создаст новый идентификатор объекта (гипотетически, идентификатор объекта # 197) и создаст новый объект типа string
с этим идентификатором, удерживая пятьсимволы "12345"
.Затем он будет хранить Object ID#197
в переменной Foo
.Если кто-то вызывает подпрограмму с параметром без ссылки param
и передает ей Foo
, то param
будет локальной переменной, содержащей Object ID #197
.Оператор param += "6";
создаст новый объект (например, Object ID # 521) типа string, содержащий шесть символов "123456"
и сохранит Object ID #521
в param
.Обратите внимание, что Foo
по-прежнему содержит Object ID#197
, а этот объект по-прежнему содержит пятисимвольную строку "12345"
.
Если param
был передан ref
, то оператор param += "6"
будетсохранили Object ID #521
в Foo
.Это все равно не привело бы к каким-либо заметным изменениям в Объекте № 197, за исключением, возможно, предоставления ему права на сборку мусора (если бы Foo
была единственной ссылкой на Объект № 197, перезапись это означало бы, что больше не было бы никакой ссылкик этому объекту в любом месте вселенной).
Обратите внимание, что, как правило, довольно легко рассуждать о неизменных типах классов, таких как string
, даже не думая с точки зрения идентификаторов объектов, поскольку это единственный способ изменить последовательностьСимволы, представленные строковой переменной, предназначены для хранения другого идентификатора объекта.Однако при работе с изменчивыми типами классов становится важным думать с точки зрения идентификаторов объектов.Передача переменной типа класса Car
, а не ref, будет эквивалентна копированию VIN с одного листа бумаги на другой и передаче последнего листа бумаги некоторым работникам магазина и предложению им что-то с этим сделать.Если в первом документе первоначально была идентифицирована красная машина с VIN # 15934, то, когда рабочие закончили, первая бумага может идентифицировать синюю машину с VIN # 15934, но это будет та же машина.Ничто из того, что рабочие могли сделать с полученным им листом бумаги, и все, что они могли сделать с машиной, не изменило бы, какую машину упоминал первый документ.С другой стороны, передача параметра по ссылке была бы больше похожа на работу работника магазина с бумажкой, на которой был написан VIN, и на получение бумаги от них, когда они были готовы.Если работники могли вычеркнуть VIN и написать другой, тогда, когда они вернули листок бумаги, это могло относиться к той же машине или другой машине;если это относится к другому автомобилю, автомобиль, на который он первоначально ссылался, может быть изменен или не изменен, а автомобиль, на который ссылается бумага, может иметь или не иметь никакого сходства с оригиналом.