c# – .Net 3.5使用代码约定实现String.IsNullOrWhitespace

我试图在我的.Net 3.5(C#)项目中使用Contracts.我找到了写if的地方(string.IsNullOrEmpty(s)|| string.IsNullOrEmpty(s.Trim()))抛出新的ArgumentException(“Required”,“s”);在方法的开头.

我可以把它们留在那里并使用传统合同.我可以将它改为Contract.Requires(s!= null&& string.IsNullOrEmpty(s.Trim()));.但是,除了不确定空间部分的正确性或表现之外,这些都是蹩脚的(意见).

相反,我试图将条件封装在一个用于合同的方法中.问题是我仍然无法弄清楚如何以声明方式描述空白部分.静态检查器根据我的编写方式发现了几个问题.

我想听听有关数据内容检查的适当性的评论,例如这个用于空白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");

尽管它很复杂,但你可以看到没有提到空白.我已经尝试了几次,但是我无法得到满足静态检查器的工作.

似乎有一些问题阻止我写它,所以我在Code Contracts论坛上提出了一些问题.

我的合同是:

Contract.Ensures(Contract.Result<bool>() ==
                 (s == null || Contract.Exists(s, char.IsWhiteSpace)))
点赞