Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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 4.0中的合同_C#_.net_Contracts - Fatal编程技术网

C# C 4.0中的合同

C# C 4.0中的合同,c#,.net,contracts,C#,.net,Contracts,如果我有一个Vector3.Normalize方法,它指定一个post条件,其中结果Vector3的长度为1,编译器将如何在编译时或之前检查它?它只是将一个随机的Vector3变量传递给该方法吗?我非常确定C4.0中的代码收缩将在运行时发生,而不是编译时,并且您需要在调用中实际指定条件。假设Vector3类有一个Length属性,您将得到如下结果: Expects(vector3.Length == 1); 在某种后期编译步骤中,它实际上会遇到一些IL重写,最终会在一次尝试中基本上包装方法体。

如果我有一个Vector3.Normalize方法,它指定一个post条件,其中结果Vector3的长度为1,编译器将如何在编译时或之前检查它?它只是将一个随机的Vector3变量传递给该方法吗?

我非常确定C4.0中的代码收缩将在运行时发生,而不是编译时,并且您需要在调用中实际指定条件。假设Vector3类有一个Length属性,您将得到如下结果:

Expects(vector3.Length == 1);

在某种后期编译步骤中,它实际上会遇到一些IL重写,最终会在一次尝试中基本上包装方法体。最后,后期条件测试在finally块中。

这不是C4.0的一个特性。它是CLR 4.0的一个独立于语言的特性,在IL级别工作。它确实有一些执行静态检查的能力,但不是针对每种情况。它实际上分析了普通编译器为您使用的任何语言生成的IL,找到您在代码中设置的约束,然后查看代码以确定它是否符合约定。至少在我看到的演示中,静态检查是一项可选功能。

一些静态可验证的契约将在编译时进行检查,但像您所说的,这样的情况将在运行时进行检查。谢谢,这是否意味着C可能没有规范语法?就像Linq是一个库,但是C3.0内置了一些Linq关键字。采用规范风格的合同用法是否会与C4.0+相同?根据PDC公告,C4.0肯定没有规范语法“代码契约”是一个纯CLR级别、独立于语言的功能。这符合微软现在的总体战略,即确保大多数功能可以跨所有语言使用。