我想強制執行一個結構,使其始終對構造函數強制實施的某個合同有效。但合同受到default
運營商的侵犯。如何在結構中執行合同
考慮下面的,例如:
struct NonNullInteger
{
private readonly int _value;
public int Value
{
get { return _value; }
}
public NonNullInteger(int value)
{
if (value == 0)
{
throw new ArgumentOutOfRangeException("value");
}
_value = value;
}
}
// Somewhere else:
var i = new NonNullInteger(0); // Will throw, contract respected
var j = default(NonNullInteger); // Will not throw, contract broken
作爲一種變通方法,我改變了結構的一類,所以我可以保證構造函數總是被調用初始化一個新的實例時。但我想知道,是否有絕對沒有辦法獲得與結構相同的行爲?
這實際上是滿足合同信件的一個很好的解決方案,儘管它也需要檢查int.MinValue。我不建議創建這個結構,但是,如果你真的想這樣做,這可能是最乾淨的解決方案。 –
+1智能技巧。但是,對於更復雜的合同可能會更困難。 –