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
当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