您在c#代码中如何以及在何处使用断言?

时间:2009-02-19 14:20:33

标签: c#

我需要知道在c#中使用断言的方式和位置的示例。

编辑我需要最适合使用断言的实际示例。这就是为什么我需要使用它们的人的例子

9 个答案:

答案 0 :(得分:2)

前一段时间对Debug.Assert()的使用进行了很好的讨论:Debug.Assert vs Exceptions

答案 1 :(得分:2)

我非常想通过使用Debug.Assert()甚至Debug.Fail()来支持调试期间的异常处理:

if( !whatever_I_expect )
{
  var message = "<exception message>";
  Debug.Fail( message );
  throw new InvalidOperation( message );
}

这样我就可以得到Debug.Assert()的非常方便的对话框,可以在ignore,retry和abort之间进行选择。重试将进入我可以开始调试的代码。 特别是递归方法或复杂的try-catch构造可以通过这种方式更好地调试。你总是得到正确的调用堆栈。在我的发布代码中,我仍然有一个没有消息框的有效错误处理。

答案 2 :(得分:0)

我能想到的直接答案是你在测试代码的时候:

Assert.IsNotNull(yourVariable);

您也可以使用Debug.Assert

System.Diagnostics.Debug.Assert(myBooleanProperty);

答案 3 :(得分:0)

Google应该为您提供大量示例(提示:输入csharp示例断言)

http://en.csharp-online.net/Assert

答案 4 :(得分:0)

我更喜欢使用单元测试来充实问题。由于我的主要产品是库/汇编,因此还必须确保验证参数并抛出适当的异常。

有趣的提示:Debug.Assert()在发布版本中被MS C#编译器捕获并被删除。

答案 5 :(得分:0)

当然是在单元测试中。

外部单元测试我可以识别3种类型的错误(非常简化):

  1. 严重的内部错误:来自代码单元内部的东西,用户无法影响。
  2. 滥用某些功能:例如,给出null而不是某个值
  3. 外部问题:如不存在的文件,没有网络连接等
  4. 我认为断言应仅适用于第一个断言。应使用适当的例外处理第二和第三。

答案 6 :(得分:0)

我经常使用Debug.Assert来检查代码的前提条件。如果一个对象依赖于另一个存在的对象,我可能断言这个其他对象不是例如。这甚至在我将程序交给测试之前就会出现很多问题。

我希望通过单元测试检查的内容与我想在运行时使用断言检查的内容之间存在细微差别。通常单元测试用于在应用程序的其余部分处于良好定义的状态时测试单个代码单元(我广泛使用模拟对象)并且我在运行时使用debug.assert检查应用程序的状态是否为我期待。

答案 7 :(得分:0)

有不同的观点(参见comp.lang.c ++中最近的子线程。主持,主题为“我们不使用C ++异常”)。

我认为,除非实现不一致,否则断言最好检查并记录您知道不可能是错误的内容。这比前置条件和不变量更强。

E.g。一个辅助函数只能从几个不同的地方调用,它有一个可用的资源。因为这个帮助器是私有的,只在一个类中使用,抛出ArgumentException是不合适的(那是公共/受保护的接口)。

答案 8 :(得分:0)

我在代码中使用了Debug.Assert(),它应该永远不会收到错误/无效的参数 - 输入参数和因变量的代码类型已经过验证。事实是,我知道我会犯错误。我只是不知道在哪里。 :-)司法使用“Debug.Assert”可以帮助我应对我的不完善之处。

以下是我自己的代码中的示例:

    public bool AddPoint(uint time, object value)
    {
        bool success = false;
        int index = 0;

        Debug.Assert(_selectedParameterName != null, "RecipeBusinessObject.InsertPointAtTime() _selectedParameterName = null");
        Debug.Assert(_currentRecipe != null, "RecipeBusinessObject.InsertPointAtTime() _currentRecipe = null");          
        Debug.Assert(CurrentParameterTable != null, "RecipeBusinessObject.InsertPointAtTime() CurrentParameterTable = null");

        Debug.Assert(index >= 0, "RecipeBusinessObject.InsertPoint(), index out of range, index = " + index.ToString());
        Debug.Assert(index <= CurrentParameterTable.Rows.Count, "RecipeBusinessObject.InsertPoint(), index out of range, index = " + index.ToString());

        DataRow newRow = CurrentParameterTable.NewRow();

        <snip>