ReSharper: как удалить "возможную" систему.Исключение NullReferenceException'" предупреждение

вот фрагмент кода:

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

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

здесь все хорошо. Но если я заменю строку" if " следующей:

        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 генерирует мне предупреждение: возможная " система.NullReferenceException "указывает на 1-е использование объекта "пользователь".

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

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

спасибо.

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

P. S. Я используя для ReSharper 5.1, МВСВ-2008, В C#

5 ответов


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

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


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

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

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

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


новый ответ на старый пост...

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

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

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

хорошего дня


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

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

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

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

Debug.Assert(user != null);

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


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

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

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

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

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