Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ReaderWriterLockSlim和参考_C#_Multithreading - Fatal编程技术网

C# ReaderWriterLockSlim和参考

C# ReaderWriterLockSlim和参考,c#,multithreading,C#,Multithreading,我有一门课: public static class Message { private static readonly ReaderWriterLockSlim Locker = new ReaderWriterLockSlim(); private static string theMessage; public static void SetMessage(string message) { Locker.EnterWriteLock();

我有一门课:

public static class Message
{
    private static readonly ReaderWriterLockSlim Locker = new ReaderWriterLockSlim();
    private static string theMessage;

    public static void SetMessage(string message)
    {
        Locker.EnterWriteLock();
        theMessage = message;
        Locker.ExitWriteLock();
    }

    public static string GetMessage()
    {
        Locker.EnterReadLock();
        var msg = theMessage; // <<<=====
        Locker.ExitReadLock();
        return msg;
    }
}
公共静态类消息
{
私有静态ReaderWriterLockSlim Locker=new ReaderWriterLockSlim();
私有静态字符串消息;
公共静态void SetMessage(字符串消息)
{
Locker.EnterWriteLock();
theMessage=消息;
Locker.ExitWriteLock();
}
公共静态字符串GetMessage()
{
Locker.EnterReadLock();

var msg=theMessage;//基于对象的类(字符串是一个)的成员分配在C#中是原子的。根本不需要锁定


如果在这两个块中除了
theMessage=message;
var msg=theMessage;
之外还有更多的代码,则可能需要它,但由于您只需执行一次赋值,因此不需要锁定。

基于对象类的成员赋值(哪个字符串是一个)在C#中是原子的。根本不需要锁定


如果在这两个块中除了
theMessage=message;
var msg=theMessage;
之外还有更多的代码,则可能需要它,但由于您只需执行一次赋值,因此锁定是不必要的。

因为字符串是一种引用类型,所以您获得的是对某个值的引用,而不是该lin中的值本身e:

var msg = theMessage;
如果您希望防止其他线程的更改影响大多数引用类型的方法返回值,我建议您复制该值,并将另一个引用返回到新复制的值。
但字符串是不可变的类型,所以它实际上并不重要,因为其他线程无论如何都不能更改它的值(没有人可以更改它是不可变的!)。

因此,不必深入复制字符串以防止其他线程更改返回值


您可以参考这些问题(,)进一步阅读为什么不可变对象是线程安全的。

因为字符串是引用类型,所以您在此行中获得的是对值的引用,而不是值本身:

var msg = theMessage;
如果您希望防止其他线程的更改影响大多数引用类型的方法返回值,我建议您复制该值,并将另一个引用返回到新复制的值。
但字符串是不可变的类型,所以它实际上并不重要,因为其他线程无论如何都不能更改它的值(没有人可以更改它是不可变的!)。

因此,不必深入复制字符串以防止其他线程更改返回值


您可以参考这些问题(,)进一步阅读为什么不可变对象是线程安全的。

但是我仍然需要创建字符串的副本吗?字符串是不可变的,一旦您有了它的实例,它的内部状态就无法改变。任何像
Substring(4)
Trim()这样的函数
所有函数都返回新字符串,保留原始字符串。但是我仍然需要创建字符串的副本吗?字符串是不可变的,一旦有了它的实例,它的内部状态就无法改变。任何函数,如
子字符串(4)
Trim()
都返回新字符串,保留原始字符串。