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

    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. Но в данном случае объект будет в нулевом поколении, сборка такого объекта почти бесплатна.

    Вывод: используйте статические классы для хелперов.
    Ответ написан
    2 комментария