Вопросы производительности наследования в C # - PullRequest
9 голосов
/ 06 мая 2011

Создает ли компилятор тот же IL, если я создаю класс с public int I; (или любым другим полем) по сравнению с созданием класса, который наследуется от базового класса с public int I;?

В любом случае результирующий класс ведет себя одинаково, но компилятор ведет себя одинаково?

Т.е., компилятор просто копирует код из базовых классов в производные классы, или он фактически создает два разных объекта класса, когда вы наследуете?

class A
{
    public int I;
}

class B : A
{
}

Есть ли разница в производительности между следующими двумя вызовами DoSomething ()?

var a = new A();
var b = new B();
DoSomething(a.I);
DoSomething(b.I); // Is this line slower than the above line due to inheritance?

Старайтесь игнорировать любые оптимизации, которые компилятор может сделать для этого особого случая. Мой вопрос о том, имеет ли наследование в C # в целом снижение производительности. В большинстве случаев мне все равно, но иногда я хочу оптимизировать фрагмент высокочастотного кода.

1 Ответ

9 голосов
/ 06 мая 2011

То, что испускает компилятор, идентично;действительно, даже при вызове не виртуального метода экземпляра в запечатанном классе он использует Callvirt - то же самое, что и вызов любого метода с полиморфизмом.

И нет: это не copy /paste - код, который вы написали в A, остается частью A.И нет, вы не получаете 2 объекта только из-за наследования.Он сочетает в себе поведение ;экземпляр B также имеет реализацию из A - но не через копирование: a B также и A -то есть Dog также является Mammal и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...