有没有办法在C#代码中检索当前的源文件名和亚麻,并在控制台输出中打印该值?喜欢C中的 LINE 和 FILE
请告知。
非常感谢
答案 0 :(得分:68)
Anders Hejlsberg presented new API for that in BUILD keynote:
打印当前文件名,方法名称和行号
private static void Log(string text,
[CallerFilePath] string file = "",
[CallerMemberName] string member = "",
[CallerLineNumber] int line = 0)
{
Console.WriteLine("{0}_{1}({2}): {3}", Path.GetFileName(file), member, line, text);
}
测试:
Log(".NET rocks!");
输出:
Program.cs_Main(11):.NET摇滚!
这里发生了什么?
您使用optional
参数定义方法,并使用special attributes修饰它们。如果你调用方法而不传递实际参数(保留默认值) - Framework
会为你填充它们。
答案 1 :(得分:33)
这个答案已经过时了!有关最新信息,请参阅@taras的答案。
没有常数:(
你可以做的事情更加丑陋:
string currentFile = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName();
int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber();
仅在PDB文件可用时才有效。
答案 2 :(得分:1)
您可以使用System.Diagnostics命名空间中的StackTrace对象,但只有PDB文件存在时才能使用该信息。
默认情况下,为Debug和Release构建生成PDB文件,唯一的区别是Debug设置为生成完整的调试信息,其中Release版本设置为仅生成pdb(full / pdb-only)。
Console.WriteLine(new StackTrace(true).GetFrame(0).GetFileName());
Console.WriteLine(new StackTrace(true).GetFrame(0).GetFileLineNumber());
答案 3 :(得分:1)
截至目前,没有为此定义常量。
.NET的做法是使用StackTrace类。
但它仅适用于Debug版本。因此,如果您使用它,您可以在
之间使用StackTrace获取代码#if DEBUG
//your StackTrace code here
#endif
您可以在以下Stackoverflow线程中阅读有关在DEBUG与RELEASE版本中使用#if预处理器的信息。
C# if/then directives for debug vs release
编辑:如果您仍然需要发布版本中的此调试信息,请阅读Stackoverflow上的以下答案:
Display lines number in Stack Trace for .NET assembly in Release mode
答案 4 :(得分:1)
如果你想要更多的内部细节,但你没有特别需要文件名和行号,你可以这样做:
System.Diagnostics.Debug.Print(this.GetType().ToString() + " My Message");
这比打印文件名更有优势,因为如果将它放在父类中,它将打印出实际运行代码的子类名。
答案 5 :(得分:0)
如果您想编写自己的 Debug.Assert 版本,那么这里有一个更完整的答案:
// CC0, Public Domain
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System;
public static class Logger {
[Conditional("DEBUG")]
public static void Assert(bool condition, string msg,
[CallerFilePath] string file = "",
[CallerMemberName] string member = "",
[CallerLineNumber] int line = 0
)
{
// Debug.Assert opens a msg box and Trace only appears in
// a debugger, so implement our own.
if (!condition)
{
// Roughly follow style of C# error messages:
// > ideone.cs(14,11): error CS1585: Member modifier 'static' must precede the member type and name
Console.WriteLine($"{file}({line}): assert: in {member}: {msg}");
// Or more precisely match style with a fake error so error-parsing tools will detect it:
// Console.WriteLine($"{file}({line}): warning CS0: {msg}");
}
}
}
class Program {
static void Main(string[] args) {
Logger.Assert(1+1 == 4, "Why not!");
}
}