社区
C#
帖子详情
Class具有MethodTable,那么Struct有没有呢?
树莓派
2010-05-26 12:55:32
如题
...全文
279
13
打赏
收藏
Class具有MethodTable,那么Struct有没有呢?
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
悔说话的哑巴
2010-05-27
打赏
举报
回复
这个基本的概念就没有绝对的定义
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是指函数表,那么我想一定是有的,否则怎么实现访问呢?
不过这都是我的推理。不权威哈。呵呵。
abeniaj0427
2010-05-26
打赏
举报
回复
msdn说结构和类:
http://msdn.microsoft.com/zh-cn/library/2hkbth2a%28VS.80%29.aspx
msdn说对象、类和结构
http://msdn.microsoft.com/zh-cn/library/ms173109%28VS.80%29.aspx
树莓派
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# 反射结构体
struct
的一个坑
本文探讨了在C#中使用反射为值类型(
struct
)和引用类型(
class
)赋值时遇到的问题及解决方案。当尝试直接为
struct
赋值时,由于值类型的特性,赋值操作实际上未生效。文章提供了两种解决方法:一是通过装箱和拆箱过程间接修改值;二是使用FieldInfo的SetValueDirect方法直接修改结构体的字段。
WinDBG深度解析String内存布局与调试实战
本文聚焦于.NET中String对象在CLR中的真实内存布局及其WinDBG调试实践。详细剖析String作为内联存储结构的组成(对象头、
Method
Table
、长度字段及紧随其后的UTF-16字符数据),解释其24字节最小占用、无显式字段设计对SOS命令的影响,以及不可变性在内存分配层面的表现。涵盖四步调试法:内容提取(du)、来源追踪(gcroot+kb+u)、泄漏分析(dumpheap -stat/-min)、Intern机制验证(!internals)。同时揭示String与GC代际(LOH阈值42500字符)、JIT内联、P/Invoke封送等底层交互的关键陷阱。
CLR泛型底层原理:JIT实例化、约束验证与协变机制解析
本文深入解析CLR泛型的底层运行机制,重点阐述JIT如何在运行时为不同泛型参数生成专用代码、泛型约束(如new()、
class
、
struct
)如何作为JIT编译前的类型安全准入检查,以及协变/逆变在委托与接口中的虚表重写本质。内容涵盖IL级泛型签名识别、手动触发JIT实例化的三种硬核手法、泛型元数据结构解析,并结合12个真实故障案例(如泛型类型爆炸、JIT死锁、隐式装箱)揭示常见陷阱与排查路径。
.NET内存六大核心概念:栈堆、值引用类型与装箱拆箱深度解析
在.NET开发中,内存管理是性能与稳定性的底层基石。理解栈与堆的本质区别——前者是CPU寄存器级的零成本、LIFO高速缓存区,后者是GC托管的动态内存池——是掌握运行时行为的前提。值类型与引用类型的语义差异(比特拷贝 vs 地址传递)直接决定线程安全、缓存友好性及对象共享逻辑;而装箱与拆箱并非简单类型转换,实为值类型被迫跨栈入堆的‘跨境开销’,引发额外分配、GC压力与寻址延迟。这些概念共同构成.NET应用的内存交通规则,广泛应用于高频交易、实时日志、微服务API等对延迟与吞吐敏感的场景。本文聚焦真实故障复盘
CLR泛型实例化机制深度解析:从元数据到JIT的全链路运行时行为
本文深入剖析.NET CLR中泛型实例化的运行时机制,覆盖元数据层(GenericParam表、TypeDef签名)、JIT编译层(值类型/引用类型的专用代码生成、GC写屏障差异)及运行时层(Type对象内存布局、Assembly隔离导致的类型不等价)。重点揭示泛型约束检查时机、泛型代码共享优化、栈溢出与跨Assembly类型匹配失败等生产问题根因,并提供ILDASM、PerfView、WinDbg三工具实操验证路径。
C#
111,129
社区成员
642,534
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章