class MyRect
{
double p,
w, h;
[ContractInvariantMethod]
void ObjectInvariant()
{
Contract.Invariant(p == w + h);
Contract.Invariant(w >= h);
Contract.Invariant(h > 0);
}
public MyRect(double w, double h)
{
this.w = w;
this.h = h;
p = w + h;
}
public double H
{
// Изменение высоты не должно превышать 10 единиц за раз.
set {
// Проверка в форме предусловия.
Contract.Requires(Math.Abs(value - H) < 10.0, "Too large change.");
h = value;
w = p - h;
}
get { return h; }
}
public double W
{
// Изменение ширины не должно превышать 10 единиц за раз.
set
{
// Проверка в форме постусловия.
Contract.Ensures(Math.Abs(Contract.OldValue(w) - w) < 10.0, "Too large...");
w = value;
h = p - w;
}
get { return w; }
}
public double Square()
{
// Площадь всегда положительна.
Contract.Ensures(Contract.Result
() > 0, "Squere must be positive");
return w * h;
}
}
Пример