最近看到一篇文章內一句話,引發我的好奇心所以來驗證一下跟我的想像的是不是一致。

“nameof運算式(執行期間不會有任何作用)”

Be Careful About Enum Performance Trap

  • C# 程式碼
using System;

namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine(Season.Summer.ToString());
            Console.WriteLine(nameof(Season.Summer));
        }
    }

    internal enum Season
    {
        Spring,
        Summer,
        Fall,
        Winter
    }
}

Source Code

  • 執行結果
    Summer
    Summer
    
  • 反組譯 DLL
// ConsoleApp1.Program
using System;

private static void Main(string[] args)
{
	Console.WriteLine(Season.Summer.ToString());
	Console.WriteLine("Summer");
}
  • 結論 nameof 在編譯後會轉換成字串,因此執行時期不在需要額外的運算資源,因此有較佳的效能。類似的作法還有在 const 也有出現。

  • 同場加映

  • C# 程式碼

using System;

namespace ConsoleApp2_const
{
    internal class Program
    {
        private int var_normal = 1;
        private readonly int var_readonly = 2;
        private const int var_const = 3;

        private static void Main(string[] args)
        {
            new Program().Print();
        }

        private void Print()
        {
            Console.WriteLine(var_normal);
            Console.WriteLine(var_readonly);
            Console.WriteLine(var_const);
        }
    }
}

Source Code

  • 執行結果
    1
    2
    3
    
  • 反組譯 DLL
// ConsoleApp2_const.Program
using System;

private void Print()
{
	Console.WriteLine(var_normal);
	Console.WriteLine(var_readonly);
	Console.WriteLine(3);
}