当使用'this'关键字时,系统如何知道要使用什么?

San*_*box 9 c# this

当使用'this'关键字时,系统如何知道要使用什么?

最近,我在接受采访时被问到这个问题.从来没有想过这个,我回复说,系统将知道控制流的当前上下文,并决定使用的对象而不是这个.面试官看起来并不高兴,他继续谈到下一个问题.

谁能告诉我面试官可能想问什么,答案是什么?(我认为这可以用不同的方式解释,因此保持这个维基,除非有人指出不要......)

Eri*_*ert 13

虽然指出"this"引用基本上作为一个神奇的"隐藏参数"传递给答案的答案基本上是正确的,但实际上C#中的完整故事比初看起来的人要复杂得多.

参考类型很简单; 检查引用的对象是否为null,然后在概念上将其作为一个名为"this" 的未命名的非变量参数传递.这个故事因价值类型而变得复杂.

请记住,根据定义,值类型是按值传递的 - 也就是说,通过制作数据副本来传递.因此他们的名字.但显然可变的值类型 - 纯粹的邪恶并且应该避免 - 不能通过值作为"this"传递,因为如果你调用mutator,mutator方法中的"this"将改变副本,而不是原本的!

因此,在值类型的方法调用中,"this"不是接收器的,它是表示接收器的存储位置的变量的别名.我们通过将"this"作为接收者的管理地址而不是接收者的来实现这一点.

现在我们可以提出另一个困难.如果存储被突变值的变量是只读变量怎么办?现在我们做什么?如果你很好奇,请阅读我关于这个主题的文章,看看你能否正确回答所提出的难题:

http://blogs.msdn.com/ericlippert/archive/2008/05/14/mutating-readonly-structs.aspx

  • 感谢你的智慧之言O Great One ....现在请出去实施新的语言功能,这将使我们的集体思想受到打击 (3认同)

Jor*_*ira 12

this关键字是指向当前对象.类的所有非静态成员函数都可以访问this指针.

编译器通常使用寄存器(通常为ECX)在非静态成员函数中提供指向当前对象的指针.因此,当您this在非静态成员函数中编写时,编译器会将该调用转换为从ECX加载地址.

看看这个简单的例子:

A t;
t.Test();
004114DE  lea         ecx,[t] 
004114E1  call        std::operator > (41125Dh) 

在调用非静态成员函数之前Test(),编译器使用[t]加载寄存器ECX(变量t的地址 - 将this在Test方法中).

004114DE  lea         ecx,[t]

在函数内部,它可以使用ecx来获取当前对象实例的地址.

  • 因为它是C#,所以更简单的CIL是合适的. (2认同)

Aar*_*lla 9

this 是对象的所有方法中的隐藏参数,并包含实例指针的副本.