[英].Net 3.5 Implementation of String.IsNullOrWhitespace with Code Contracts
我正在尝试在.Net 3.5(C#)项目中使用合同。 我发现我在哪里写过类似if (string.IsNullOrEmpty(s) || string.IsNullOrEmpty(s.Trim())) throw new ArgumentException("Required", "s");
在方法开始时。
我可以将其保留在那里并使用旧合同。 我可以将其更改为Contract.Requires(s!= null && string.IsNullOrEmpty(s.Trim()));
。 但是除了对条件的空白部分的正确性或性能不是很确定之外,这些都是la脚的(意见)。
相反,我尝试将条件封装在可用于合同的方法中。 问题是我仍然不知道如何声明性地描述空白部分。 静态检查器会根据我的编写方式找到几个问题。
我想听听有关数据内容检查是否适当的评论,例如针对空格AS WELL AS的正确定义。
public static class str
{
[Pure]
public static bool IsNullOrWhitespace(string s)
{
Contract.Ensures(s != null || Contract.Result<bool>());
Contract.Ensures((s != null && !Contract.ForAll<char>(s, c => char.IsWhiteSpace(c))) || Contract.Result<bool>());
if (s == null) return true;
for (var i = 0; i < s.Length; i++)
{
if (!char.IsWhiteSpace(s, i))
{
Contract.Assume(!Contract.ForAll<char>(s, c => char.IsWhiteSpace(c)));
return false;
}
}
return true;
}
}
这可能草率,但是我的最初实验方法在这里。 关于a,b和c的断言失败或未经证实。
static void Test()
{
string a = null;
string b = "";
string c = " ";
string d = "xyz";
string e = " xyz ";
if (!str.IsNullOrWhitespace(a))
{
Contract.Assert(a != null);
a = a.Trim();
}
if (!str.IsNullOrWhitespace(b))
{
Contract.Assert(b != null && b != "");
b = b.Trim();
}
if (!str.IsNullOrWhitespace(c))
{
Contract.Assert(c != null && c != " ");
c = c.Trim();
}
if (!str.IsNullOrWhitespace(d))
{
d = d.Trim();
}
if (!str.IsNullOrWhitespace(e))
{
e = e.Trim();
}
}
这是.NET 4的内置合同:
Contract.Ensures(
(Contract.Result<bool>() && ((str == null) || (str.Length == 0)))
? ((bool) true)
: ((Contract.Result<bool>() || (str == null))
? ((bool) false)
: ((bool) (str.Length > 0)))
, null, "Contract.Result<bool>() && (str == null || str.Length == 0) ||\r\n!Contract.Result<bool>() && str != null && str.Length > 0");
尽管它很复杂,但您可以看到没有提及空格。 我已经尝试了几次,但是无法满足静态检查器的要求。
似乎有一些问题使我无法编写它,因此我在“代码合同”论坛上提出了一些问题。
我的合同是:
Contract.Ensures(Contract.Result<bool>() ==
(s == null || Contract.Exists(s, char.IsWhiteSpace)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.