可空类型和ReSharper警告
我有以下代码:
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?
,所以当_logLevel
为null
时,无法达到return
语句。 这只是ReSharper的疏忽,还是我错过了什么?
这看起来像Resharper中的一个错误。
但请注意,这不是线程安全的。
执行此操作的最佳方法是使用静态初始化程序 ,如下所示:
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(); }
你可以将它重构成这样的东西:
return (_logLevel = _logLevel ?? readLogLevelFromFile()).Value;
或者,您可以使用内置的延迟类型(需要.NET 4.0或者您可以自己滚动。):
public static LogLevel LogLevel { get { return _logLevel.Value; } } private static Lazy _logLevel = new Lazy (readLogLevelFromFile);
Resharper不够“聪明”,不足以为你解决问题。 我想,这是一件很复杂的事情。
无论如何我更喜欢@ ChaosPandion的重构……