Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ';合同设计';在C中#_C#_Design By Contract - Fatal编程技术网

C# ';合同设计';在C中#

C# ';合同设计';在C中#,c#,design-by-contract,C#,Design By Contract,我想在我最新的C#应用程序中尝试一下契约式设计,并希望语法类似于: public string Foo() { set { Assert.IsNotNull(value); Assert.IsTrue(value.Contains("bar")); _foo = value; } } 我知道我可以从单元测试框架中获得这样的静态方法,但我想知道这样的东西是否已经内置到语言中,或者是否已经有某种框架在浮动。我可以编写自己的断言函数,只

我想在我最新的C#应用程序中尝试一下契约式设计,并希望语法类似于:

public string Foo()
{
    set {
        Assert.IsNotNull(value);
        Assert.IsTrue(value.Contains("bar"));
        _foo = value;
    }
}

我知道我可以从单元测试框架中获得这样的静态方法,但我想知道这样的东西是否已经内置到语言中,或者是否已经有某种框架在浮动。我可以编写自己的断言函数,只是不想重新发明轮子。

除了使用外部库之外,系统中还有一个简单的断言。诊断:

using System.Diagnostics

Debug.Assert(value != null);
Debug.Assert(value == true);
我知道这不是很有用。

是一种流行的方法,它允许一些DBC构造,比如检查post和前置条件。例如,二进制搜索可以通过前置和后置条件以及循环不变量来实现

公共静态int-BinarySearch(int[]!a,int-key)
需要用于所有{inti in(0:a.Length),intj in(i:a.Length);a[i]用于所有{inti in(0:a.Length);a[i]!=key};
{
int低=0;
int高=a.长度-1;
而(低您可能需要查看:

使用系统;
使用nVentive.伞形图验证;
使用nVentive.umber.Extensions;
名称空间
{
公共静态类StringValidationExtensionPoint
{
公共静态字符串包含(此ValidationExtensionPoint vep,字符串值)
{
if(vep.ExtendedValue.IndexOf(value,StringComparison.InvariantCultureIgnoreCase)=-1)
抛出新的ArgumentException(String.Format(“必须包含“{0}.”,value));
返回vep.ExtendedValue;
}
}
班级
{
私人字符串(u foo),;
公共字符串Foo
{
设置
{
_foo=value.Validation()
.NotNull(“Foo”)
.Validation()
.包含(“条”);
}
}
}
}
我希望验证扩展是构建器,这样您就可以做
\u foo=value.Validation().NotNull(“foo”).Contains(“bar”).value;
,但它就是这样(幸运的是,它的开源使它成为一个构建器是一个微不足道的变化)

作为替代方案,你可以

最后,支持对其扩展数据块和字段的限制,这将转换为T-SQL验证和具有功能验证测试的CLR类(尽管Oslo离发布还有很长一段时间).

。我认为这非常简洁明了。它表达了我在代码中实现契约式设计检查时的想法

e、 g

我认为通过合同检查来表达设计是一种很好的方式

C#4.0代码合同 Microsoft在.net framework的4.0版中发布了一个契约式设计库。该库最酷的功能之一是,它还附带了一个静态分析工具(我想类似于FxCop),它利用了您在代码上放置的契约的细节

以下是一些Microsoft资源:

以下是一些其他资源:

对于我当前的项目(2010年2月与2008年相比),我选择了

很简单,它只是运行时验证,没有任何奇怪的复杂性,您不需要从一些“奇怪的”基类派生,没有AOP,VS集成,这在一些开发人员工作站上不起作用,等等


简单胜过复杂。

在.net Fx 4.0中有一个答案:

系统诊断。合同


最直接的方法,也是在.NET Framework中使用的方法,是:

public string Foo()
{
    set {
        if (value == null)
            throw new ArgumentNullException("value");
        if (!value.Contains("bar"))
            throw new ArgumentException(@"value should contain ""bar""", "value");

        _foo = value;
    }
}

这将在发布版本中编译出来。是的,如果在调试中。*它们是从发布版本中编译出来的。这种方法的唯一问题是检查仍在运行时进行。我知道编译器无法在编译时验证所有内容。但假设您需要
x!=null
,然后调用
f(null)
,编译器可能会警告用户某些地方不正常。Spec的问题在于它绑定到IDE。幸运的是,我使用的是4.0,因为System.Diagnostics.Contracts正是我想要的。Attributes+code.Awesome。这应该是答案。Debug.Assert?这不是DbC。但是任何代码契约支持都会消失NET 5.0版:你应该改变你接受的答案。作为一名亡灵巫师,我很抱歉,但是如果你不想强迫所有人安装ccrewrite.exe和所有的jazz,Moq的守卫类就是完美的。
using System;
using nVentive.Umbrella.Validation;
using nVentive.Umbrella.Extensions;

namespace Namespace
{
    public static class StringValidationExtensionPoint
    {
        public static string Contains(this ValidationExtensionPoint<string> vep, string value)
        {
            if (vep.ExtendedValue.IndexOf(value, StringComparison.InvariantCultureIgnoreCase) == -1)
                throw new ArgumentException(String.Format("Must contain '{0}'.", value));

            return vep.ExtendedValue;
        }
    }

    class Class
    {
        private string _foo;
        public string Foo
        {
            set
            {
                _foo = value.Validation()
                    .NotNull("Foo")
                    .Validation()
                    .Contains("bar");
            }
        }
    }
}
public void Foo(Bar param)
{
   Guard.ArgumentNotNull(param);
} 
Contract.Requires(newNumber > 0, “Failed contract: negative”);
Contract.Ensures(list.Count == Contract.OldValue(list.Count) + 1);
public string Foo()
{
    set {
        if (value == null)
            throw new ArgumentNullException("value");
        if (!value.Contains("bar"))
            throw new ArgumentException(@"value should contain ""bar""", "value");

        _foo = value;
    }
}