Где оптимальнее размещать методы общего назначения в структуре или классе?
Код: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. Но в данном случае объект будет в нулевом поколении, сборка такого объекта почти бесплатна.Вывод: используйте статические классы для хелперов.
Методы классов или структур это обычные функции, которые имеют скрытый параметер на инстанс класса/структуры. Так что нет разницы по скорости доступа. С виртуальными функциями почти также.
Если показать образно, то это так:class MyClass
{
   public void Test();
}
// равнозначно
void Test(MyClass hiddenThis);