Yes - the last choice (simple assignment) is safe for strings (in managed code), as this code illustrates:
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);
Conclusion:
String1: Initial Value
String2: Initial Value
String1 - after change: New Value
String2 - after change: Initial Value
Lines are immutable - so when you change s1, you really create a new line and assign it. The s2 link remains a pointer to the old instance.