Что происходит, когда мы передаём string в метод и обрабатываем его значение там, учитывая, что string — ссылочный и неизменный тип?
======================================================================================================================================

 Допустим у нас есть код:  

public static void Main()  

{  

string str = "str";  

Update(str);  

Console.WriteLine(str)  

}  

static void Update(string myStr) => myStr += "S";  

  

Что тут происходит? У нас значение переменной str копируется в myStr и всё также как и со значимым типом или мы передаём ссылку на объект типа string, но строка myStr += "S"; просто не может изменить значение переменной, хотя и скомпилировалась? 

`String` хитрый тип, до недавнего времени его нельзя была задать в роли константы, т.к. он действительно ссылочный тип. Ещё по-умолчанию он интернированный, т.е все одинаковые тексты ссылаются на одним объект. Текст нельзя поменять, можно только создать новый объект с новым текстом.  

У вас же передаётся ссылка на объект "str", а затем в методе создаётся новый объект текста и ссылка сохраняется в переменную.  

Отсюда следует, что если вы собираете условный json постоянными склейками текстов, то вы генерируете кучу новых объектов - не эффективно расходуя память. Для это лучше использовать StringBuilder, который весь текст складывает в один буфер с заранее большей длинной. 

 Ничего у вас не изменится. Для защиты строки перед вызовом update в il коде инструкция dup которая дублирует переменную на стеке и передаёт ее в функцию, и ссылка на новое значение будет записана в дубликат переменной, а исходная переменная не будет затерта.