string은 C#에서 사용되는 불변문자열이다.
여기서 불변이라 함은, string으로 만들어진 인스턴스의 내용을 바꿀수 없음을 의미한다.
다만 const나 readonly처럼 아예 막아놓은 것이 아니라, 문자열 변경을 할때, 완전히 새로운 메모리를 할당하고 수정한다. 즉 string 문자열 변경이 잦을 경우, 메모리의 할당과 해제가 많이 일어날 수 밖에 없는 구조이기 때문에, 동적할당으로 인해 발생하는 overhead(메모리 단편화 등)가 일어날 수 밖에 없다.
불변성을 가진 개체는, thread safe하다. 동기화를 하지 않아도, race condition이 발생하지 않는다. 여러 스레드가 string에 동시에 접근한다고 해보자. 이때 해당 데이터를 읽기만 하는경우, 당연히 별 문제가 되지 않는다. 그럼, 쓰기 연산을 진행할 경우 어떻게 될까? 데이터를 수정하게 되면 string은 immutable 타입이기 때문에 새로운 공간에 수정한 데이터를 할당하게 된다. 그러면, 기존데이터는 변경되지 않은 상태이기 때문에 다른 스레드가 접근한다고 하더라도, 변경되기 전의 데이터로 접근하는 것이다. 구조가 단순하기 때문에, 멀티스레드환경에서 어떻게 동작할 지 예측하기 쉽다.
하지만 우리가 원하는 string은 이런것이 아닐 수 있다. 런타임중 유연하게 문자열을 수정하고 싶을때는 StringBuilder class를 사용하면 된다.