或阿呆のブログ

Pythonを好んで使っているプログラマです。Ruby,Perl,PowerShell,VBAなどでもたまに書いています。最近はスロット放浪記やってます。。

C#でファイル名や行数やメソッド名を取得する。

C++で言うところの、__LINE__とか__FILE__に相当するものは、C#には無い。プリプロセッサが無いから・・・。確かに、マクロって時にバグを生じさせやすいものだけれども、システムがデバッグ用のこういったマクロとかが無いのは不便。

C#では、System.Diagnosticsを使えば、一応はファイル名や行数やメソッド名を取得出来る。ただ、これはスタックトレースを利用したものであるため、パフォーマンス的にはあまりよろしくない。また、main内で呼び出すと、取得出来なかったりする。

ということで、新しいファイルを作成して、そこでSystem.Diagnosticsを使って、ファイル名や行数やメソッド名を取得してみた。

Sample Code(サンプルコード)

こっちがMain

using System;
using System.Collections;
using System.Collections.Generic;
namespace Test
{
    class Program
    {       
        static void Main(string[] args)
        {
            test t = new test();
        }

    }
}

こっちが、デバッグ用のクラス

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace Test
{
    class test
    {
        public test()
        {
            StackFrame sf = new StackFrame(1, true);
            Debug.WriteLine(sf.GetMethod().ToString());
            Debug.WriteLine(sf.GetFileName());
            Debug.WriteLine(sf.GetFileLineNumber());
        }
    }
}

Result(実行結果)

Void Main(System.String[])
C:\Users\One-shot life\Documents\Visual Studio 2010\Projects\TEST\Test\Test\Program.cs
14

見ていただければわかるように、

ここが呼び元を出力している。

Debug.WriteLine(sf.GetMethod().ToString());

ここがファイル名を出力している。呼び元のね・・・。

Debug.WriteLine(sf.GetFileName());

ここがライン数を出力している。呼び元のね・・・。

Debug.WriteLine(sf.GetFileLineNumber());


めんどうくせぇ・・・。どうせコンパイラ言語なんだから、マクロ用意しろやと。何かと便利で危ない機能を提供しているC#ではあるが、ここんとこが堅い。