resharper暗示“转换为??表达”,但如何?

时间:2013-10-17 00:08:39

标签: c# visual-studio resharper

在Visual Studio 2012中使用Resharper 7.1.1。示例代码:

    private string _str;

    private string TheString
    {
        get
        {
            if (_str == null) // "X"
            {
                _str = GetString();
            }
            return _str;
        }
    }

    // do some work to get string. e.g. read from database
    private string GetString()
    {
        return "blah";
    }

在标记为“X”的行处,resharper强调“if”语句并建议“转换为??表达式”。但是怎么样?我错过了什么吗?

3 个答案:

答案 0 :(得分:7)

鉴于您的代码,

单击“if”,表示要使用??

按ALT-ENTER

或点击灯泡

然后它会有一个转换选项,按Enter键,或用鼠标点击它,你就会得到

        private string _str;

        private string TheString
        {
            get { return _str ?? (_str = GetString()); }
        }

答案 1 :(得分:3)

基思几乎回答了你的问题。这里是灯泡的截图 -

enter image description here

enter image description here

答案 2 :(得分:1)

不要直接回答您的问题,但请注意使用Lazy<T>执行此操作的简单方法:

using System;

class Foo
{
    private readonly Lazy<string> _str;

    public Foo()
    {
        _str = new Lazy<string>(GetString);
    }

    private string TheString
    {
        get
        {
            return _str.Value;
        }
    }

    private string GetString()
    {
        return "blah";
    }
}

由于您正在将TheString作为私有属性,我认为它只是将整个make-if-not-set进程捆绑在一起,因此您可以删除它并在任何地方使用_str.Value

(您也可以通过将选项传递到Lazy构造函数来轻松实现此线程安全。)