Вы тестируете/видите это поведение с помощью IE? Возможно, что IE подает те страницы от кэша. Известно трудно заставить IE сбрасывать, это - кэш, и так далее много случаев, даже после того, как Вы выходите из системы, введение URL одной из "защищенных" страниц показало бы кэшируемое содержание до.
(я видел это поведение, даже когда Вы регистрируетесь как различный пользователь, и IE показывает "Желанную" панель наверху Вашей страницы с именем пользователя старого пользователя. В наше время обычно перезагрузка будет обновлять его, но если это является персистентным, это могла бы все еще быть кэширующаяся проблема.)
Судя по (предварительным) страницам 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));
(Я собираюсь принять ответ Хенка, но думаю, что стоит добавить это.)
Ответ на этот вопрос теперь дан на форуме MSDN , и В результате ожидается, что первая форма не будет работать. Инварианты действительно, действительно должны быть серией вызовов Contract.Invariant
, вот и все.
Это делает более возможным для статической проверки понять инвариант и обеспечить его соблюдение.
Это ограничение можно обойти, просто поместив всю логику в другой член, например, свойство IsValid
, а затем позвонив:
Contract.Invariant(IsValid);
Это, несомненно, испортит статическую проверку, но в некоторых случаях это может быть полезная альтернатива в некоторых случаях.
Разве дизайнеры не изобретают велосипед немного заново?
Что не так с старым добрым
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);
}
Может быть, я пишу чепуху, но даже в этом случае это будет иметь некоторую дидактическую ценность, когда все скажут я ошибаюсь.