单声道 - Debug.Assert不起作用

yan*_*han 11 c# mono

我这个程序在这里:

namespace TodoPlus {
using System.Diagnostics;

    public class LameProg {
        public LameProg() {}
        public static void Main(string[] args) {
            int a = 2;
            int b = 3;
            Debug.Assert(a == b, "Bleh");
            System.Console.WriteLine("Haha it didn't work");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不知何故,Debug.Assert无效.

我正在使用Mono 2.10.5,这是我用来编译和执行的:

$ dmcs LameProg.cs

$ mono ./LameProg.exe

我怎样才能做到这一点?我希望它与C中的断言宏具有相同的效果,也就是说它应该彻底崩溃程序.是否可以使用Debug.Assert执行此操作或是否有其他功能可以实现此目的?

谢谢.

dtb*_*dtb 11

  1. Debug.Assert[ConditionalAttribute("DEBUG")]注释.这意味着除非定义了DEBUG预处理程序符号,否则编译器将删除所有调用.试试这个:

    $ dmcs -d:DEBUG LameProg.cs
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当一个断言命中时,Mono没有显示像Microsoft的.NET实现那样的对话框.您需要设置 TraceListener,例如

    $ export MONO_TRACE_LISTENER=Console.Error
    $ mono LameProg.exe
    
    Run Code Online (Sandbox Code Playgroud)

Debug.Assert调用通常用于调试版本,并从发布版本中删除.如果要确保某个条件成立,并且此检查应该存在于发布版本中,请使用if语句和throw异常:

public static void Main(string[] args)
{
    int a = 2;
    int b = 3;
    if (a != b)
    {
        throw new Exception("Bleh");
    }
    System.Console.WriteLine("Haha it didn't work");
}
Run Code Online (Sandbox Code Playgroud)

  • 哦,它看起来像一个邪恶的笑话 - 最终在Mono中唯一Assert的东西,只是一个印刷品.可怕的是,断言应该关闭程序作为致命的东西,但不只是打印出堆栈跟踪. (3认同)