1. 程式人生 > >C#中使用System.Diagnostics.ConditionalAttribute移除無用函式呼叫

C#中使用System.Diagnostics.ConditionalAttribute移除無用函式呼叫

在以往的開發中,我們通常會使用如下程式碼來限定除錯性日誌的作用範圍:

public class XXXDebugger
{
    public static void Log(object message)
    {
#if UNITY_EDITOR
        UnityEngine.Debug.Log(message);
#endif
    }
}

然後在實際呼叫的時候同樣需要新增判斷來防止函式呼叫的開銷:

public class YYY
{
    public void Execute()
    {
#if UNITY_EDITOR
        XXXDebugger.Log("Test");
#endif
    }
}

這樣其實非常的麻煩,假如呼叫時候沒有(或者忘了)加判斷,那麼其實依然存在一個空函式呼叫的憑白開銷:

public class ZZZ
{
    public void Execute()
    {
        XXXDebugger.Log("Test");
    }
}

使用ConditionalAttribute可以讓編譯器在條件不滿足時自動移除該函式及對其的呼叫,相當方便:

public class XXXDebugger
{
    [Conditional("UNITY_EDITOR")]
    public static void Log(object message)
    {
        UnityEngine.Debug.Log(message);
    }
}

public class YYY
{
    public void Execute()
    {
        XXXDebugger.Log("Test");
    }
}

這樣在非編輯器模式下,不但Log這個函式不存在,對其的呼叫也一併沒有了。簡潔清爽,簡直是處女座的最愛。