ReSharper建议“转换为??表达式”,但如何操作?

6
在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”语句,并建议将其转换为“??表达式”。但是如何操作呢?我是不是遗漏了什么?

2
它应该为你做到这一点吗? - Keith Nicholas
是的,你说得对。我的最初困惑是尝试弄清楚如何重构这段代码(例如,即使不使用resharper,也可以手动完成)。 - Moe Sisko
3个回答

11

在您的代码中,

点击'if'关键词, 它会提醒您使用??

按ALT-ENTER

或点击灯泡

会有一个转换选项,要么按回车键,要么用鼠标单击它,然后您将获得

        private string _str;

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

谢谢,我没看到那个灯泡(可能是我眼花了 <g>)。不过我必须说,在这种情况下,我觉得我的原始版本更容易阅读。我想这是主观的(?)。 - Moe Sisko
这些东西有点主观,它们是惯用语/语法糖,如果您经常使用它们,那么阅读起来就很容易。有些人喜欢简洁性,我也是。但是Resharper有很多转换可能会变得更糟,它只是一个工具和建议,最好的方法是ALT-ENTER-> ENTER,您可以获得更改后的代码,查看它,然后如果不喜欢可以撤消它。 - Keith Nicholas

3

Keith已经基本回答了你的问题。这是灯泡的截图:

enter image description here

enter image description here


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设为私有属性,我认为它只是用于捆绑整个“如果未设置则制作”过程,因此您可以删除它并在所有地方使用_str.Value

(您还可以通过向Lazy构造函数传递选项来轻松使其线程安全。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接