我们使用Debug.Assert
向开发人员发出代码中的问题。我想添加错误发生的行号但不是硬代码,因为这可能会改变,我们会忘记更新字符串。
添加错误的行号会很方便。有什么想法吗?
答案 0 :(得分:8)
默认情况下,Debug.Assert
已包含堆栈跟踪信息:
当应用程序在用户界面模式下运行时,它会显示一个消息框,显示带有文件和行号的调用堆栈。
示例:
如果您在断言对话框中没有看到文件名或行号,则PDB文件(作为编译的一部分生成)将丢失或无法访问。 PDB文件包含文件和行调试信息。
在C#中没有真正等效的C / C ++的__FILE__
和__LINE__
魔术宏,但是如果您仍然希望在断言对话框之外使用此信息,则可以使用StackTrace
上课得到它。这要求您提供调试信息(上面提到的PDB文件)。由于您可能正在使用它进行开发,因此这是一个安全的要求。
using System.Diagnostics;
namespace Managed
{
class Program
{
static void Main(string[] args)
{
AssertWithCallSite(false, "Failed!");
}
[Conditional("DEBUG")]
static void AssertWithCallSite(bool condition, string message)
{
if (!condition)
{
var callSite = (new StackTrace(1, true)).GetFrame(0);
string fileName = callSite.GetFileName();
int lineNumber = callSite.GetFileLineNumber();
string assertMessage = string.Format(
"Assert at {0}:{1}:\n{2}",
fileName,
lineNumber,
message
);
Debug.Assert(false, assertMessage);
}
}
}
}
答案 1 :(得分:2)
看看Whats the equivalent of LINE and FILE in C#。
string currentFile=new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName();
int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber();
请务必查看上面的文章,因为有一些需要注意的注意事项。
答案 2 :(得分:1)
是的,这是可能的。请查看StackTrace
命名空间中的StackFrame
和System.Diagnostics
。
示例强>
static string GetDiagnosticsInformationForCurrentFrame()
{
StackTrace st = new StackTrace(new StackFrame(true));
StackFrame sf = st.GetFrame(1); // we want the frame from where this method was called
return String.Format("File: {0}, Method: {1}, Line Number: {2}, Column Number: {3}", sf.GetFileName(), sf.GetMethod().Name, sf.GetFileLineNumber(), sf.GetFileColumnNumber());
}
...
Debug.Assert(true, "Unexpected error occurred at " + GetDiagnosticsInformationForCurrentFrame());
编辑正如克里斯指出的那样,你不能拥有Conditional
的回复类型。我已经改变了我的答案,以便GetDiagnosticsInformationForCurrentFrame
始终可用。
答案 3 :(得分:1)
C#6.0,UAP个应用。这很好用
public static void Assert(bool val, string message, [CallerFilePath] string file = "", [CallerMemberName] string memberName = "", [CallerLineNumber] int lineNumber = 0)
{
string msg = String.Format($"File: {file}, Method: {memberName}, Line Number: {lineNumber}\n\n{message}");
Debug.Assert(val, msg);
}