AI编程助手
AI免费问答

C#的sizeof运算符怎么获取类型大小?支持哪些类型?

小老鼠   2025-08-25 09:23   520浏览 原创
答案是C#的sizeof运算符用于获取非托管类型在编译时的内存大小,支持基本数据类型、枚举和仅含非托管字段的结构体,但不支持引用类型。

c#的sizeof运算符怎么获取类型大小?支持哪些类型?

C#的

sizeof
运算符主要用于在编译时获取非托管值类型在内存中占用的字节数。它直接操作的是类型在内存中的固定大小,通常用于各种基本数据类型、枚举以及只包含非托管字段的结构体。

解决方案

sizeof
运算符在C#中是一个编译时常量表达式,这意味着它在程序编译阶段就已经确定了结果。它的核心作用是提供一个类型在内存中占据的固定字节大小。但要注意,它并非万能,有其特定的使用范围和限制。

要使用

sizeof
,你必须在
unsafe
(不安全)代码块或方法中使用它。这是C#为了保证类型安全而设定的一个“门槛”。一旦进入
unsafe
上下文,你就直接和内存地址打交道了,这就像C/C++那样,获得了更大的自由,但也承担了更多责任——比如内存越界、指针悬挂等风险。

语法非常直接:

sizeof(TypeName)
。其中
TypeName
必须是一个非托管类型。
using System;

public unsafe class MemoryExamples
{
    public static void Main(string[] args)
    {
        Console.WriteLine($"int 类型大小: {sizeof(int)} 字节");
        Console.WriteLine($"double 类型大小: {sizeof(double)} 字节");
        Console.WriteLine($"bool 类型大小: {sizeof(bool)} 字节"); // 通常是1字节
        Console.WriteLine($"char 类型大小: {sizeof(char)} 字节"); // 2字节,UTF-16
        Console.WriteLine($"long 类型大小: {sizeof(long)} 字节");

        // 结构体示例
        MyStruct s = new MyStruct();
        Console.WriteLine($"MyStruct 类型大小: {sizeof(MyStruct)} 字节");

        // 指针类型大小取决于平台(32位或64位)
        Console.WriteLine($"int* 类型大小: {sizeof(int*)} 字节");
        Console.WriteLine($"void* 类型大小: {sizeof(void*)} 字节");

        // 尝试获取引用类型的大小会报错
        // Console.WriteLine($"string 类型大小: {sizeof(string)} 字节"); // 编译错误
    }

    // 一个简单的非托管结构体
    public struct MyStruct
    {
        public int A;
        public byte B;
        public short C;
    }
}

从上面的例子可以看出,

sizeof
返回的是该类型在内存中占据的字节数。对于引用类型,比如
string
或任何类,
sizeof
是不能直接使用的,因为它们的大小不是编译时固定的,且它们的数据是存储在托管堆上的,变量本身只保存一个引用(指针)。

sizeof
支持哪些具体类型?为什么有些类型不行?

sizeof
运算符在C#中支持的类型范围比你想象的要窄一些,它主要针对的是所谓的“非托管类型”(unmanaged types)。

**具体支持的类型包括:

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。