当使用'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
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来获取当前对象实例的地址.
| 归档时间: |
|
| 查看次数: |
669 次 |
| 最近记录: |