обнуляемый тип и предупреждение ReSharper - PullRequest
7 голосов
/ 14 мая 2010

У меня есть следующий код:

private static LogLevel? _logLevel = null;

public static LogLevel LogLevel
{
    get
    {
        if (!_logLevel.HasValue)
        {
            _logLevel = readLogLevelFromFile();
        }

        return _logLevel.Value;
    }
}

private static LogLevel readLogLevelFromFile() { ... }

Я получаю предупреждение ReSharper в операторе return о возможном System.InvalidOperationException, и он предлагает проверить _logLevel, чтобы узнать, является ли оно null первым. Однако readLogLevelFromFile возвращает LogLevel, а не LogLevel?, поэтому невозможно достичь оператора return, если _logLevel равен null. Это просто недосмотр со стороны ReSharper, или я что-то упустил?

Ответы [ 3 ]

5 голосов
/ 14 мая 2010

Это похоже на ошибку в 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();
}
4 голосов
/ 14 мая 2010

Вы можете преобразовать его в нечто вроде этого:

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);
0 голосов
/ 14 мая 2010

Решарпер не был «умным», чтобы понять это за вас. Мне кажется, это довольно сложная вещь для понимания.

Я предпочитаю рефакторинг @ ChaosPandion в любом случае ...

...