C# Pex和代码合同
以下是Pex文档pexandcontracts.pdf中的代码示例。我意识到这不是一个特定于pex的问题,而是与代码契约有关,而是来自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>
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
但是,代码契约静态检查器目前不支持字符串值的分析,并且不理解IndexOf
和Substring
之间的这种关系,我倾向于同意(因此我的问题的原因)。请提供一个示例实现,我将标记您的答案是否正确。尽管如此,还是要感谢你的意见。我倾向于同意(这就是我提出问题的原因)。请提供一个示例实现,我将标记您的答案是否正确。谢谢你的意见。