【问题标题】:C# Why is the sizeof(constant) not definedC#为什么没有定义sizeof(constant)
【发布时间】:2016-07-11 15:22:33
【问题描述】:

对不起,我刚刚写了一些东西来表达我的观点。

这是一个实际的示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CacheScratch
{
    class Class1
    {
        public const int a = 0xABAC;

        int test()
        {
            return sizeof(a);
        }
    }
}

如果我有一个 const,为什么会出现错误: 严重性代码 描述 项目文件行抑制状态 错误 CS0233 'a' 没有预定义的大小,因此 sizeof 只能在不安全的上下文中使用(考虑使用 System.Runtime.InteropServices.Marshal.SizeOf)

为什么我需要一个 Marshal 用于固定大小的变量?

【问题讨论】:

  • 您的代码尚未接近编译。你引用了一个不存在的变量,你没有使用类型参数并且0xA4B4 不适合简短。
  • sizeof 采用 C# 中的类型,而不是任意表达式。
  • 在 .Net 中您甚至不需要知道这一点,因为它是托管代码。
  • 在 C# 中,int 的大小始终为 4。但是你为什么关心尺寸是多少? 在此处说出您实际要解决的问题。如果您尝试在 C# 中获取整数的大小,则很有可能您做错了什么。

标签: c# constants sizeof


【解决方案1】:

来自MSDN: sizeof (C# Reference)

对于所有其他类型,包括结构,sizeof 运算符可以是 仅在不安全的代码块中使用。虽然您可以使用 Marshal.SizeOf 方法,该方法返回的值并不总是 与 sizeof 返回的值相同。 Marshal.SizeOf 返回 类型被编组后的大小,而 sizeof 返回 由公共语言运行时分配的大小, 包括任何填充。

用于获取非托管类型的大小****

奇怪的是,实际上没有理由需要获取托管类型的字节大小,这就是您正在做的事情。

“为什么我需要 Marshal 来处理固定大小的变量?”

如果您要查找的只是局部变量的大小,则不一定必须这样做。您可以直接致电var size = sizeof(int)sizeof(short) 这将分别返回 4 和/或 2。

【讨论】:

  • 我的想法是,为了便于阅读,我可以将 sizeof() 用于我的固定大小变量。显然不是。
猜你喜欢
  • 2019-08-17
  • 2021-10-29
  • 2015-08-27
  • 2023-03-16
  • 2011-02-13
  • 2012-01-10
  • 2012-08-27
  • 1970-01-01
  • 2015-08-21
相关资源
最近更新 更多