c# dynamic妙用——優化反射
阿新 • • 發佈:2021-01-09
假設又以下類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個建議》