У меня есть метод, который никогда не возвращает нулевой объект. Я хочу пояснить, чтобы пользователям моего API не приходилось писать такой код:
if(Getxyz() != null)
{
// do stuff
}
Как я могу показать это намерение?
У меня есть метод, который никогда не возвращает нулевой объект. Я хочу пояснить, чтобы пользователям моего API не приходилось писать такой код:
if(Getxyz() != null)
{
// do stuff
}
Как я могу показать это намерение?
К сожалению, в С# нет встроенного способа.
Вы можете задокументировать этот факт, но это не будет автоматически проверено.
Если вы используете resharper, то его можно настроить для правильной проверки, когда метод помечен атрибутом [NotNull].
В противном случае вы можете использовать библиотеку Microsoft Contracts и добавить что-то похожее на следующее к вашему методу, но это довольно много лишнего словоблудия для такой простой аннотации.
Contract.Ensures(Contract.Result<string>() != null)
Spec# решил эту проблему, разрешив ! после типа, чтобы пометить его как ненулевой тип, например
string! foo
но Spec# можно использовать только для таргетинга на .NET2, и он был узурпирован библиотекой Code Contracts.
Result
должен быть вызовом метода: Contract.Result<string>()
- person porges; 09.05.2010
Contract.Ensures(Contract.Result<T>() != null)
в контрактах кода. постусловия в пространстве имен System.Diagnostics.Contracts а>.
- person ToolmakerSteve; 17.04.2020
Если вы не используете тип, основанный на System.ValueType, я думаю, вам не повезло. Вероятно, лучше всего четко задокументировать это в комментарии XML/метаданных для функции.
Я не знаю, есть ли наилучшая практика для этого из API, поскольку я все равно буду программировать в обороне и проверять нуль как потребитель. Я думаю, что это все еще лучшая практика в этом случае, поскольку я склонен не доверять другому коду, чтобы он всегда делал правильные вещи.
Единственный способ с проверкой типов гарантировать, что объект C# никогда не вернет значение null, — это использовать структуру. Структуры могут иметь элементы, содержащие нулевые значения, но сами никогда не могут быть нулевыми.
Все остальные объекты C# могут быть нулевыми.
Пример кода:
public struct StructExample
{
public string Val;
}
public class MyClass
{
private StructExamle example;
public MyClass()
{
example = null; // will give you a 'Cannot convert to null error
}
public StructExample GetXyz()
{
return null; // also gives the same error
}
}
Приведенный выше пример не будет компилироваться. Если использование структуры приемлемо (она становится типом значения, передается по стеку, не может быть подклассом), то это может сработать для вас.
Мне нравится думать об этом наоборот: если моя функция может возвращать нулевое значение, мне лучше убедиться, что пользователь функции знает об этом.
Если у ваших пользователей есть исходный код, использующий стандартный API-интерфейс проектирования по контракту, например: http://www.codeproject.com/KB/cs/designbycontract.aspx может прояснить ситуацию.
В противном случае лучше всего использовать документацию.
Либо хорошо задокументируйте это (возможно, с помощью стандартной системы документации .NET), либо вам придется использовать какой-либо контрактный API. Вот некоторые из них: http://geekswithblogs.net/Podwysocki/archive/2008/01/22/118770.aspx http://www.codeproject.com/KB/cs/designbycontract.aspx
Вы можете включить метод Debug.Assert(). Хотя это, конечно, не приведет к принудительному выполнению условия, должно быть ясно (вместе с документацией), что нулевое значение неприемлемо.
Задокументируйте его и предоставьте исходный код.
Contract.Ensures(Contract.Result<T>() != null)
в контрактах кода. постусловия в пространстве имен System.Diagnostics.Contracts а>. По первой приведенной выше ссылке я получаю эту ссылку для скачивания. - person ToolmakerSteve   schedule 17.04.2020