Код:
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. Но в данном случае объект будет в нулевом поколении, сборка такого объекта почти бесплатна.
Вывод: используйте статические классы для хелперов.