代码之家  ›  专栏  ›  技术社区  ›  Joan Venge

如何为C中的对象实例提供此关键字?

  •  2
  • Joan Venge  · 技术社区  · 16 年前

    当您在C中有一个对象实例时,可以使用 this 实例范围内的关键字。编译器如何处理它?运行时对此有帮助吗?

    我主要想知道它与Python中的C相比,您必须手动为每个函数提供自我。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Reed Copsey    16 年前

    无论您是否指定,编译器总是创建使用类名设置字段的IL。这个 this. 是可选的,除非您的作用域中有另一个与实例变量同名的变量,在这种情况下,编译器知道设置实例变量。

    例如,如果在testproject命名空间中有一个名为testclass的类,并且它包含一个名为testone的字段,那么请执行以下操作:

    TestClass(string value) // Constructor
    {
        this.testOne = value;
    }
    

    像这样编译成IL:

    L_0000: ldarg.0
    // ... other initialization stuff 
    L_0004: ldarg.1
    L_0005: stfld string TestProject.TestClass::testOne
    

    无论是否指定了“this”,实例变量始终使用完整的类信息进行设置。


    编辑评论:

    在C中,您可以在方法中使用它作为关键字,因为参数列表中的第一个参数是“this”,即使没有指定它。例如,假设我们使用这样的方法:

    class Test
    {
        void TestMethod(Test instance) { 
           // Do something
        }
        void CallTestMethod() {
            TestMethod(this);
        }
    

    当您查看calltestmethod的IL时,它将如下所示:

    .method public hidebysig instance void CallTestMethod() cil managed
    {
        .maxstack 8
        L_0000: nop 
        L_0001: ldarg.0 
        L_0002: ldarg.0 
        L_0003: call instance void CSharpConsoleApplication.Test::TestMethod(class CSharpConsoleApplication.Test)
        L_0008: nop 
        L_0009: ret 
    }
    

    在这种情况下,编译器将加载 ldarg.0 在堆栈上两次,这将成为传递给testmethod的参数(它将成为 ldarg.1 )基本上,在任何类方法中,内部都有一个“this”。

        2
  •  3
  •   JaredPar    16 年前

    在clr级别支持此功能。槽0处的参数变量表示“this”指针。C基本上会将此调用生成为ldarg.0

    推荐文章