Откуда Resharper знает, что «выражение всегда верно»? - PullRequest
12 голосов
/ 21 февраля 2011

Проверьте следующий код:

private void Foo(object bar)
{
   Type type = bar.GetType();

    if (type != null) // Expression is always true
    {   
    }
}

Решарпер утверждает, что type никогда не будет null. Это очевидно для меня, потому что всегда будет тип для bar, но как Решарпер узнает об этом? Как он может знать, что результат метода никогда не будет null.

Type не является структурой, поэтому это не может быть. И если бы метод был написан мной, то возвращаемое значение, безусловно, могло бы быть null (не обязательно GetType, но что-то еще).

Достаточно ли умен Резарпер, чтобы знать, что только для этого конкретного метода результат никогда не будет null? (Как и в жестко закодированном списке известных методов .Net, которые никогда не вернут ноль)

Ответы [ 4 ]

14 голосов
/ 21 февраля 2011

JetBrains прекрасно объясняет, как ReSharper делает это в своем списке функций .

Сводка по ссылке (этот конкретный вопрос о NotNullAttribute):

Мы проанализировали большую часть библиотеки классов .NET Framework, а также NUnit Framework и аннотировали ее с помощью внешних файлов XML, используя набор настраиваемых атрибутов из пространства имен JetBrains.Annotations, в частности:

StringFormatMethodAttribute (for methods that take format strings as parameters)
InvokerParameterNameAttribute (for methods with string literal arguments that should match one of caller parameters)
AssertionMethodAttribute (for assertion methods)
AssertionConditionAttribute (for condition parameters of assertion methods)
TerminatesProgramAttribute (for methods that terminate control flow)
CanBeNullAttribute (for values that can be null)
NotNullAttribute (for values that can not be null)
UsedImplicitlyAttribute (for entities that should not be marked as unused)
MeansImplicitUseAttribute (for extending semantics of any other attribute to mean that the corresponding entity should not be marked as unused)
6 голосов
/ 21 февраля 2011

Да, у него в основном есть знания некоторых известных методов.Вы также должны найти то же самое для конкатенации строк, например:

string x = null;
string y = null;
string z = x + y;

if (z == null)
{
    // ReSharper should warn about this never executing
}

Теперь та же информация также становится доступной через Code Contracts - я не знаю, перехватывает ли JetBrains напрямуюв эту информацию, имеет свою собственную базу данных или смесь двух.

1 голос
/ 21 февраля 2011

GetType не virtual.Ваше предположение, скорее всего, верно в последнем утверждении.

Редактировать: ответить на вопрос с комментарием - оно не может быть выведено вашими методами из коробки.

0 голосов
/ 21 февраля 2011

object.GetType не является виртуальным, поэтому вы не можете самостоятельно реализовать версию, которая возвращает нулевое значение. Следовательно, если bar равно нулю, вы получите NullReferenceException, а в противном случае type никогда не будет равным нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...