Есть ли способ пометить метод как гарантирующий, что T не равен нулю? - PullRequest
8 голосов
/ 15 марта 2011

Например, если у меня есть метод, определенный как ...

T Create()
{
    T t = Factory.Create<T>();

    // ...

    Assert.IsNotNull(t, "Some message.");
    // -or-
    if (t == null) throw new Exception("...");
    // -or- anything that verifies that it is not null
}

... и я вызываю этот метод откуда-то еще ...

void SomewhereElse()
{
    T t = Create();
    // >><<
}

...at >><<, я знаю (имеется в виду меня, человека, который это написал), что t гарантированно не будет нулевым.Есть ли способ (возможно, атрибут, который я не нашел) пометить метод как гарантирующий, что внутренняя логика гарантирует, что ссылочный тип, который он возвращает или иным образом пропускает (возможно, параметр out), не равен нулю?

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

Есть мысли?Я просто становлюсь жертвой болезни о-о-о-о-о-о-о-о-о-о-о-о-о-о-о-че-что?

Ответы [ 4 ]

5 голосов
/ 15 марта 2011

Если вас беспокоит ReSharper, вы можете пометить метод Factory.Create<T>() их атрибутом [NotNull], описанным в их веб-справке

1 голос
/ 15 марта 2011

Вы можете наложить ограничение на T, чтобы разрешить только struct.

Вы можете использовать расширение языка, которое позволяет вам более точно определить условия до / после выполнения вашей функции (контрактное программирование), например SpecSharp или Кодовые контракты . Контракты кода, кажется, используют встроенные системы из C # 4.0. У меня нет опыта ни с одним - только слышал о них.

1 голос
/ 15 марта 2011

Не знаю, как R # справляется с этим, но метод Contract.Assert может быть тем, что вы ищете

0 голосов
/ 15 марта 2011

Не могли бы вы привести T к объекту, а затем проверить его нулевое значение?

var o = (object)Factory.Create<T>();
if(o == null) throw new Exception();
...