【问题标题】:C# version of __FUNCTION__ macro__FUNCTION__ 宏的 C# 版本
【发布时间】:2010-09-20 13:07:21
【问题描述】:

对于 C++ __FUNCTION__ 宏的 C# 版本,是否有人有好的解决方案?编译器似乎不喜欢它。

【问题讨论】:

    标签: c# .net macros


    【解决方案1】:

    尝试改用这个。

    System.Reflection.MethodBase.GetCurrentMethod().Name
    

    C# 没有像 C++ 这样的 __LINE____FUNCTION__ 宏,但有等价物

    【讨论】:

    • 由于这个是顶级并被接受的,您/有人可以添加: System.Reflection.MethodBase.GetCurrentMethod().ToString() 也会产生参数,因此在面对重载和即 System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.ToString() 给 C 命名(&namespace)
    • 有一个#line metadata-macro,用来给出调试信息。编译器会为你注入它们,所以在普通代码中使用时要小心!
    【解决方案2】:

    我目前使用的是这样的函数:

    using System.Diagnostics;
    
    public string __Function() {
        StackTrace stackTrace = new StackTrace();
        return stackTrace.GetFrame(1).GetMethod().Name;
    }
    

    当我需要 __FUNCTION__ 时,我只需调用 __Function() 即可。例如:

    Debug.Assert(false, __Function() + ": Unhandled option");
    

    当然,这个解决方案也使用反射,但它是我能找到的最佳选择。由于我只将它用于调试(而不是在发布版本中进行跟踪),因此对性能的影响并不重要。

    我想我应该做的是创建调试函数并标记它们

    [ Conditional("Debug") ]
    

    相反,但我还没有考虑过。

    感谢 Jeff Mastry 对此的solution

    【讨论】:

    • 异步失败
    【解决方案3】:

    不幸的是,C# 中没有该宏的等效版本。我不认为 GetCurrentMethodName() 解决方案等同于 C++ __FUNCTION__ 宏。即因为 C++ 版本是名称的编译时计算。对于 C#,这是一个运行时计算,会导致性能下降。

    我没有对成本的严重性做出任何假设,但有一个

    【讨论】:

    • 没错,如果有一个编译时解决方案就好了。就我的目的而言,反思就足够了。
    【解决方案4】:

    以下应该可以工作,尽管它将在运行时而不是在编译期间进行评估。

    System.Reflection.MethodBase.GetCurrentMethod().Name
    

    【讨论】:

      【解决方案5】:

      我用这个:

      public static string CallerName([CallerMemberName] string callerName = "")
      {
          return callerName;
      }
      

      用法示例:

      s_log.DebugFormat("{0}", CallerName());
      

      使用它的缺点是每次要打印调用者姓名时,都需要跳转到函数 ==> 耗时&性能下降! 因此,我将它用于调试目的,如果我还需要在生产代码中打印,我通常将函数名称内联到 log.Debug 中,例如:

      s_log.Debug("CallerName");
      

      HTH..

      【讨论】:

        【解决方案6】:

        这是在 .NET 4.5 中添加的。

        在此处查看@roken 的答案:

        Do __LINE__ __FILE__ equivalents exist in C#?

        【讨论】:

          猜你喜欢
          • 2011-06-14
          • 2019-09-18
          • 1970-01-01
          • 2010-10-11
          • 1970-01-01
          • 2011-11-30
          • 2011-01-17
          • 2023-03-09
          • 1970-01-01
          相关资源
          最近更新 更多