Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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# R#-双重检查锁定模式的可能错误实现_C#_Multithreading_Resharper - Fatal编程技术网

C# R#-双重检查锁定模式的可能错误实现

C# R#-双重检查锁定模式的可能错误实现,c#,multithreading,resharper,C#,Multithreading,Resharper,R#在创建IdGenerator实例的行上显示一条警告“可能不正确执行双重检查锁定模式。读取对已检查字段的访问权限” 在我将代码更改为以下内容后,R#不显示警告: private readonly Object _syncRoot = new Object(); public IdGenerator ClientIdGenerator { get { if ( clientIdGenerator != null ) return clien

R#在创建IdGenerator实例的行上显示一条警告“可能不正确执行双重检查锁定模式。读取对已检查字段的访问权限”

在我将代码更改为以下内容后,R#不显示警告:

private readonly Object _syncRoot = new Object();
public IdGenerator ClientIdGenerator
{
    get
    {
        if ( clientIdGenerator != null )
            return clientIdGenerator;

        lock ( _syncRoot )
        {
            if ( clientIdGenerator != null )
                return clientIdGenerator;

            return clientIdGenerator = ClientIdPrefix != null ? new IdGenerator( ClientIdPrefix ) : new IdGenerator();
        }
    }
}

第一个示例是否有问题,或者R#是否显示“错误”警告?

您的第一个版本应该可以正常工作,但为了避免部分代码分析引擎或同事产生误解,您可以使用标准模式:

public IdGenerator ClientIdGenerator
{
    get
    {
        if ( clientIdGenerator == null )
            lock ( _syncRoot )
            {
                if ( clientIdGenerator != null )
                    return clientIdGenerator;

                clientIdGenerator = ClientIdPrefix != null ? new IdGenerator( ClientIdPrefix ) : new IdGenerator();
            }
        return clientIdGenerator;
    }
}

这样你就可以明确你的意图。

你的第一个版本应该可以很好地工作。我强烈认为resharper代码分析引擎在这种情况下是误导性的。我也这么认为…谢谢!
private readonly Object _syncRoot = new Object();
public IdGenerator ClientIdGenerator
{
    get
    {
        if (clientIdGenerator == null)
        {
            lock (_syncRoot)
            {
                if (clientIdGenerator == null)
                {
                    clientIdGenerator = ClientIdPrefix != null ? new IdGenerator(ClientIdPrefix) : new IdGenerator();
                }
            }
        }

        return clientIdGenerator;
    }
}