Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# Pex和代码合同_C#_Code Contracts_Pex - Fatal编程技术网

C# Pex和代码合同

C# Pex和代码合同,c#,code-contracts,pex,C#,Code Contracts,Pex,以下是Pex文档pexandcontracts.pdf中的代码示例。我意识到这不是一个特定于pex的问题,而是与代码契约有关,而是来自pex教程的代码 namespace CodeDigging { public class StringExtension { public static string TrimAfter(string value, string suffix) { // <pex>

以下是Pex文档pexandcontracts.pdf中的代码示例。我意识到这不是一个特定于pex的问题,而是与代码契约有关,而是来自pex教程的代码

namespace CodeDigging
{
    public class StringExtension
    {
        public static string TrimAfter(string value, string suffix)
        {
            // <pex>
            Contract.Requires(!string.IsNullOrEmpty(suffix));
            // </pex>
            Contract.Requires(value != null);
            Contract.Ensures(!Contract.Result<string>().EndsWith(suffix));

            int index = value.IndexOf(suffix);
            if (index < 0)
                return value;                  // (1) First possible contract violation
            return value.Substring(0, index);  // (2) second possible contract violation
        }
    }
}
命名空间代码挖掘
{
公共类扩展
{
公共静态字符串TrimAfter(字符串值、字符串后缀)
{
// 
Contract.Requires(!string.IsNullOrEmpty(后缀));
// 
Contract.Requires(值!=null);
Contract.Contract(!Contract.Result().EndsWith(后缀));
int index=value.IndexOf(后缀);
如果(指数<0)
返回值;//(1)第一次可能违反合同
返回值。子字符串(0,索引);//(2)第二个可能的合同冲突
}
}
}
静态验证器提供以下警告:

CodeContracts:确保未经验证:!Contract.Result().EndsWith(后缀)位于第(1)点和第(2)点


我的问题是,如何着手解决这个问题?根据pex勘探,不存在违反合同的可能性。(…有吗?

您最好的选择是使用
契约。假设当静态检查器无法验证表达式时,


你会在很多地方不得不使用
契约。如果你试图获得零静态检查警告,假设你的程序很琐碎,因为大多数.Net库还没有契约,所以我不会担心。大多数情况下,拥有清晰的代码和一组良好的单元测试比没有合同警告要好。也就是说,保持“曲线”处于启用状态,以便在编码时验证警告是否为假阳性。

您最好使用
契约。假设静态检查器无法验证表达式时使用


你会在很多地方不得不使用
契约。如果你试图获得零静态检查警告,假设你的程序很琐碎,因为大多数.Net库还没有契约,所以我不会担心。大多数情况下,拥有清晰的代码和一组良好的单元测试比没有合同警告要好。这就是说,请打开Squiggles,以便在编码时验证警告是否为假阳性。

我认为这是对契约的不当使用。确保,因为担保相当复杂,不可能很容易输入到以后的文档中。我更倾向于提供非空性和长度(即不超过原始值字符串)的保证!相反,带有条件的EndsWith应该是测试的断言,Pex可以用它来指导其探索。

我认为这是对合同的拙劣使用。确保,因为担保相当复杂,不可能很容易融入到以后的需求中。我更倾向于提供非空性和长度(即不超过原始值字符串)的保证!相反,带有条件的EndsWith应该是测试的断言,Pex可以用它来指导其探索。

是的,有可能违反合同。请记住,默认情况下,
IndexOf
EndsWith
使用特定于区域性的比较,这有时可能会产生令人惊讶的行为。如果我写

TrimAfter("\u0301a\u0301a", "\u0301a")
然后,
IndexOf
与第一次出现的字符不匹配,因为它认为中间的字符是单个的
'á'
,所以
索引
2
,方法返回
“\u0301a”
,显然以后缀结尾

如果您想要证明正确的算法,请使用
StringComparison.Ordinal


但是,代码契约静态检查器目前不支持对字符串值的分析,并且不理解索引of子字符串之间的这种关系

是的,有可能违反契约。请记住,默认情况下,
IndexOf
EndsWith
使用特定于区域性的比较,这有时可能会产生令人惊讶的行为。如果我写

TrimAfter("\u0301a\u0301a", "\u0301a")
然后,
IndexOf
与第一次出现的字符不匹配,因为它认为中间的字符是单个的
'á'
,所以
索引
2
,方法返回
“\u0301a”
,显然以后缀结尾

如果您想要证明正确的算法,请使用
StringComparison.Ordinal

但是,代码契约静态检查器目前不支持字符串值的分析,并且不理解IndexOfSubstring

之间的这种关系,我倾向于同意(因此我的问题的原因)。请提供一个示例实现,我将标记您的答案是否正确。尽管如此,还是要感谢你的意见。我倾向于同意(这就是我提出问题的原因)。请提供一个示例实现,我将标记您的答案是否正确。谢谢你的意见。