2009-09-02 2 views
1

У меня только небольшой вопрос дизайна.Что будет самым результативным и почему?

Если я получил этот код

public Interface Test 
{ 
    void Xyz(); 

} 


public class1 : WebControl , Test 
{ 
public void XyZ() 
{ 
    // do someting 
} 

public OnLoad() 
{ 
    ((Test)this).Xyz(); 

// or 

    Test ctrl = this as Test; 
    ctrl.Xyz(); 

// or 

    Xyz(); 

} 

} 

ли код будет иметь разницу в производительности? Я думаю, что прямой вызов Xyz() будет быстрее, но я не уверен ((Test)) .Xyz() будет иметь разницу с прямым вызовом.

Ваше мнение об этом или справочная документация.

Благодаря

пса: Я просто whant имеет производительность разницы, нет ответа с ... почему вы хотите бросить или указать интерфейс. Я знаю, что я мог бы просто позвонить прямо мой метод

+2

Напишите код в оба конца. Выйдите из секундомера. Попробуйте это миллион раз в каждом направлении. Тогда вы узнаете ответ! Все, что мы могли бы здесь сказать, это просто * угадать *; единственный способ на самом деле * ответить * вопрос о производительности - это на самом деле * попробуйте * его. –

ответ

7

Я хотел бы надеяться, что компилятор удалит как бросок, так и «как», учитывая, что он может гарантировать, что они оба добьются успеха ... и если этого не произойдет, JIT вполне может это сделать. Вам будет нужен листинг или as оператор, если вы использовали явную реализацию интерфейса, заметьте. В этом случае я бы использовал актерский состав: я лично использовал только as, если это возможно для значения , а не, соответствующего типа (в ситуации, отличной от ошибки).

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

+0

+1 Для упоминания оптимизации JIT. –

+0

Спасибо за ответ. –

3

Вызов метода напрямую, нет необходимости, чтобы бросить this ссылку на тип интерфейса, как реализации метода все еще находится в текущем классе. Если вы применяете класс к типу интерфейса, вы добавляете ненужное косвенное обращение, чтобы получить доступный вам метод.

Я не думаю, что будет огромная разница в производительности (как указывает Джон, JIT, скорее всего, удалит все кастинга, поскольку это не нужно), но для удобства чтения просто вызовите метод напрямую.

Смежные вопросы