Názory ke článku Code Contracts - 1. díl
18. 10. 2011
Ahoj Štěpáne,
předně děkuji za výborný úvod do problematiky Code Contractů a měl bych na tebe otázku:
Berme vzorovou situaci:
public Object GetValueForKeyFromValueProvider(string key)
{
Contract.Requires(!string.IsNullOrEmpty(key), "ArgumentNull: key");
ValueProvider vp = ValueProvidersManager.GetDefaultValueProvider();
Contract.Requires(vp != null, "InvalidOperation: vp is null");
return vp.GetValueForKey(key);
}
V tomto případě vidíme chybu při kompilaci: "Error 131 After contract block, found use of local variable 'vp' defined in contract block".
Jak bys tento problém nejlépe vyřešil, tak aby byla otestována podmínka vp != null dřív než padne NullReferenceException. Podle mě to post-condition neřeší a dvojí volání ValueProvidersManager.GetDefaultValueProvider(); (jednou v kontraktu a pak znovu, aby se pořadí těchto řádek mohlo prohodit) nepřipadá v úvahu.
Děkuji, Petr Ciml
23. 10. 2013
#1 Petr Ciml
Podstatné je si uvědomit, že statický kontrolor kontraktů při kontrole "provádí" pouze řádky Contract.něco, případě řeší relevantní atributy. Čili použití kódu mimo lambdu nedává žádný smysl.