c# getresponsestream返回byte[]_C++模版和C#范型求同存异录(一)sizeof(T)

sizeof(T)

从C++的模板代码往C#代码移植的时候发现了一个小问题。

在C++模板代码中 sizeof(T)是一种有效的写法,最终在会编译器展开成sizeof(int),sizeof(float)或者sizeof(myclass),然后在运行时这个代码是有效的,能够执行的。于是我们看上去就可以计算在运行时计算T的大小,并分配内存。

但是在C#的范型代码中,sizeof(T)无法编译过的,因为无法确认T是什么的情况下,T的大小是无法计算的,于是C#编译器是不认的。

按C#提供的规范,sizeof只能在不安全的代码中使用,操作的参数是非托管类型。

# 非托管类型sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool
任何枚举类型
任何指针类型
任何用户定义的 struct 类型,只包含非托管类型的字段,并且在 C# 7.3 及更早版本中,不是构造类型(包含至少一个类型参数的类型)

那么在C#的泛型类里面,该如何进行sizeof(T)操作?

然后我开始尝试着在.net的开源代码里面寻找答案

OK,一下子找到两个Unsafe.SizeOfMarshal.SizeOf

Unsafe.SizeOf

Unsafe.SizeOf 属于 CompilerServices,继续挖掘代码,最后得到了一段IL Code

 .method public hidebysig static int32 SizeOf<T>() cil managed aggressiveinlining{.custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = ( 01 00 00 00 ).maxstack 1sizeof !!Tret} // end of method Unsafe::SizeOf

OK,这是 IL语言,我们就看自己关心的sizeof

 #IL Code 说明sizeof 将提供的值类型的大小(以字节为单位)推送到计算堆栈上。)

OK,UnsafeSizeOf
只有值类型的大小

Console.WriteLine(Unsafe.SizeOf<myclass>().ToString());

不管我怎么改变myclass的内容,结果都是8,所以,这个不能随便用,只能用在值类型上了。

结合C#的文档,我蛮怀疑关键字sizeof要么是调用了Unsafe.Sizeof函数,要么就是直接转换成了IL Code的sizeof。但没什么依据,我没在.net的源代码里找到这一点。

Marshal.SizeOf

这个属于 System.Runtime.InteropServices,是.net 和COM互操作的时候用的。

这个函数挖掘代码之后是到了一些cpp代码,基本路径是这样的

Marshal.SizeOf->SizeOfHelper->MarshalNative::SizeOfClass->GetNativeSize()

Marshal.SizeOf->SizeOfHelper是C#代码

GetNativeSize()是用C++代码实现的,两边怎么焊接的我就不管了,这个暂时不关心。

最后

 BOOL GetNativeSize() const{LIMITED_METHOD_CONTRACT;return m_cbNativeSize;}

返回了一个m_cbNativeSize;

OK,我们实际测试下

Console.WriteLine(Marshal.SizeOf<myclass>().ToString());

直接报错了,因为不是一个非托管结构,没法计算大小。

Type 'ConsoleApp1.Program+myclass' cannot be marshaled as 
an unmanaged structure; no meaningful size or offset can be computed.

OK,稍微调整下代码

加一个[StructLayout(LayoutKind.Sequential)]

然后输出结果是12,刚好是三个int的大小。

等下,还有第三种办法:从 C# 7.3 开始,可使用 unmanaged 约束指定:类型参数为“非指针、不可为 null 的非托管类型”。从 C# 8.0 开始,仅包含非托管类型的字段的构造结构类型也是非托管类型,如以下示例所示:

public struct Coords<T>
{public T X;public T Y;}public class UnmanagedTypes{public static void Main(){DisplaySize<Coords<int>>();DisplaySize<Coords<double>>();}private unsafe static void DisplaySize<T>() where T : unmanaged{Console.WriteLine($"{typeof(T)} is unmanaged and its size is {sizeof(T)} bytes");}}// Output:// Coords`1[System.Int32] is unmanaged and its size is 8 bytes// Coords`1[System.Double] is unmanaged and its size is 16 bytes

那么回到我开始的问题,如果都是值类型,两个都可以用,如果是自定义类,用Marshal.SizeOf就可以了

或者把范型类写成

public struct Coords<T> where T : unmanaged
{ public T X; public T Y; 
}

即T只限于非托管类型。

结论

1.值类型范型类,可以用

where T : unmanaged 和sizeof(T)配合使用
或者直接使用 Unsafe.Sizeof(T)

2.非值类型范型类,可用

[StructLayout(LayoutKind.Sequential)]  和Marshal.SizeOf(T)配合使用

本文结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两线怎么接三线插座图_什么是RTD热电阻?两线制和三线制RTD有什么不同?

RTD的英文全称为“Resistance Temperature Detector”&#xff0c;因此准确来说&#xff0c;它应该翻译为“电阻温度检测器”。RTD是一种特殊的电阻&#xff0c;其阻值会随着温度的升高而变大&#xff0c;随着温度的降低而减小。工业上利用它的这一特性进行温度测量&#xff0c…

计算机内存条价格,最新内存条天梯图2020 内存条全面选购指南

*文章末尾有内存条推荐。电脑内存(RAM)是程序运行的地方&#xff0c;当你打开一款软件、游戏时&#xff0c;系统会将硬盘中的必要数据复制到内存中&#xff0c;CPU 再从内存中获取数据&#xff0c;因为内存的速度比硬盘要快的多多多。唯一的遗憾是每次内存断电&#xff0c;其中…

eclipse html插件_欲善事先利器——IDEA 插件篇

工欲善其事&#xff0c;必先利其器&#xff0c;好鞋踢好球是非常合乎逻辑的事情。——《长江七号》同样的开场白&#xff0c;不一样的酒&#xff0c;不一样的故事。上篇《欲善事先利器——系统篇》已经推荐了一些个人常用的效率系统软件。觉得有帮助的&#xff0c;有共鸣的 Roc…

怎么挪动_2020蚕茧多少钱一斤,蚕茧怎么做成蚕丝被

href"http://www.88360.com/product/bplist-1904/splist-1904-2063/">蚕茧 又被称作蚕衣&#xff0c;指包囊桑蚕的茧&#xff0c;为蚕蛹阶段的防护层&#xff0c;在其中包含茧衣、茧层及其蛹衬等一部分&#xff0c;茧层能够缫丝&#xff0c;茧衣及缫制后的废丝能用…

flash软件视频不能测试,360安全卫士解决视频播放错误怎么办?无法调出flash解决办法...

使用电脑继续观看视频的时候&#xff0c;小伙伴们通常都会遇到一件事&#xff0c;那就是视频突然的播放错误&#xff0c;这个时候怎么使用360安全卫士解决&#xff0c;因此就让小编给大家详细的讲讲解决办法吧视频播放错误解决办法介绍【简易步骤】&#xff1a;【360安全卫士】…

autohotkey实例+懒人包_懒人福音——GitHub 热点速览 Vol.42

作者&#xff1a;HelloGitHub-小鱼干懒人福音是什么&#xff1f;就是省时省事&#xff0c;正如 Waypoint 一样&#xff0c;你不需要在多个平台构建代码即可部署发布应用&#xff0c;它允许你将应用程序构建、部署和发布生命周期定义为代码。Bit 则让你不需要记 git 操作&#x…

蓝牙连接不上车要hfp_鹅厂又要霸屏,连接四部剧将袭,冲着主创颜值不追不行啦...

对于鹅厂的电视剧&#xff0c;相信观众们都有看过不少吧&#xff01;其中近期热播的《小风暴之时间的玫瑰》这部高甜的影视剧就备受观众们喜爱了。毕竟《小风暴》不管是剧情还是剧中的人物选角都让我们非常满意&#xff0c;剧中有胡一天和乔欣这两位高颜值主演疯狂“撒狗粮”的…

ios服务器需要开启ipv6的支持,针对iOS审核要求为应用兼容IPv6

开发中使用IPv6的好处1、IPv6:避免了网络地址转换(NAT)2、通过网络通过使用简化的头提供了更快的路由3、防止网络分段4、避免广播邻居地址解析不建议使用底层的网络API下图展示的蓝色部分的这些API都是不存在兼容性问题的&#xff0c;而我们平时自己用的包括那些第三方的网络库…

verilog换行太长代码_Verilog 之 File I/O task and function

不点蓝字&#xff0c;何来故事&#xff1f;许久之前关于Verilog I/O操作的一篇笔记梳理&#xff0c;再此与诸君共分享。0I/O操作类型verilog中关于文件操作的任务和函数主要分为四类&#xff1a;(1)打开和关闭文件的任务和函数(2) 向文件中输入信息的任务(3) 向变量中输入信息的…

MFC读取文件数据,添加信息到列表并保存到文件

打开并读取文件信息 添加&#xff1a; BOOL infoDlg::OnInitDialog() {CDialogEx::OnInitDialog();// TODO: 在此添加额外的初始化AfxMessageBox("欢迎查看学生信息");SetList();return TRUE; // return TRUE unless you set the focus to a control// 异常: OCX 属…

nginx 上传 文件超时设置_Ingressnginx自定义配置文件

点击上方蓝色字体&#xff0c;关注我们读完需 8 分钟速读需 4 分钟k8s集群默认安装的ingress-nginx直接投入测试或生产使用&#xff0c;其不合适的配置参数可能会导致一些访问报错。例如&#xff1a;“413 Request Entity Too Large”“503 Service Unavailable”此时我们就需要…

在 sysservers 中找不到服务器,在 sys.servers 中找不到服务器的解决办法,自己解决的...

一开始提示&#xff0c;在服务器中找不到在 sys.servers 中找不到服务器 QPAccountsDBLink&#xff0c;先用select * from sys.servers &#xff0c;发现只能查到一个服务器名称&#xff0c;后来自己电脑里保存了一些链接脚本&#xff0c;只需改几个地方-- 变量定义DECLARE DB…

fiddler安装_Fiddler的安装和APP抓包

点击上方“蓝字”关注我们吧&#xff01;前言1.Fiddler安装包2.安卓手机3.iOS手机1.下载fiddler软件&#xff1a;可以去官网下载https://www.telerik.com/fiddler&#xff0c;可以下载最新版2.百度云盘(非最新版)&#xff1a;链接&#xff1a;https://pan.baidu.com/s/10XVzoxw…

div中的p标签于img设置同一水平_前端工程师:css中一些需要注意的东西

html标签有三大性质&#xff0c;如果不清楚这些东西&#xff0c;在使用css添花的时候可能会糊涂的不知所措。一、块级元素块元素会独自占据一整行&#xff0c;或者多行&#xff0c;可以任意设置其大小尺寸&#xff0c;是用于搭建网页布局的必须部分&#xff0c;使网页结构更加紧…

计算机在运行 显示器出现黑屏,显示器黑屏但电脑一直在运行是什么原因

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。显示器黑屏但电脑一直在运行的原因是&#xff1a;1、可能是主机和显示器的连线接触不良(特别是接口处没有插好或者松动)&#xff0c;还有可能连接的数据线出现问题&#xff0c;所以才…

python用电度数设计_用Python实现一个爬取XX大学电费通知的小脚本

内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差&#xff0c;宿舍电量过低提醒虽然贴在楼下&#xff0c;但是作为低头一族&#xff0c;经常忘记看提醒导致宿舍酣战时突然黑屏&#xff0c;为了避免这种尴尬的场景以及强化PY学习&#xff0c;我决定…

钉钉如何调整组织架构_阿里调整组织架构:盒马升级为独立事业群,钉钉被划进阿里云丨钛快讯...

钛媒体6月18日消息&#xff0c;阿里巴巴集团CEO张勇通过全员信宣布了阿里新一轮面向未来的组织升级。他表示这次升级的主要目的是&#xff1a;充实创新业务的领导力量和组织保障&#xff1b;明确大文娱一号位&#xff0c;聚焦大文娱各业务的紧密融合&#xff1b;实现战略投资业…

服务器监控系统大概多少钱,服务器监控系统 报价

服务器监控系统 报价 内容精选换一换设置“云服务器名称”。名称可自定义&#xff0c;但需符合命名规则&#xff1a;只能由中文字符、英文字母、数字及“_”、“-”、“.”组成。如果同时购买多台弹性云服务器&#xff0c;系统会自动按序增加后缀。一次创建多台弹性云服务器时&…

过去式加ed的发音_【思语小课堂】时态二三事:规则动词过去式的发音规则

在一个简单句中&#xff0c;通常有主语&#xff0c;谓语&#xff0c;及宾语或表语等成分&#xff0c;例如&#xff1a;They watch television.这句话中&#xff0c;主语是they&#xff0c;谓语动词watch&#xff0c;television是宾语。除了这些成分会决定句子的含义&#xff0c…

python数据挖掘分析案例python_Python 数据挖掘实例 决策树分析

友情提示&#xff1a;此篇文章大约需要阅读 7分钟57秒&#xff0c;不足之处请多指教&#xff0c;感谢你的阅读。安装Anaconda Python集成环境下载环境anaconda下载选择安装环境下载过程中使用默认&#xff0c;但有一个页面需要确认&#xff0c;如下图。anaconda选择页面第一个勾…