从类的对象直接访问类中的方法
本文关键字:方法 访问 对象 | 更新日期: 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");
}
}
唯一的区别是你的第一个代码使用stloc
和ldloc
来解决堆栈问题,第二个代码没有。
编译后应该是相同的,除非您稍后在某个地方使用该实例。然而,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模式下构建的。