10

我通常会在我的 C++ 代码中这样做:

int variable = 10;
int sizeOfVariable = sizeof(variable);   //Returns 4 for 32-bit process

但这似乎不适用于 C#。有模拟吗?

4

5 回答 5

23

C# 中的sizeof运算符仅适用于编译时已知类型,不适用于变量(实例)。

正确的例子是

int variable = 10;
int sizeOfVariable = sizeof(int);

因此,您可能正在寻找Marshal.SizeOf可用于任何对象实例或运行时类型的。

int variable = 10;
int sizeOfVariable = Marshal.SizeOf(variable);    

请参阅此处了解更多信息

于 2013-08-04T01:45:47.003 回答
9

.NET 4.0 及以上版本:

if (Environment.Is64BitProcess)
    Console.WriteLine("64-bit process");
else
    Console.WriteLine("32-bit process");

旧版本的 .NET 框架:

public static bool Is64BitProcess
{
    get { return IntPtr.Size == 8; }
}

从你的例子我假设你想这样做来确定进程的位数,这实际上可能不是你想要做的!)

于 2013-08-04T01:45:53.283 回答
5

您可以使用该Marshal.SizeOf()方法,或sizeof在非托管代码中使用:

Console.WriteLine(Marshal.SizeOf(typeof(int)));

这打印4在ideone上。

这是Eric Lippert 博客的链接,描述了两个 sizeof 选项之间的区别。

于 2013-08-04T01:45:57.917 回答
5

只有少数标准情况下您需要这样做:

int x = sizeof(T) // where T is a generic type

可悲的是它不起作用:-)

int x = Marshal.SizeOf(T) // where T is a generic type

它确实有效,除了charand bool( Marshal.SizeOf(typeof(char))== 1 而不是 2,Marshal.SizeOf(typeof(bool))== 4 而不是 1)

int x = sizeof(IntPtr);

它不起作用,但你可以这样做

int x = Marshal.SizeOf(typeof(IntPtr));

或更好

int x = IntPtr.Size;

所有其他基本类型(byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, bool, char)都有固定的长度,所以你可以这样做sizeof(int),它总是 4。

于 2013-08-04T06:14:32.423 回答
1

您可以sizeof在不安全的上下文中使用用户定义的结构,但与 Marshal.SizeOf 不同的是,它不支持装箱对象

于 2018-08-21T11:45:49.973 回答