Насколько свободный я могу быть в коде в объектном инварианте?

Вы тестируете/видите это поведение с помощью IE? Возможно, что IE подает те страницы от кэша. Известно трудно заставить IE сбрасывать, это - кэш, и так далее много случаев, даже после того, как Вы выходите из системы, введение URL одной из "защищенных" страниц показало бы кэшируемое содержание до.

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

26
задан Jon Skeet 30 July 2009 в 21:23
поделиться

3 ответа

Судя по (предварительным) страницам MSDN, член Contract.ForAll может помочь вам с двумя контрактами диапазона. Однако документация не очень подробно описывает его функцию.

//untested
Contract.Invariant(Contract.ForAll(count, buffer.Length, i => buffer[i] == null));
Contract.Invariant(Contract.ForAll(1, count, 
    i => string.Compare(buffer[i], buffer[i - 1]) >= 0));
8
ответ дан 28 November 2019 в 17:28
поделиться

(Я собираюсь принять ответ Хенка, но думаю, что стоит добавить это.)

Ответ на этот вопрос теперь дан на форуме MSDN , и В результате ожидается, что первая форма не будет работать. Инварианты действительно, действительно должны быть серией вызовов Contract.Invariant , вот и все.

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

Это ограничение можно обойти, просто поместив всю логику в другой член, например, свойство IsValid , а затем позвонив:

Contract.Invariant(IsValid);

Это, несомненно, испортит статическую проверку, но в некоторых случаях это может быть полезная альтернатива в некоторых случаях.

3
ответ дан 28 November 2019 в 17:28
поделиться

Разве дизайнеры не изобретают велосипед немного заново?

Что не так с старым добрым

bool Invariant() const; // in C++, mimicking Eiffel

?

Теперь в C # у нас нет const, но почему вы не можете просто определить функцию Invariant

private bool Invariant()
{
  // All the logic, function returns true if object is valid i.e. function
  // simply will never return false, in the absence of a bug
}
// Good old invariant in C#, no special attributes, just a function

, а затем просто использовать кодовые контракты в терминах этой функции?

[ContractInvariantMethod]
private void ObjectInvariant()
{
    Contract.Invariant(Invariant() == true);
}

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

1
ответ дан 28 November 2019 в 17:28
поделиться
Другие вопросы по тегам:

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