成员函数的疑问

booirror 2017-04-22 07:22:11
C#的成员函数里,可以使用this,那么这个this是如何传递的呢

在c++中,设置回调函数时,需要同时传递成员函数和object。
但在C#中,却只需要传递成员函数,

难道C#和c++实现this的方式不一样?
...全文
299 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
booirror 2017-04-27
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
而不是什么低级的“之争地址” --> 而不是什么低级的“指针地址” 比如说一个人,低级的说法可以说人都是“一块肉”而已。但是这个说法并不能准确说明人的真实的本质。
瞎扯什么,函数怎么会属于一个对象,按你这样实现,一个没有成员变量的对象的size都会很大。 合理的实现是每个对象只需要一个指针指向函数区。 换句话说,要回调一个成员函数,就需要把对象指针传给函数,这样才能在函数里使用对象的其他成员。 C#也没有黑魔法,delegate之所以不需要传object,是因为C#编译器替你做了这件事,而C++编译器没有做。
  • 打赏
  • 举报
回复
而不是什么低级的“之争地址” --> 而不是什么低级的“指针地址” 比如说一个人,低级的说法可以说人都是“一块肉”而已。但是这个说法并不能准确说明人的真实的本质。
  • 打赏
  • 举报
回复
delegate 引用的是一个独立封装的对象,而不是什么低级的“之争地址”。所以我们经常说“不要拿c语言的指针概念来直接当作 .net 的引用”就是这个意思。如果把 .net 的引用的机制说成低级语言实现机制,就会产生你这个问题。
  • 打赏
  • 举报
回复
你的逻辑是 c++ 的逻辑概念。 c# 的逻辑概念是“本质上来说,函数就应该属于某个对象”,你的理论是 c++ 理论而不是c#理论。编译器来产生相关代码,例如编译出来的汇编语言在调用函数之前首先压入对象引用,在调用函数之后额外弹出对象引用,于是编译器就实现了这个理念。所以c# 编译器比 c++ 编译器高级、优雅。 这是语言设计问题,语言的底层才是汇编实现。 “表达式obj.func,从语法上来看,包含了对象和函数,从语义上来看,这个函数也应该包含对象宿主”,能够保证语法跟语义更语用的统一,而不是说一套做一套地脱节,这才是真正优雅的语言,这就是 c# 比 c++ 好的地方。
booirror 2017-04-24
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
C#的delegate会自动转换为对应的函数指针,这个是clr实现的。
不是很明白你的意思,首先我只是传递了成员函数,但在函数里却可以使用对象的数据。理论上,函数不属于某个对象,所有对象使用的应该是同一块函数代码。那么C#回调是如何获得对象的呢,表达式obj.func,从语法上来看,包含了对象和函数,从语义上来看,这只是个函数。
  • 打赏
  • 举报
回复
你可以这样认为,c++ 更接近 c# 的低级的编译之后的部分,而不是对应 c# 的。
  • 打赏
  • 举报
回复
相对来说,c# 才是更加真正面向对象的,它的“函数指针”本身就包含object,而不是什么底层 c 语言指针概念。 如果说到底层,例如 .net 汇编语言层,可能“差不多”。但是 c# 语言层比 c++ 高级、安全、表现力强,更优雅!
孤独的海啊 2017-04-24
  • 打赏
  • 举报
回复
不都是指针吗,C++叫指针,C#叫ref 其实都是一个内存地址而已。指向这个实例的地址。管他怎么实现。
threenewbee 2017-04-23
  • 打赏
  • 举报
回复
C#的delegate会自动转换为对应的函数指针,这个是clr实现的。
wang_peng_yl 2017-04-22
  • 打赏
  • 举报
回复
为什么要问这个呢,你要写论文还是遇到别的困难了。这是等于问1+1为什么等于2,当然是有原因的,只是不是我们应用者应该研究的范畴,那是大学那些所谓教授去研究研究的。
xuggzu 2017-04-22
  • 打赏
  • 举报
回复
c#和c++用法区别不大,this用法也差不多。楼主估计想太复杂了。
stherix 2017-04-22
  • 打赏
  • 举报
回复
引用
在c++中,设置回调函数时,需要同时传递成员函数和object。 但在C#中,却只需要传递成员函数,
没觉得有什么区别 只是如果是在本类中,就没必要带this或者object,因为this是隐含的 觉得有不同,就举个例子看看

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧