我注意到在C#中,與C++不同,您可以將虛擬方法和泛型方法結合使用。例如:C#方法多態與泛型的性能
using System.Diagnostics;
class Base {
public virtual void Concrete() {Debug.WriteLine("base concrete");}
public virtual void Generic<T>() {Debug.WriteLine("base generic");}
}
class Derived : Base {
public override void Concrete() {Debug.WriteLine("derived concrete");}
public override void Generic<T>() {Debug.WriteLine("derived generic");}
}
class App {
static void Main() {
Base x = new Derived();
x.Concrete();
x.Generic<PerformanceCounter>();
}
}
考慮到任何數量的Generic<T>
版本可以被實例化,它看起來並不像標準vtbl
方法可以用來解決方法調用,實際上它不是。下面是生成的代碼:似乎根據通用參數,尋找一個動態的vtbl,然後調用到它
x.Concrete();
mov ecx,dword ptr [ebp-8]
mov eax,dword ptr [ecx]
call dword ptr [eax+38h]
x.Generic<PerformanceCounter>();
push 989A38h
mov ecx,dword ptr [ebp-8]
mov edx,989914h
call 76A874F1
mov dword ptr [ebp-4],eax
mov ecx,dword ptr [ebp-8]
call dword ptr [ebp-4]
額外的代碼。有沒有人寫過關於這個實現的細節?與非一般情況相比,它的表現有多好?
正是我在找的,謝謝! – zildjohn01 2010-05-27 10:41:20