ReSharper: как убрать предупреждение «Возможное исключение System.NullReferenceException» - PullRequest
11 голосов
/ 09 декабря 2010

Вот кусок кода:

IUser user = managerUser.GetUserById(UserId);
if ( user==null ) 
    throw new Exception(...);

Quote quote = new Quote(user.FullName, user.Email);

Здесь все хорошо. Но если заменить строку «если» на следующую:

ComponentException<MyUserManagerException>.FailIfTrue(user == null, "Can't find user with Id=" + UserId);

, где реализация функции следующая:

public abstract class ComponentException<T> : ComponentException
        where T : ComponentException, new()
{
    public static void FailIfTrue(bool expression, string message)
    {
        if (expression)
        {
            T t = new T();
            t.SetErrorMessage(message);
            throw t;
        }
    }
    //...
}

Затем ReSharper выдает мне предупреждение: возможное исключение System.NullReferenceException, указывающее на первое использование объекта «пользователь».

Q1. Почему это порождает такое исключение? Насколько я вижу, если user==null, то будет сгенерировано исключение, и выполнение никогда не достигнет точки использования.

Q2. Как убрать это предупреждение? Пожалуйста, обратите внимание: 1. Я не хочу подавлять это предупреждение комментариями (у меня будет много подобных частей, и я не хочу превращать мой исходный код в 'закомментированный мусор); 2. Я не хочу изменять настройки ReSharper, чтобы изменить эту проблему с предупреждения на «предложение» с «подсказкой».

Спасибо.

Любые мысли приветствуются!

P.S. Я использую Resharper 5.1, MVSV 2008, C #

Ответы [ 6 ]

10 голосов
/ 09 декабря 2010

Resharper только смотрит на текущий метод для его анализа и не рекурсивно анализирует другие методы, которые вы вызываете.

Однако вы можете направить Resharper немного и дать ему мета-информацию о некоторых методах.Например, он знает об «Assert.IsNotNull (a)» и будет учитывать эту информацию для анализа.Для Resharper можно создать внешний файл аннотаций и предоставить ему дополнительную информацию об определенной библиотеке, чтобы улучшить ее анализ.Возможно, это может предложить способ решения вашей проблемы.

Более подробную информацию можно найти здесь .

Пример, показывающий, как он используется для библиотеки Microsoft.Contracts может бытьнайдено здесь .

6 голосов
/ 26 марта 2014

Новый ответ в старом посте ...

Вот небольшой пример моего кода относительно того, как использовать CodeContract через ContractAnnotation с Resharper:

    [ContractAnnotation("value:null=>true")]
    public static bool IsNullOrEmpty(this string value)
    {
        return string.IsNullOrEmpty(value);
    }

Это очень просто ... если ты найдешь хлебную крошку в лесу. Вы можете проверить и другие случаи.

Хорошего дня

6 голосов
/ 09 декабря 2010

Q1: потому что Resharper не выполняет анализ пути. Он просто видит возможную ссылку null и отмечает, что.

Q2: Вы не можете без выполнения того, что уже предоставили.

3 голосов
/ 09 декабря 2010

Вы знаете (или ожидаете), что этот код вызовет исключение, если есть нулевая ссылка:

ComponentException<MyUserManagerException>.FailIfTrue([...]);

Однако, поскольку нет контракта, определяющего это, ReSharper должен предположить, что этопросто обычный вызов метода, который может вернуться без какого-либо исключения в любом случае.

Заставьте этот метод реализовать контракт ReSharper или как простой обходной путь (который влияет только на режим отладки, следовательно, не снижает производительность для режима выпуска)сразу после FailIfTrue вызова:

Debug.Assert(user != null);

Это избавит от предупреждения, и в качестве дополнительного бонуса выполните проверку во время выполнения в режиме отладки, чтобы убедиться, что условие, принятое вами после вызова FailIfTrue действительно встретил.

0 голосов
/ 15 октября 2018

Пожалуйста, проверьте, есть ли у вас какой-либо пользователь == ноль, если проверка выше указанного кода.Если есть, то ReSharper считает, что переменная «может быть нулевой», поэтому рекомендует вам использовать проверку / утверждение перед обращением к ней.В некоторых случаях это единственный способ, которым ReSharper может угадать, может ли переменная быть нулевой или нет.

0 голосов
/ 09 декабря 2010

Это вызвано двигателем Resharper.Это «возможное исключение NullReferenceException» происходит потому, что кто-то (возможно, в Resharper) объявил / настроил где-то аннотацию на метод.

Вот как это работает: Анализ ReSharper NullReferenceException и его контракты

К сожалению, иногда эти полезные аннотации просто неверны.

Когда вы обнаружите ошибку, вы должны сообщить об этом JetBrains, и они обновят аннотации в следующем выпуске.Они привыкли к этому.

Между тем, вы можете попытаться исправить это самостоятельно.Прочитайте статью больше:)

...