Refresher of IL explains "this pointer" in C#
2007-11-19 14:26
351 查看
这篇文章里,用il语言解释一下static方法和non-static方法在调用的时候,堆栈顶部传递参数的不同形式。
首先看一段代码:
class TestClass
{
public static readonly int i = 10;
static void Main(string[] args)
{
TestClass testClass = new TestClass();
TestStatic();
testClass.NonStatic();
}
public static void TestStatic()
{
}
public void NonStatic()
{
}
}
反编译以后得到:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 21 (0x15)
.maxstack 1
.locals init ([0] class TestConcoleApp.TestClass testClass)
IL_0000: nop
IL_0001: newobj instance void TestConcoleApp.TestClass::.ctor()
IL_0006: stloc.0
IL_0007: call void TestConcoleApp.TestClass::TestStatic()
IL_000c: nop
IL_000d: ldloc.0
IL_000e: callvirt instance void TestConcoleApp.TestClass::NonStatic()
IL_0013: nop
IL_0014: ret
} // end of method TestClass::Main
首先,关于this pointer,可以参考ibm的文档:
http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr035.htm
注意蓝色的这一行。这一行说明了一个问题,在使用static方法和non-static方法的时候,static方法并不pass this pointer到stack中去。而non-static方法确需要传递一个instance的reference到stack中去。
因为,在
IL_0001: newobj instance void TestConcoleApp.TestClass::.ctor()
IL_0006: stloc.0
指令中,存储了新实例化的一个变量到loc.0中去了,然后在调用static方法的时候,堆栈的顶部是没有obj的reference的。而调用non-static方法的时候,需要传递一个obj的reference到堆栈的顶部去。
如果大家想继续深入了解为什么static方法不需要传递一个obj的reference,可以参考compile time 和 run time的区别,下面是一篇ibm的文档:
http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/proguide/ref/cvfltar.htm
首先看一段代码:
class TestClass
{
public static readonly int i = 10;
static void Main(string[] args)
{
TestClass testClass = new TestClass();
TestStatic();
testClass.NonStatic();
}
public static void TestStatic()
{
}
public void NonStatic()
{
}
}
反编译以后得到:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 21 (0x15)
.maxstack 1
.locals init ([0] class TestConcoleApp.TestClass testClass)
IL_0000: nop
IL_0001: newobj instance void TestConcoleApp.TestClass::.ctor()
IL_0006: stloc.0
IL_0007: call void TestConcoleApp.TestClass::TestStatic()
IL_000c: nop
IL_000d: ldloc.0
IL_000e: callvirt instance void TestConcoleApp.TestClass::NonStatic()
IL_0013: nop
IL_0014: ret
} // end of method TestClass::Main
首先,关于this pointer,可以参考ibm的文档:
http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr035.htm
注意蓝色的这一行。这一行说明了一个问题,在使用static方法和non-static方法的时候,static方法并不pass this pointer到stack中去。而non-static方法确需要传递一个instance的reference到stack中去。
因为,在
IL_0001: newobj instance void TestConcoleApp.TestClass::.ctor()
IL_0006: stloc.0
指令中,存储了新实例化的一个变量到loc.0中去了,然后在调用static方法的时候,堆栈的顶部是没有obj的reference的。而调用non-static方法的时候,需要传递一个obj的reference到堆栈的顶部去。
如果大家想继续深入了解为什么static方法不需要传递一个obj的reference,可以参考compile time 和 run time的区别,下面是一篇ibm的文档:
http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/proguide/ref/cvfltar.htm
相关文章推荐
- currval of sequence "follow_id_seq" is not yet defined in this session
- One of the disks in this virtual machine is already in use by a virtual machine or by a snapshot"
- 全局变量和局部变量重复之this.name.toString());Exception in thread "main" java.lang.NullPointerException
- Error (167005): Can't assign I/O pad "GX_TX" to PIN_AG27 because this causes failure in the placement of the other atoms in its associated channel
- Database cannot be started in this edition of SQL Server" error when restoring a Microsoft Dynamics CRM database
- [TypeScript] Catch unsafe use of "this" in TypeScript functions
- "Your computer could not be joined to the domain. You have exceeded the maximum number of computer accounts you are allowed to create in this domain. Contact your system administrator to have this limit reset or increased."
- Refresher of IL explains "this pointer" in C#
- Exception in thread "main" NoNodeAvailableException[None of the configured nodes are available: [{#t
- Mysql:This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
- (C#) A demo on how to auto fill out the "account" value in log in web page in "WebBrowser" control.
- VMware Workstation "This virtual machine appears to be in use.
- mysql error This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery
- ASP.NET中aspx页面runat="server"的本质(Essensial of runat=”server” in ASP.NET)
- Exception in Thread "HouseKeeper" Java.lang.NullPointerException
- This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in
- This version of the rendering library is more recent than your version of ADT plug-in. Please update
- Eclipse迅速执行:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
- idea报 Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: PermGen space
- "Error: ANDROID_HOME is not set and "android" command not in your PATH. You must fulfill at least one of these conditions.".