Да - последний вариант (простое назначение) безопасен для строк (в управляемом коде), как показано в этом коде:
string s1 = "Initial Value";
string s2 = s1;
Console.WriteLine("String1: " + s1);
Console.WriteLine("String2: " + s2);
s1 = "New Value";
Console.WriteLine("String1 - after change: " + s1);
Console.WriteLine("String2 - after change: " + s2);
Выход:
String1: Initial Value
String2: Initial Value
String1 - after change: New Value
String2 - after change: Initial Value
Строки являются неизменяемыми - поэтому, когда вы меняете s1, вы действительно создаете новую строку и присваиваете ее. Ссылка на s2 по-прежнему указывает на старый экземпляр.