似乎与.NET 4.0 Code Contracts一起使用的静态分析器仅适用于Visual Studio的Team Suite版本 - 这使得它远远超出了我的团队的预算.
是否有任何替代方案(开源,免费或价格合理),通过合同样式代码(不一定使用.net代码合同)为设计提供类似的静态分析.我猜这个答案是肯定的,因为只有当BCL本身有合同时才能获得全部价值 - 但有没有哪个部分合作?
代码合同很有效,直到您必须为Contract.Assume(...)框架代码中的结果添加一个bazillion .例如,MemoryStream.ToArray()永远不会返回一个空数组,就像我在Reflector中查看它一样,但它没有记录为契约,所以我必须Assume到处都是.
是否有一种神奇的方法来为已经存在的功能创建合同库?我猜测,一旦你完成了几十个最常用的框架功能,这些警告就会变得更加可口.
有没有明确地指定一个返回值的方法可以使用代码契约为空?
我担心的是,没有a的方法Contract.Ensures(Contract.Result<object>() != null)将来可能被错误地"修复"以包括后置条件,即使最初的意图可能是允许空结果.
我对单元测试有相当多的了解.我一直试图阅读代码合同.它真的有助于单元测试吗?它是否被高估了,特别是当我们谈论有助于进行单元测试的代码合同时.我特指的是.net 4.0中的合同.我使用nunit进行单元测试.
我已经开始使用代码契约,并发现它很难立即发现方法的"胆量".
拿这个(非常简单)的例子:
public static void UserAddNew(string domain, string username, string displayName)
{
Contract.Assert(!string.IsNullOrWhiteSpace(domain));
Contract.Assert(!string.IsNullOrWhiteSpace(username));
Contract.Assert(!string.IsNullOrWhiteSpace(displayName));
LinqDal.User.UserAddNew(domain, username, displayName);
}
Run Code Online (Sandbox Code Playgroud)
现在我很想将合同放在一个区域,以便它们可以被隐藏起来,但是我担心我会失去一个很好的优势,能够浏览方法并看到它的期望.
你怎么做才能让你的合同"整洁"?或者我只是太挑剔了?
我刚开始使用Code Contracts,需要一些帮助来纠正错误:
鉴于此代码:
class MyClass
{
private bool _isUsed = false;
public void SomeMethod()
{
Contract.Requires(!_isUsed);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error CC1038: Member 'MyClass._isUsed' has less visibility than the enclosing method 'MyClass.SomeMethod'
Run Code Online (Sandbox Code Playgroud)
这似乎使很多标准检查不可用.我在这个例子中缺少什么?
我可能会误解代码合同,但这是我的情况.
我有以下代码:
interface IFetch<T> // defined in another DLL
{
T Fetch(int id);
}
interface IUserFetch : IFetch<User>
{
IEnumerable<User> GetUsersLoggedIn ();
}
class UserFetch : IUserFetch
{
public User Fetch(int id)
{
return (User) Database.DoStuff (id);
}
public IEnumerable<User> GetUsersLoggedIn ()
{
return (IEnumerable<User>) Database.DoMoreStuff ();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试添加一个相对简单的合同: Contract.Requires (id != 0);,我想要验证它Fetch.当我直接将其添加到Fetch时,我会收到警告Method Fetch(int id) implements interface 3rdParty.IFetch<User> and thus cannot add Requires.
我创建了一个实现IFetch的抽象代码契约类,ContractClass并ContractClassFor分别使用和属性将其指向/从UserFetch .我仍然得到一个错误CodeContracts: The class 'FetchUserContracts' is …
在我开始使用代码约定之前,有时在使用构造函数链时会遇到与参数验证相关的繁琐.
这是一个(人为的)示例最简单的解释:
class Test
{
public Test(int i)
{
if (i == 0)
throw new ArgumentOutOfRangeException("i", i, "i can't be 0");
}
public Test(string s): this(int.Parse(s))
{
if (s == null)
throw new ArgumentNullException("s");
}
}
Run Code Online (Sandbox Code Playgroud)
我希望Test(string)构造函数链接Test(int)构造函数,并使用int.Parse().
当然,int.Parse()不喜欢有一个null参数,所以如果s为null,它将在我到达验证行之前抛出:
if (s == null)
throw new ArgumentNullException("s");
Run Code Online (Sandbox Code Playgroud)
这使得检查毫无用处.
如何解决?好吧,我有时习惯这样做:
class Test
{
public Test(int i)
{
if (i == 0)
throw new ArgumentOutOfRangeException("i", i, "i can't be 0");
}
public Test(string s): …Run Code Online (Sandbox Code Playgroud) 我在Watch Window尝试观察任何类型时遇到麻烦,我不断收到错误"类型或命名空间名称'[Type]'在此范围内无效".我必须在监视窗口中提供完整的命名空间以及类型来修复此错误.
这只是任何类型的例子 -
如果我添加一个像new Uri(Location) 手表窗口的手表显示错误.所以我应该包含new System.Uri(Location)它的命名空间.这更令人烦恼.
找到此链接,找到它的项目的代码合同设置导致此问题.禁用运行时合同检查代码合同后,Watch/Quick Watch按预期工作.
项目属性 - >代码合同 - >禁用执行运行时合同检查
启用运行时合同检查代码合同有什么问题?代码合同设置有问题吗?或与项目设置有关?或Visual Studio中的错误?
运行Microsoft代码合同时出现以下错误:
CodeContracts:诊断:无法连接到任何缓存.
code-contracts ×10
c# ×8
.net ×2
.net-4.0 ×2
c#-4.0 ×1
contracts ×1
ide ×1
sql ×1
unit-testing ×1