这篇文章主要介绍了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的用法实例分析的更多相关文章

  1. php中return的用法实例分析

    本文实例讲述了php中return的用法.分享给大家供大家参考.具体分析如下: 首先,它的意思就是返回;return()是语言结构而不是函数,仅在参数包含表达式时才需要用括号将其括起来.当返回一个变量 ...

  2. ASP.NET中Dictionary基本用法实例分析

    本文实例讲述了ASP.NET中Dictionary基本用法.分享给大家供大家参考,具体如下: //Dictionary位于System.Collections.Generic命名空间之下 /*  * ...

  3. javaScript中with函数用法实例分析

    javaScript 中的 with 函数 ,即所谓的with 语句,可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性,要给对象创建新的属性,必须明确地引用该对象. with 函 ...

  4. jQuery中on()方法用法实例详解

    这篇文章主要介绍了jQuery中on()方法用法,实例分析了on()方法的功能及各种常见的使用技巧,并对比分析了与bind(),live(),delegate()等方法的区别,需要的朋友可以参考下 本 ...

  5. jQuery中on()方法用法实例

    这篇文章主要介绍了jQuery中on()方法用法,实例分析了on()方法的功能.定义及在匹配元素上绑定一个或者多个事件处理函数的使用技巧,需要的朋友可以参考下 本文实例讲述了jQuery中on()方法 ...

  6. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

  7. Jackson的用法实例分析

    这篇文章主要介绍了Jackson的用法实例分析,用于处理Java的json格式数据非常实用,需要的朋友可以参考下 通俗的来说,Jackson是一个 Java 用来处理 JSON 格式数据的类库,其性能 ...

  8. Python实现的选择排序算法原理与用法实例分析

    Python实现的选择排序算法原理与用法实例分析 这篇文章主要介绍了Python实现的选择排序算法,简单描述了选择排序的原理,并结合实例形式分析了Python实现与应用选择排序的具体操作技巧,需要的朋 ...

  9. jQuery中eq()方法用法实例

    本文实例讲述了jQuery中eq()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够获取匹配元素集上的相应位置索引的元素. 匹配元素集上元素的位置索引是从0开始的. 语法结构: 复制代码 代 ...

随机推荐

  1. 查看oracle SID

    源地址:http://blog.sina.com.cn/s/blog_5f20c4740100dodl.html SID就是数据库的实例 select instance_name from  V$in ...

  2. [ActionScript 3.0] AS3.0 获取文本的明暗度

    /** * 获取文字的明暗值 * @param t 文字 * @return Number */ function getDensity(t:String):Number { var ttf:Text ...

  3. [ActionScript 3.0] AS3动画类Tweener中滤镜的运用

    package { import caurina.transitions.Tweener; import caurina.transitions.properties.FilterShortcuts; ...

  4. crm 4 UserHasRole

    //获取当前人员是否含有指定角色权限 function UserHasRole(roleName) { //get Current User Roles, oXml is an object var ...

  5. XEP-0079

    XEP-0045: 多用户聊天 摘要: 本文定义了一个XMPP协议扩展用于多用户文本会议.即多个XMPP可以在一个房间或频道互相交流信息, 类似互联网中继聊天系统(IRC).还有标准聊天室功能如聊天室 ...

  6. Droid VNC Server

    这个app可以在Android开启VNC Server,让其他的VNC Client远程连接手机,不过前提是要ROOT.哎,可惜了. 当然还有另一款替代品Total Control http://ww ...

  7. iOS中使用FMDB事务批量更新数据库

    今天比较闲看到大家在群里讨论关于数据库操作的问题,其中谈到了"事务"这个词,坦白讲虽然作为计算机专业的学生,在上学的时候确实知道存储过程.触发器.事务等等这些名词的概念,但是由于毕 ...

  8. 如何退出Flex手机项目?

    在Flex创建的手机项目中,可以使用以下代码来关闭/退出程序. NativeApplication.nativeApplication.exit(); 显示代码

  9. hive数据文件简单合并

    MR代码: package merge; import java.io.IOException; import java.util.Iterator; import org.apache.hadoop ...

  10. (整理)streamWriter、streamReader与FileStream

    今天偶然使用VS代码分析,发现CA2000警告,然后其中一条为streamWriter.streamReader与FileStream相关内容,特查询并记录一下. 引文地址:http://bbs.cs ...