C#中sizeof的用法实例分析
sizeof是C#中非常重要的方法,本文就以实例形式分析C#中sizeof的用法。分享给大家供大家参考。具体分析如下:
在C#中,sizeof用来计算类型的大小,单位是字节。有这样的一个类:
|
1
2
3
4
5
6
|
public class MyUglyClass { public char myChar1; public int myInt; public char myChar2; } |
在客户端,试图使用sizeof计算该类型的大小。
|
1
2
3
4
5
6
7
8
9
10
11
|
class Program { static void Main(string[] args) { MyUglyClass m = new MyUglyClass(); m.myChar1 = 'd'; m.myInt = 25; m.myChar2 = 'a'; Console.WriteLine(sizeof(MyUglyClass)); } } |
运行之后报错如下图所示:

○ 第一个报错说明要使用sizeof,必须使用关键字unsafe
○
第二个报错说明sizeof对运行时变量无效,只能针对编译器变量统计其大小
把类改成struct值类型。
|
1
2
3
4
5
6
|
public struct MyUglyClass { public char myChar1; public int myInt; public char myChar2; } |
客户端改成如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Program { static void Main(string[] args) { MyUglyClass m = new MyUglyClass(); m.myChar1 = 'd'; m.myInt = 25; m.myChar2 = 'a'; unsafe { Console.WriteLine(sizeof(MyUglyClass)); } } } |
运行,继续报错:"不安全代码只会在使用 /unsafe 编译的情况下出现"。
解决方法是:右键项目→属性→生成→勾选"允许不安全代码"→保存
再次运行,结果:12
问题又来了,在MyUglyClass这个值类型结构中,char类型16位,相当于2个字节,int类型32位,相当于4个字节。MyUglyClass类型大小=2+2+4=8个字节,应该是8个字节才对!怎么会是12个字节呢?
这就涉及到栈的对齐和填充了。就拿上面的例子来说:原本,栈上有int类型的变量占4个字节,2个char类型的变量分别占2个字节,当栈上的这些变量排列之后,栈还要进行对齐排列,即所有较小字节的变量向最大字节的变量看齐,并且填充空位。

红叉部分是为了对齐而填充补上的。
如果想忽略为了对齐而填充补上的部分,可以使用[StructLayout]特性。
|
1
2
3
4
5
6
7
|
[StructLayout(LayoutKind.Auto)] public struct MyUglyClass { public char myChar1; public int myInt; public char myChar2; } |
再次运行,结果:8
总结:sizeof只适用于值类型,并且需要在unsafe上下文环境中使用。
相信本文所述对大家C#程序设计的学习有一定的借鉴参考价值。
C#中sizeof的用法实例分析的更多相关文章
- php中return的用法实例分析
本文实例讲述了php中return的用法.分享给大家供大家参考.具体分析如下: 首先,它的意思就是返回;return()是语言结构而不是函数,仅在参数包含表达式时才需要用括号将其括起来.当返回一个变量 ...
- ASP.NET中Dictionary基本用法实例分析
本文实例讲述了ASP.NET中Dictionary基本用法.分享给大家供大家参考,具体如下: //Dictionary位于System.Collections.Generic命名空间之下 /* * ...
- javaScript中with函数用法实例分析
javaScript 中的 with 函数 ,即所谓的with 语句,可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性,要给对象创建新的属性,必须明确地引用该对象. with 函 ...
- jQuery中on()方法用法实例详解
这篇文章主要介绍了jQuery中on()方法用法,实例分析了on()方法的功能及各种常见的使用技巧,并对比分析了与bind(),live(),delegate()等方法的区别,需要的朋友可以参考下 本 ...
- jQuery中on()方法用法实例
这篇文章主要介绍了jQuery中on()方法用法,实例分析了on()方法的功能.定义及在匹配元素上绑定一个或者多个事件处理函数的使用技巧,需要的朋友可以参考下 本文实例讲述了jQuery中on()方法 ...
- python中argparse模块用法实例详解
python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...
- Jackson的用法实例分析
这篇文章主要介绍了Jackson的用法实例分析,用于处理Java的json格式数据非常实用,需要的朋友可以参考下 通俗的来说,Jackson是一个 Java 用来处理 JSON 格式数据的类库,其性能 ...
- Python实现的选择排序算法原理与用法实例分析
Python实现的选择排序算法原理与用法实例分析 这篇文章主要介绍了Python实现的选择排序算法,简单描述了选择排序的原理,并结合实例形式分析了Python实现与应用选择排序的具体操作技巧,需要的朋 ...
- jQuery中eq()方法用法实例
本文实例讲述了jQuery中eq()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够获取匹配元素集上的相应位置索引的元素. 匹配元素集上元素的位置索引是从0开始的. 语法结构: 复制代码 代 ...
随机推荐
- USB枚举过程
1. 枚举是什么? 枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序.调试USB设备,很重要的一点就是USB的枚举过程,只 ...
- 【摘】linux之shutdown、halt和reboot命令详解
在重新启动Linux系统的同时把内存中的信息写入硬盘,应使用()命令实现 #shutdown -r now #halt #reboot #init3 正确答案:A 在linux命令中reboot是 ...
- Package 'DXCore for Visual Studio' has failed to load properly
Since installing 13.1 I get Package 'DXCore for Visual Studio' has failed to load properly error wh ...
- Fegla and the Bed Bugs 二分
Fegla and the Bed Bugs Fegla, also known as mmaw, is coaching a lot of teams. All these teams train ...
- jmeter随笔(4)--中文url编码问题
最近在工作中,对jmeter实践的点滴的记录,这里分享交流,不一定正确,仅供参考和讨论,有想法的欢迎留言.谈论,手机上图片如果不清晰,请点击[阅读原文]查看. 技巧1:中文url编码问题 问题:我们抓 ...
- 003.ASP.NET MVC集中管理Session
原文链接:http://www.codeproject.com/Tips/790387/Session-in-ASP-NET-MVC 1.前言 今天有得有失啊,看到这篇,专心记下里面的精华吧 2.一般 ...
- 使用AS3.0代码实现给图片添加滤镜的模糊与斜角效果
滤镜可应用于任何显示对象(即,从 DisplayObject 类继承的对象), 例如 MovieClip.SimpleButton.TextField 和 Video 对象,以及 BitmapData ...
- 将Excel中数据导入数据库(二)
在上篇文章中介绍到将Excel中数据导入到数据库中,但上篇文章例子只出现了nvachar类型,且数据量很小.今天碰到将Excel中数据导入数据库中的Excel有6419行,其中每行均有48个字段,有i ...
- redis学习(一)Redis应用场景
Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的 ...
- 在使用 AjaxFileUpload 上传文件时,在项目发布到 iis 后,图片不能预览
在使用 AjaxFileUpload 上传文件时,图片已经上传成功了,在站点没有发布时,可以预览,可是在项目发布到 iis 后,图片就不能预览,在网上找了很多的方案也没解决,最后的解决方案如下: 1 ...