导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

Class具有MethodTable,那么Struct有没有呢?

树莓派 2010-05-26 12:55:32
如题
...全文
122 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
这个基本的概念就没有绝对的定义
回复
softman11 2010-05-27
[Quote=引用 11 楼 visualbasic2000 的回复:]
引用 10 楼 softman11 的回复:

引用 5 楼 visualbasic2000 的回复:
引用 3 楼 softman11 的回复:

引用楼主 visualbasic2000 的回复:
如题


.net里面的struct实现机制和Class是一样的,只是传送的一个是按值一个是按引用传递。
因此struct里面自然有mothodtable

你的意思是Str……
[/Quote]

是不是类我认为只是一种说法,本质还是看内部实现机制。
结构如果通过new分配的话,行为和类是完全一样的,是可以用反射获得相关信息的。
但是如果不是用new分配的话,是不可以用反射的。

因此我认为内部实现机制确实是内机制。
这个只有问微软实现这个人才知道真实答案,如果你有相关资料,贴出来,我也看哈。

至于其他那些书中所说,不可全信。
回复
树莓派 2010-05-26
[Quote=引用 10 楼 softman11 的回复:]

引用 5 楼 visualbasic2000 的回复:
引用 3 楼 softman11 的回复:

引用楼主 visualbasic2000 的回复:
如题


.net里面的struct实现机制和Class是一样的,只是传送的一个是按值一个是按引用传递。
因此struct里面自然有mothodtable

你的意思是Struct的TypeHandler也是放在线程栈上面的……
[/Quote]

据我看到的资料是New的Struct也不是类,实例化时,class要使用new关键字;而struct可以不使用new关键字,如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引用未赋值的字段会导致编译错误。

谢谢您的讨论。。。。。
回复
softman11 2010-05-26
[Quote=引用 5 楼 visualbasic2000 的回复:]
引用 3 楼 softman11 的回复:

引用楼主 visualbasic2000 的回复:
如题


.net里面的struct实现机制和Class是一样的,只是传送的一个是按值一个是按引用传递。
因此struct里面自然有mothodtable

你的意思是Struct的TypeHandler也是放在线程栈上面的,然后指向该类型的Struct的放在Load堆上的Metho……
[/Quote]

struct是在堆栈上分配,CLASS是在堆上分配。
你如果说的mothdtable是指Vtab,那么struct自然没有。因为struct不支持虚函数,自然不需要vtab

但是这个也不是一成不变的吧。结构变量也可以通过new 来分配。
通过new分配的结构实际上就是一个类。自然也有函数表了,可以通过反射来证明了

所以如果你说的methodtable是指函数表,那么我想一定是有的,否则怎么实现访问呢?

不过这都是我的推理。不权威哈。呵呵。
回复
树莓派 2010-05-26
C#中,放入继承的虚方法,引入的虚方法,实方法,静态方法,组成一个方法链
回复
兔子党-顾问 2010-05-26
我只知道虚函数表。不知道函数表。
c++下的知识,所有的类成员函数(c#下叫方法)都是静态的,不同的是,非静态方法,默认有一个this参数。
struct不支持多态,所以不需要虚函数表,每个struct的方法都是固定的。
class可以使用virtual,abstract关键字,创建虚函数,虚函数的实现就是依赖虚函数表,如果没有虚函数,就不需要函数表,我是这样理解的。可能.net下别名不同。应该就是virtual methods table的意思。
回复
树莓派 2010-05-26
mothodtable只能放虚方法吗?其他方法放在什么地方呢?
回复
树莓派 2010-05-26
[Quote=引用 3 楼 softman11 的回复:]

引用楼主 visualbasic2000 的回复:
如题


.net里面的struct实现机制和Class是一样的,只是传送的一个是按值一个是按引用传递。
因此struct里面自然有mothodtable
[/Quote]
你的意思是Struct的TypeHandler也是放在线程栈上面的,然后指向该类型的Struct的放在Load堆上的MethodTable?
有没有资料,还是想象的?
回复
树莓派 2010-05-26
有没有高手从CLR的角度上解释一下。
不是不知道Class和Structure的区别,是想知道内部方法管理机制。谢谢。
回复
softman11 2010-05-26
[Quote=引用楼主 visualbasic2000 的回复:]
如题
[/Quote]

.net里面的struct实现机制和Class是一样的,只是传送的一个是按值一个是按引用传递。
因此struct里面自然有mothodtable
回复
兔子党-顾问 2010-05-26
只有类才可以实现多态,多态的实现是靠这个虚函数表实现的。struct不存在虚函数。所以没有虚函数表。
http://www.cnblogs.com/lbq1221119/archive/2008/03/14/1106428.html
这里有个介绍。不是很贴切,但是能说明原理。
回复
wuyq11 2010-05-26
class可以声明无参构造函数,可以声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数
interface IPerson
{
void GetSex();
}
struct Family: IPerson
{
public string name;
//不可以包含显式的无参构造函数和析构函数
public Family(string name)
{
this.name = name;
}

//不可以实现protected、virtual、sealed和override成员
public void GetSex()
{

}

public void ShowPerson()
{
}

//可以重载ToString虚方法
public override string ToString()
{
return String.Format("{0}", person.Name);
}
}
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.