Задать вопрос
@AlekseenkoAV

Где оптимальнее размещать методы общего назначения в структуре или классе?

У нас на работе коллега задал такой вопрос, почему не размещают в структурах методы общего пользования (так сказать хелперы), он предполагает, что вызов метода структуры быстрее, чем у ссылочного объекта, так как вызов метода структуры идет прямым вызовом к IL коду, в отличии от ссылочного объекта и нет затрат на уборщик мусора, ведь структура будет создана в стеке. Хотя на практике я лично ничего такого не встречал. Мне это напомнило библиотеку ffmpeg со структурами, описывающими кодеки.
  • Вопрос задан
  • 286 просмотров
Подписаться 2 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 3
lexxpavlov
@lexxpavlov
Программист, преподаватель
Код:
class MyClass
{
    public void Test()
    { }
    public static void TestStatic()
    { }
}

struct MyStruct
{
    public void Test()
    { }
    public static void TestStatic()
    { }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass.TestStatic();
        MyStruct.TestStatic();

        var c = new MyClass();
        c.Test();
        var s = new MyStruct();
        s.Test();
    }
}


IL-код:
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       43 (0x2b)
  .maxstack  1
  .locals init ([0] class ClassOrStructApp.MyClass c,
           [1] valuetype ClassOrStructApp.MyStruct s)
  IL_0000:  nop
  IL_0001:  call       void ClassOrStructApp.MyClass::TestStatic()
  IL_0006:  nop
  IL_0007:  call       void ClassOrStructApp.MyStruct::TestStatic()
  IL_000c:  nop
  IL_000d:  newobj     instance void ClassOrStructApp.MyClass::.ctor()
  IL_0012:  stloc.0
  IL_0013:  ldloc.0
  IL_0014:  callvirt   instance void ClassOrStructApp.MyClass::Test()
  IL_0019:  nop
  IL_001a:  ldloca.s   s
  IL_001c:  initobj    ClassOrStructApp.MyStruct
  IL_0022:  ldloca.s   s
  IL_0024:  call       instance void ClassOrStructApp.MyStruct::Test()
  IL_0029:  nop
  IL_002a:  ret
} // end of method Program::Main


Анализ: Вызовы статического метода класса или структуры идентичны. Вызовы обычных методов класса и структуры похожи, но не идентичны. Дополнительно, для создания объекта его нужно создавать в куче и собирать коллектором мусора.

Результат: если вызывается статический метод, то разницы нет. Если метод обычный, не статический, то некоторая разница имеется, но в основном - в том, что объект нужно будет собирать ненужный объект в GC. Но в данном случае объект будет в нулевом поколении, сборка такого объекта почти бесплатна.

Вывод: используйте статические классы для хелперов.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Конечно, в структуре, т.к. не резервируется память на объект, потому что его нет.
Класс обычно нужен для промежуточного сохранения состояний данного объекта(ов).
Т.е. фактически класс - это динамическая структура.
Ответ написан
petermzg
@petermzg
Самый лучший программист
Методы классов или структур это обычные функции, которые имеют скрытый параметер на инстанс класса/структуры. Так что нет разницы по скорости доступа. С виртуальными функциями почти также.

Если показать образно, то это так:
class MyClass
{
   public void Test();
}
// равнозначно
void Test(MyClass hiddenThis);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы