从类的对象直接访问类中的方法

本文关键字:方法 访问 对象 | 更新日期: 2023-09-27 18:08:18

如果一个类只有一个方法,而且这个方法很少被调用,那么就不要像下面这样以传统的方式调用这个方法

RarelyCalledClass orarelyCalled = new RarelyCalledClass();
orarelyCalled.rarelyCalledMethod();

可以这样调用吗

(new RarelyCalledClass()).rarelyCalledMethod();

这会提高性能吗?因为编译器必须做更少的操作。

从类的对象直接访问类中的方法

将是完全相同的性能和代码。只是你不能再在代码中访问实例了。而且可读性也更差(在我和大多数人看来)。

也是你总是应该记住的:过早的微优化是邪恶的

配置您的应用程序。这是一个真正的瓶颈吗?没有?那就别麻烦了

这将提高性能,因为编译器必须做的更少操作?

。我不这么认为。

我相信你可以用任何反编译器检查他们的IL代码,你也会看到同样的东西。

第一个IL代码;

  .locals init ([0] class _1.RarelyCalledClass orarelyCalled)
  IL_0000:  nop
  IL_0001:  newobj     instance void _1.RarelyCalledClass::.ctor()
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  callvirt   instance void _1.RarelyCalledClass::rarelyCalledMethod()
  IL_000d:  nop
  IL_000e:  ret

秒1 IL码;

  .maxstack  8
  IL_0000:  nop
  IL_0001:  newobj     instance void _1.RarelyCalledClass::.ctor()
  IL_0006:  call       instance void _1.RarelyCalledClass::rarelyCalledMethod()
  IL_000b:  nop
  IL_000c:  ret

基于此结构;

static void Main(string[] args)
{
    //
}
}
class RarelyCalledClass
{
    public RarelyCalledClass()
    {
    }
public void rarelyCalledMethod()
{
    Console.WriteLine("Test");
}
}

唯一的区别是你的第一个代码使用stlocldloc来解决堆栈问题,第二个代码没有。

编译后应该是相同的,除非您稍后在某个地方使用该实例。然而,ILSpy显示出差异:

第一个版本(作业)

.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
    // Method begins at RVA 0x2058
    // Code size 13 (0xd)
    .maxstack 1
    .entrypoint
    .locals init (
        [0] class ConsoleApplication1.TestClass obj
    )
    IL_0000: newobj instance void ConsoleApplication1.TestClass::.ctor()
    IL_0005: stloc.0
    IL_0006: ldloc.0
    IL_0007: callvirt instance void ConsoleApplication1.TestClass::TestMethod()
    IL_000c: ret
} // end of method Program::Main

第二版(不赋值)

.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
    // Method begins at RVA 0x2058
    // Code size 11 (0xb)
    .maxstack 8
    .entrypoint
    IL_0000: newobj instance void ConsoleApplication1.TestClass::.ctor()
    IL_0005: call instance void ConsoleApplication1.TestClass::TestMethod()
    IL_000a: ret
} // end of method Program::Main

都是在Release模式下构建的。