Debug」タグアーカイブ

C#でソースコードの行番号やファイル名を取得する方法

C++言語では__LINE____FILE__のマクロでソースコードの行番号やファイル名を取得することができます。C#でもこれと同じようなことをしたいと思って方法を調べてみました。

StackFrameを使う方法

using System;
using System.Diagnostics;

public class Example1
{
  public static void Main()
  {
    StackFrame stackFrame = new StackFrame(true);

    int fileLineNumber = stackFrame.GetFileLineNumber();
    string fileName = stackFrame.GetFileName();

    Console.WriteLine($"FileLineNumber: {fileLineNumber}");
    Console.WriteLine($"FileName: {fileName}");
  }
}

実行結果

FileLineNumber: 8
FileName: C:\work\example1.cs

CallerLineNumber/CallerFilePathを使う方法

using System;
using System.Runtime.CompilerServices;

public class Example2
{
  public static void Main()
  {
    test();
  }

  static void test([CallerLineNumber] int lineNumber = 0, [CallerFilePath] string filePath = null)
  {
    Console.WriteLine($"LineNumber: {lineNumber}");
    Console.WriteLine($"FilePath: {filePath}");
  }
}

実行結果

LineNumber: 8
FilePath: C:\work\example2.cs

ファイル名のみを取得したい場合

どちらの方法を使っても取得できるのはファイル名ではなく、ファイルパスになっています。ファイル名のみを取得したい場合はGetFileNameを使うと便利です。

string fileName = System.IO.Path.GetFileName(filePath);

リンク

StackFrame Class (System.Diagnostics) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stackframe?view=net-6.0

System.Runtime.CompilerServices Namespace | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices?view=net-6.0

Conditional属性で高速化

Unity Editorでの開発中やDebug中は実行したいけれど、リリース版では実行したくないという処理はConditional属性を使うと良いそうです。

使い方は次のような感じ。

using System.Diagnostics;
[Conditional("UNITY_EDITOR")]
public void example()
{
  // 実行したい内容
}

#if..#endifと合わせて使ってみようかなと思います。

リンク

Conditional (C# プログラミング ガイド) | Microsoft Docs
https://docs.microsoft.com/ja-jp/previous-versions/visualstudio/visual-studio-2008/4xssyw96(v=vs.90)

【Unity】 UnityEditorの時のみDebug.Logを出す方法
https://qiita.com/toRisouP/items/d856d65dcc44916c487d

ログファイル – Unity マニュアル
https://docs.unity3d.com/ja/current/Manual/LogFiles.html

Unity Editorからのデバッグ時のみ実行するifdef

UNITY_EDITORを使うと、Unity Editorでのデバッグ時のみ実行するコードを書けるようです。

使い方は次のような感じです。

#if UNITY_EDITOR
Debug.log("debug");
#endif

他、UNITY_ANDROIDUNITY_IPHONE等も便利そうです。

リンク

Unity – Platform Dependent Compilation
https://docs.unity3d.com/351/Documentation/Manual/PlatformDependentCompilation.html