Здравствуйте, enji, Вы писали:
E>Читаю книжку по C#, там пример:
E>class A {
E> public static T max<T>(T a, T b) where T : IComparable<T>
E> {
E> return a.CompareTo(b) > 0 ? a : b;
E> }
E> public static int maxInt(int a, int b)
E> {
E> return a > b ? a : b;
E> }
E>}
E>правильно ли я понимаю, что при вызове A.max(4, 5) будет выполнена упаковка, а потом вызвана виртуальная функция CompareTo ? Т.е. метод A.maxInt эффективнее? Или я не прав?
Всё очень просто. Надо скомпилировать ваш пример, после чего посмотреть результат рефлектором. В примере, что неудивительно, мы обнаружим
L_000a: callvirt instance int32 [mscorlib]System.IComparable`1<!!T>::CompareTo(!0)
что, как-бы, должно обозначать боксинг. Но обратим внимание и на строчку перед этим:
L_0004: constrained !!T
L_000a: callvirt instance int32 [mscorlib]System.IComparable`1<!!T>::CompareTo(!0)
Документация относительно данной инструкции говорит следующее:
When a callvirt method instruction has been prefixed by constrained thisType, the instruction is executed as follows:
…
If thisType is a value type and thisType implements method then ptr is passed unmodified as the 'this' pointer to a call method instruction, for the implementation of method by thisType.
Но так далеко можно было бы не забираться. Достаточно прочесть на этом сайте статью
Нововведения в C# 2.0Автор(ы): Владислав Чистяков (VladD2)
Дата: 24.06.2004
В статье рассказывается о новшествах, которые должны появиться в новой версии языка C#
, где практическит в самом начале разобран аналогичный пример и объеснено, что боксинга при таком вызове не будет.
Здравствуйте, enji, Вы писали:
E>Читаю книжку по C#, там пример:
E>E>class A {
E> public static T max<T>(T a, T b) where T : IComparable<T>
E> {
E> return a.CompareTo(b) > 0 ? a : b;
E> }
E> public static int maxInt(int a, int b)
E> {
E> return a > b ? a : b;
E> }
E>}
E>
E>правильно ли я понимаю, что при вызове A.max(4, 5) будет выполнена упаковка, а потом вызвана виртуальная функция CompareTo ? Т.е. метод A.maxInt эффективнее? Или я не прав?
1) Упаковки при вызове CompareTo не будет (ссылка на экземпляр интерфейса никуда не передается).
2) Второй метод эффективнее хотябы потому что не использует CompareTo.
Читаю книжку по C#, там пример:
class A {
public static T max<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) > 0 ? a : b;
}
public static int maxInt(int a, int b)
{
return a > b ? a : b;
}
}
правильно ли я понимаю, что при вызове A.max(4, 5) будет выполнена упаковка, а потом вызвана виртуальная функция CompareTo ? Т.е. метод A.maxInt эффективнее? Или я не прав?
Здравствуйте, _FRED_, Вы писали:
_FR>Но так далеко можно было бы не забираться. Достаточно прочесть на этом сайте статью Нововведения в C# 2.0Автор(ы): Владислав Чистяков (VladD2)
Дата: 24.06.2004
В статье рассказывается о новшествах, которые должны появиться в новой версии языка C#
, где практическит в самом начале разобран аналогичный пример и объеснено, что боксинга при таком вызове не будет.
Раздел "Статьи" прошел мимо меня. А там много интересного
Спасибо!
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>