我通常会在我的 C++ 代码中这样做:
int variable = 10;
int sizeOfVariable = sizeof(variable); //Returns 4 for 32-bit process
但这似乎不适用于 C#。有模拟吗?
C# 中的sizeof
运算符仅适用于编译时已知类型,不适用于变量(实例)。
正确的例子是
int variable = 10;
int sizeOfVariable = sizeof(int);
因此,您可能正在寻找Marshal.SizeOf
可用于任何对象实例或运行时类型的。
int variable = 10;
int sizeOfVariable = Marshal.SizeOf(variable);
请参阅此处了解更多信息
.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; }
}
(从你的例子我假设你想这样做来确定进程的位数,这实际上可能不是你想要做的!)
您可以使用该Marshal.SizeOf()
方法,或sizeof
在非托管代码中使用:
Console.WriteLine(Marshal.SizeOf(typeof(int)));
这是Eric Lippert 博客的链接,描述了两个 sizeof 选项之间的区别。
只有少数标准情况下您需要这样做:
int x = sizeof(T) // where T is a generic type
可悲的是它不起作用:-)
int x = Marshal.SizeOf(T) // where T is a generic type
它确实有效,除了char
and 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。
您可以sizeof
在不安全的上下文中使用用户定义的结构,但与 Marshal.SizeOf 不同的是,它不支持装箱对象