Как я могу показать, что метод никогда не будет возвращать пустой указатель (Дизайн контракта) в C#

Это довольно просто, просто исправьте проход двоеточий в self и cls:

class A:
    @staticmethod
    def some_method():
        # pass
        return

    @classmethod
    def do_something(cls):
        cls.some_method()
        return

class B(A):
    @staticmethod
    def some_method():
        print("I did stuff!")
        return

    @classmethod
    def run(cls):
        B.do_something()
        return

k = B()
k.run()
>>>"I did stuff!"

И если вы хотите вызвать старый do_something (тот, что в классе A ) из класса B, просто перейдите в соответствующий класс. В классе B:

@classmethod
def run(cls):
    A.do_something()
    return
9
задан Jason Plank 14 November 2011 в 16:23
поделиться

9 ответов

Unforutnately там не является никаким путем, встроенным к C#

Можно зарегистрировать этот факт, но это не будет автоматически проверено.

Если Вы используете resharper, то он может быть настроен для проверки этого правильно, когда метод отмечен с [NotNull] атрибут.

Иначе можно пользоваться библиотекой Microsoft Contracts и добавить что-то подобное следующему к методу, но это - довольно много дополнительной формулировки для такой простой аннотации.

Contract.Ensures(Contract.Result<string>() != null)

Spec# решил эту проблему путем разрешения a! после типа для маркировки его как непустой тип, например,

string! foo

но Spec# может только использоваться для предназначения для.NET2 и был захвачен библиотекой Code Contracts.

10
ответ дан 4 December 2019 в 10:05
поделиться

Если Вы не используете тип на основе Системы. ValueType, я думаю, что Вам не повезло. Его, вероятно, лучший для документирования этого ясно в XML/metadata комментируют для функции.

6
ответ дан 4 December 2019 в 10:05
поделиться

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

2
ответ дан 4 December 2019 в 10:05
поделиться

Единственный проверенный в типе способ гарантировать, что объект C# никогда не возвращает пустой указатель, состоит в том, чтобы использовать структуру. Структуры могут иметь участников, которые содержат нулевые значения, но никогда не могут быть пустыми сами.

Все другие объекты 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
    }
}

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

2
ответ дан 4 December 2019 в 10:05
поделиться

Если у Ваших пользователей есть Ваш исходный код с помощью стандартного дизайна контракта API как: http://www.codeproject.com/KB/cs/designbycontract.aspx может ясно дать понять вещи.

Иначе Ваш лучший выбор через документацию.

0
ответ дан 4 December 2019 в 10:05
поделиться

Мне нравится думать о нем наоборот: если моя функция могла бы возвратить нулевое значение, я лучше удостоверяюсь, что пользователь функции знает об этом.

1
ответ дан 4 December 2019 в 10:05
поделиться

Вы могли включать Отладку. Утверждайте () метод. В то время как это, конечно, не осуществит условие, оно должно прояснить (наряду с документацией), что нулевое значение не приемлемо.

0
ответ дан 4 December 2019 в 10:05
поделиться

Любой документ это хорошо (возможно, с системой документации стандарта.NET) или необходимо использовать некоторый Контракт API. Вот некоторые: http://geekswithblogs.net/Podwysocki/archive/2008/01/22/118770.aspx http://www.codeproject.com/KB/cs/designbycontract.aspx

0
ответ дан 4 December 2019 в 10:05
поделиться

Зарегистрируйте его и обеспечьте исходный код.

0
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: