我有以下代码:
private static LogLevel? _logLevel = null;
public static LogLevel LogLevel
{
get
{
if (!_logLevel.HasValue)
{
_logLevel = readLogLevelFromFile();
}
return _logLevel.Value;
}
}
private static LogLevel readLogLevelFromFile() { ... }
我在return
声明中收到有关可能的System.InvalidOperationException
的ReSharper警告,并建议我先检查_logLevel
是否null
。但是,readLogLevelFromFile
会返回LogLevel
,而不是LogLevel?
,因此当return
为_logLevel
时,无法联系到null
语句。这只是ReSharper的疏忽,还是我错过了什么?
答案 0 :(得分:5)
这看起来像是Resharper中的一个错误。
但请注意,这不是线程安全的。
The best way to do this is to use a static initializer,像这样:
public static LogLevel Instance { get { return Nested.level; } }
class Nested {
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested() { }
internal static readonly LogLevel level = readLogLevelFromFile();
}
答案 1 :(得分:4)
你可以将它重构成这样的东西:
return (_logLevel = _logLevel ?? readLogLevelFromFile()).Value;
或者你可以使用内置的懒惰类型(需要.NET 4.0,或者你可以自己滚动。):
public static LogLevel LogLevel
{
get { return _logLevel.Value; }
}
private static Lazy<LogLevel> _logLevel = new Lazy<LogLevel>(readLogLevelFromFile);
答案 2 :(得分:0)
Resharper不够“聪明”,足以为你解决问题。我想,这是一件很复杂的事情。
我更喜欢@ ChaosPandion的重构......