Ho notato in C#, a differenza del C++, è possibile combinare metodi virtuali e generici. Per esempio:Prestazioni del polimorfismo del metodo C# con i generici
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>();
}
}
Dato che qualsiasi numero di versioni di Generic<T>
potrebbe essere istanziato, ma non sembra che l'approccio standard vtbl
potrebbe essere utilizzato per risolvere chiamate di metodo, e in effetti non lo è. Ecco il codice generato:
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]
Il codice aggiuntivo sembra essere alla ricerca di un vtbl dinamica secondo i parametri generici, e quindi chiamando in esso. Qualcuno ha scritto sulle specifiche di questa implementazione? Quanto bene si comporta rispetto al caso non generico?
Esattamente quello che stavo cercando, grazie! – zildjohn01