在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”语句并建议“转换为??表达式”。但是怎么样?我错过了什么吗?
答案 0 :(得分:7)
鉴于您的代码,
单击“if”,表示要使用??
按ALT-ENTER
或点击灯泡
然后它会有一个转换选项,按Enter键,或用鼠标点击它,你就会得到
private string _str;
private string TheString
{
get { return _str ?? (_str = GetString()); }
}
答案 1 :(得分:3)
基思几乎回答了你的问题。这里是灯泡的截图 -
答案 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
构造函数来轻松实现此线程安全。)