2012-03-30 11 views
6

W celu dostosowania testów jednostkowych i szyderstwa powszechną praktyką jest deklarowanie metod i właściwości jako wirtualnych. Czy występuje efekt deklarowania czegoś wirtualnego jako podobnego do nie-wirtualnego?Wpływ metod wirtualnych na wydajność

+0

Myślisz _design dla testability_ właśnie czyni wszystko 'virtual' i wszystkich klasach' open'? Hmm ... –

+0

@StefanHanke: Nie widzę niczego, co sugerowałoby, że OP myśli, że to * właśnie * to. –

+0

Tak, myślę, że nie powinno się tego robić, gdy nie jest to konieczne ... To tylko jeden środek, który może poprawić testowalność, gdy jest to odpowiednie. – TGH

Odpowiedz

9

Zasadniczo różnica polega na tym, że metody wirtualne są wywoływane za pomocą kodu operacyjnego Callvirt, podczas gdy metody wirtualne nie używają standardowego kodu wywoławczego. Call Opcodes są zdecydowanie szybsze od Callvirt, ale nigdy nie udało mi się znaleźć tak blisko, by uzasadnić podejmowanie decyzji projektowych w oparciu o to.

Premature optimization is the root of all evil.

+0

IIRC, kompilator C# użyje CallVirt dla wszystkich metod instancji, niezależnie od tego, czy są wirtualne. W ten sposób CLR przeprowadza kontrolę nieważności. –

+0

@JohnSkeet Czy to oznacza, że ​​pod koniec dnia naprawdę nie ma różnicy? – TGH

+0

Dobra racja John - masz rację, z wyjątkiem metod instancji typu wartości, które moim zdaniem - dla których kompilator emituje Opcodes.Call. – Jeff

1

Nie, nie bardzo.

Nie jest to coś, co zauważysz.

1

Nie znam szczegółów, ale wiem, że nie trzeba się martwić o to 99% aplikacji tam.

btw - Jeśli zdecydujesz się na symulowanie interfejsów zamiast klas, nie będziesz potrzebować metod wirtualnych.

Powodzenia Tom

+0

Masz taką samą "karę" zwodniczą z interfejsem jako metodą wirtualną. – leppie

Powiązane problemy