1. 程式人生 > 其它 >c# dynamic妙用——優化反射

c# dynamic妙用——優化反射

技術標籤:c#反射

假設又以下類Student我們需要反射呼叫裡面的方法GetName

public class Student
{
    public string GetName()
    {
        return "123456";
     }
}

我們這樣使用反射 呼叫程式碼如下所示

 Student student = new Student();
 MethodInfo method = typeof(Student).GetMethod("GetName");
 string studentName = (string)method.Invoke(student, null);

在使用dynamic後 程式碼看上去更簡潔 並且在可控範圍內減少了一次拆箱的機會 程式碼如下

 dynamic student2 = new Student();
 string studentName2 = student2.GetName();

我們可能會對這樣的簡化不以為然 畢竟程式碼看起來並沒有減少多少 但是 如果考慮到效率兼優美兩個特效 那麼dynamic的優勢就顯示出來了 如果對上面的程式碼執行10000000次 如下所示

 int count = 10000000;

 Student student1 = new Student();
 MethodInfo method = typeof(Student).GetMethod("GetName");
 Stopwatch watch = Stopwatch.StartNew();
 for (int i = 0; i < count; i++)
 {
     method.Invoke(student1, null);
 }
 Console.WriteLine("原始反射花費時間: "+ watch.ElapsedMilliseconds);


 dynamic student2 = new Student();
 Stopwatch watch2 = Stopwatch.StartNew();
 for (int i = 0; i < count; i++)
 {
    student2.GetName();
 }
 Console.WriteLine("dynamic花費時間: " + watch2.ElapsedMilliseconds);

執行結果如下

如果執行次數比較少的話 原始反射效率更高 比如我把count變成100 會出現下面結果

總結:反射呼叫非常多的時候 建議dynamic 其它情況還是建議使用原始反射

文章來自《編寫高質量程式碼改善C#程式的157個建議》