Tag: 代码 合同

可以让代码分析理解代码合同吗?

在组合使用代码分析和代码合同时,我会收到很多警告 CA1062 :Microsoft.Design:在外部可见方法’Foo.Bar(Log)’中,在使用之前validation参数’log’。 在Foo.Bar中,我有一个validationlog的合同。 public Bar(Log log) { Contract.Requires(log != null); log.Lines.Add(…); // … } 有没有办法让FxCop理解代码合同?

实现接口时,通过属性确保未经证实

我正在尝试对我来说,似乎是一些相当基本的代码合同代码。 我把它减少到了下面的问题。 以下内容未通过消息进行静态分析 CodeContracts:确保未经证实:this.Frozen using System; using System.Diagnostics.Contracts; namespace PlayAreaCollection2010 { public class StrippedContract : IBasic { private bool _frozen = false; public void Freeze() { _frozen = true; } public bool Frozen { get { return _frozen; } } } [ContractClass(typeof(IBasicContract))] public interface IBasic { void Freeze(); bool Frozen { get; } } [ContractClassFor(typeof(IBasic))] […]

代码合同:为什么有些不变量不在课堂之外考虑?

考虑这种不可变类型: public class Settings { public string Path { get; private set; } [ContractInvariantMethod] private void ObjectInvariants() { Contract.Invariant(Path != null); } public Settings(string path) { Contract.Requires(path != null); Path = path; } } 这里要注意两件事: 有一个契约不变量,它确保Path属性永远不能为null 构造函数检查path参数值以遵守先前的合约不变量 此时, Setting实例永远不能具有null Path属性。 现在,看看这种类型: public class Program { private readonly string _path; [ContractInvariantMethod] private void ObjectInvariants() { Contract.Invariant(_path […]

自定义代码合同exception消息

我有一个代码合同表示为 – 它validation要存储的实体不为空并且对持久性有效。 有用。 晶圆厂。 [ContractClassFor(typeof(IRepository))] internal abstract class ContractsForIRepository : IRepository where T : IEntity { private ContractsForIRepository() { } public T Persist(T entity) { Contract.Requires(entity != null, “Entity is null”); Contract.Requires(entity.IsValidForPersistence(), “Entity not valid for persistence”); return default(T); } } 但是,我希望exception更有用 – 因为任何接收消息的人都想知道哪个实体是无效的,看起来是什么样的。 所有实体都重写ToString(),所以我想在错误消息中包含它: Contract.Requires(entity.IsValidForPersistence(), “Entity not valid for persistence ” + entity.ToString()); […]

抛出exception与Contract.Requires ?

我想知道是否应该抛出exception或调用Contract.Requires 例如: public static void Function(String str) { if (str == null) throw new ArgumentNullException(“str”, “Input string cannot be null.”); // … } VS public static void Function(String str) { Contract.Requires(str != null, “Input string cannot be null.”); // … } 由于Contract.Requires不需要CONTRACTS_FULL符号,我也可以将它保留在我的发布版本中。 这是我的考虑: Con:您无法调用自定义exception类型构造函数的重载版本。 根本没有办法将其他参数传递给构造函数。 Pro:静态工具支持(例如通知调用者违反合同)。 我应该使用哪一种,以及哪种情况?