5

在 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”语句下划线并建议“转换为 ?? 表达式”。但是怎么做?我错过了什么吗?

4

3 回答 3

9

鉴于您的代码,

单击它说要使用的“如果”?

按 ALT-ENTER

或点击灯泡

然后它会有一个转换选项,或者按回车,或者用鼠标点击它,你会得到

        private string _str;

        private string TheString
        {
            get { return _str ?? (_str = GetString()); }
        }
于 2013-10-17T00:12:42.953 回答
3

基思几乎回答了你的问题。这是灯泡的屏幕截图:

在此处输入图像描述

在此处输入图像描述

于 2013-10-17T00:27:18.723 回答
2

不要直接回答您的问题,但请注意,有一种简单的方法可以使用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构造函数来轻松地使这个线程安全。)

于 2013-10-17T00:23:33.637 回答