1/2: Наличие контракта на property2 уместно, если это поведение, которое вы хотите применить, т. Е. Оно не должно быть нулевым и, безусловно, уменьшит потребность в нулевых проверках и потенциальных ошибках вокруг нулевых значений.
3: Чтобы ответить на этот вопрос, я переписал ваш класс следующим образом
class Class1
{
//Properties
public string Property1 { get; set; }
public List<object> Property2 { get; set; }
public Class1(string property1, List<object> property2)
{
Contract.Requires(property1 != null);
Contract.Requires(property2 != null);
Property1 = property1;
Property2 = property2;
}
public Class1(string property1)
: this(property1, new List<object>())
{
Contract.Requires(property1 != null);
}
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(Property1 != null);
Contract.Invariant(Property2 != null);
}
}
Когда у вас есть автоматически реализованные свойства в вашем классе, вы можете использовать Contract.Invariant()
.Это делает явные контракты в вашей собственности избыточными, поэтому теперь нет необходимости в следующем коде.
public string Property1
{
get
{
Contract.Ensures(Contract.Result<string>() != null);
return this._property1;
}
set
{
Contract.Requires(value != null);
this._property1 = value;
}
}
Это позаботится о защите собственности.Чтобы полностью гарантировать, что свойство никогда не будет нулевым, вы добавите Contract.Requires (property1! = Null) в конструктор.
Я знаю, что этот ответ опоздал на 3 года, но он может быть вам полезен!
Источник: http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf