Re: вопрос по дженерикам
От: _FRED_ Черногория
Дата: 31.10.10 15:24
Оценка: 22 (2)
Здравствуйте, 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#

    , где практическит в самом начале разобран аналогичный пример и объеснено, что боксинга при таком вызове не будет.
    Help will always be given at Hogwarts to those who ask for it.
    Re: вопрос по дженерикам
    От: hardcase Пират http://nemerle.org
    Дата: 30.10.10 17:35
    Оценка: +1
    Здравствуйте, 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.
    /* иЗвиНите зА неРовнЫй поЧерК */
    вопрос по дженерикам
    От: enji  
    Дата: 30.10.10 17:28
    Оценка:
    Читаю книжку по 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 эффективнее? Или я не прав?
    Re[2]: вопрос по дженерикам
    От: enji  
    Дата: 08.11.10 06:54
    Оценка:
    Здравствуйте, _FRED_, Вы писали:

    _FR>Но так далеко можно было бы не забираться. Достаточно прочесть на этом сайте статью Нововведения в C# 2.0
    Автор(ы): Владислав Чистяков (VladD2)
    Дата: 24.06.2004
    В статье рассказывается о новшествах, которые должны появиться в новой версии языка C#

    , где практическит в самом начале разобран аналогичный пример и объеснено, что боксинга при таком вызове не будет.


    Раздел "Статьи" прошел мимо меня. А там много интересного Спасибо!
    ... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.