Here is my problem. I am a very big fan of Design by contract, I am using this concept especially when developing libraries that can be used by other developers. I just found out a new way of doing this which is: Contract.Requires
instead of Exception
:
So instead of having:
public void SomeMethod(string name){
if(name==null) throw new NullArgumentException("Null values not supported");
}
I now have:
public void SomeMethod(string name){
Contract.Requires(name != null);
}
EDIT: I am working under VS2010 on debug mode.
Problem: Contract.Requires
does not do anything, even when name
is null
!
The MSDN documentation says:
Specifies a precondition contract for the enclosing method or property.
But nothing is specified in case the condition is not met!
I also noticed there are other Contract.Requires
overloads that throw exception, display message... but then what is Contract.Requires(Boolean)
for?
EDIT Answer below highlighted that a plug-in must be installed to have the full power of Contract
API but then what about Mono users who want their code to behave the same on different platforms?
From the Contract class docs:
With a message like this it is usually helpful to specify exactly what you have done.
For example, you do not mention in the original message if you have installed the VS Addon, nor that you have enabled it under your project properties, or that you are actually running in debug vs release mode, etc.
Re
Contract.Requires
vsContract.Requires<Exception>
Contract.Requires
is recommended. According to the manualYou should do the following:
Contract.Requires
withContract.Requires<SomeException>
(the first one throwsSystem.Diagnostics.ContractException
while the second throws the exception you specified which is important for public methods)That's the basic setup. For more accurate configuration, refer to the manual
If you use Mono, probably, Contract class is empty. I haven't done this, but chapter seven from the Contracts manual seems to explain how to provide your own implementation.