and*_*her 5 c# immutability thread-safety
我最近开始阅读C#中的可变和不可变对象,并且我发现无论我在哪里读取的常量是帽子是不可变的,当用作哈希表中的键时,使得线程安全且有用,但是我不理解的是,就概念而言虽然我们无法更改内容,但我们可以更改以下内容:
string s = "Hi";
s = "Bye";
Run Code Online (Sandbox Code Playgroud)
虽然在这里s的引用被改为"Bye",但主要的是s的内容(或者更确切地说是指向的内容)已经改变,并且从编程的角度来看是相同的,所以这是怎么回事如果字符串被更改,使一个特定的函数线程安全或可用于哈希表?
在您的示例中,s被重新分配以引用不同的string对象(“Bye”),但先前引用的对象s(“Hi”)并未更改。引用字符串“Hi”的任何其他内容(另一个线程、 aDictionary等)将不受影响。正如您所提到的,string它是不可变的 - 它的内容一旦创建就无法更改。string例如,如果将一个对象附加到另一个对象,您将得到一个新string对象。两个原始string对象保持不变。string这就是线程安全的原因,并且适合在哈希表中使用。
该引用s 不是线程安全的 - 为了确保使用引用时的线程安全,您需要在引用分配周围加一把锁,以确保一个线程在另一个线程写入时不会尝试从该引用中读取数据它。