类型的sizeof()运算符

时间:2013-08-04 01:43:24

标签: c# .net

我通常会在我的C ++代码中执行此操作:

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

但这对C#似乎不起作用。有模拟吗?

5 个答案:

答案 0 :(得分:18)

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

正确的例子是

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

所以你可能正在寻找可以在任何对象实例或运行时类型上使用的Marshal.SizeOf

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

有关详细信息,请参阅here

答案 1 :(得分:8)

.NET 4.0以后:

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

旧版.NET Framework:

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

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

答案 2 :(得分:5)

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

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

This prints 4 on ideone.

这是描述两个sizeof选项之间差异的link to Eric Lippert's blog

答案 3 :(得分:5)

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

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

遗憾的是它不起作用: - )

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

除了charboolMarshal.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;

所有其他基本类型(bytesbyteshortushortintuintlongulongfloatdoubledecimalboolchar)具有固定长度,因此您可以{{1}它永远是4。

答案 4 :(得分:1)

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