C# Make Assert 打印表达式被断言

C# Make Assert Print Expression Being Asserted

Debug.Assert失败时,它会显示一个非常无用的错误: Assertion failed

这可以改进以至少获得一些关于错误位置的信息,例如函数名称、文件和行号,如下所示:

public static void MyAssert(bool expr,
    [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
    [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
    [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
    string message = $"Assertion failed in {memberName} ({sourceFilePath}:{sourceLineNumber})";
    Debug.Assert(expr, message);
}

这很有帮助,但真正酷的是能够看到调用者想要断言的表达式,如下所示:

public static void MyAssert(bool expr,
    [PreviousCallerArgumentAsString] string argument)  /* wish this worked */
{
    string message = $"Assertion '{argument}' failed";
    Debug.Assert(expr, message);
}

我只是过渡到 C#,但在 C++ 中,这可以使用这样的宏来完成:

#define ASSERT(Expr) Debug.Assert(Expr, "Assertion " #Expr " failed.")

ASSERT(1 + 1 == 3);
/* would expand to */
Debug.Assert(1 + 1 == 3, "Assertion 1 + 1 == 3 failed.");

在我的代码中,我非常自由地使用断言,必须重新输入表达式会大大降低你的速度。

有没有办法在 C# 中实现类似的功能?

你走运了!此功能是 implemented in C# 10, using [CallerArgumentExpression]

例如:

public static class Debug
{
    public static void Assert(bool condition, [CallerArgumentExpression("condition")] string message = null)
    {
        if (!condition)
        {
            Console.WriteLine($"Assert failed! {message}");
        }
    }
}

搭配使用时:

Debug.Assert(true == false);

打印:

Assert failed! true == false

See it on SharpLab.