C# 类型的sizeof()运算符 我通常会用C++代码来做这件事: int variable = 10; int sizeOfVariable = sizeof(variable); //Returns 4 for 32-bit process

C# 类型的sizeof()运算符 我通常会用C++代码来做这件事: int variable = 10; int sizeOfVariable = sizeof(variable); //Returns 4 for 32-bit process,c#,.net,C#,.net,但这似乎对C#不起作用。有模拟吗?C#中的运算符只在编译时已知的类型上工作,而不在变量(实例)上工作 正确的例子是 int variable = 10; int sizeOfVariable = sizeof(int); 因此,您可能正在寻找可以在任何对象实例或运行时类型上使用的 int variable = 10; int sizeOfVariable = Marshal.SizeOf(variable); 有关更多信息,请参见.NET 4.0及以后版本: if (Environm

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

C#中的运算符只在编译时已知的类型上工作,而不在变量(实例)上工作

正确的例子是

int variable = 10;
int sizeOfVariable = sizeof(int);
因此,您可能正在寻找可以在任何对象实例或运行时类型上使用的

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 framework:

public static bool Is64BitProcess
{
    get { return IntPtr.Size == 8; }
}
(从您的示例中,我假设您希望这样做来确定进程的位,这实际上可能不是您想要做的!)

您可以使用该方法,或者在非托管代码中使用
sizeof

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


下面是一个描述两个sizeof选项之间差异的示例。

只有一些标准情况下您需要这样做:

int x = sizeof(T) // where T is a generic type
可悲的是,它不起作用:-)

除了
char
bool
Marshal.SizeOf(typeof(char))
==1而不是2,
Marshal.SizeOf(typeof(bool))
==4而不是1)

它不起作用,但你可以按你的意愿去做

int x = Marshal.SizeOf(typeof(IntPtr));
或者更好

int x = IntPtr.Size;

所有其他基本类型(
byte
sbyte
short
ushort
int
uint
long
float
double
decimal
bool
char
)都有固定的长度,因此您可以执行
sizeof(int)
它将始终为4。

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

谢谢。我觉得这很容易。但是出于好奇,
sizeof
做什么呢?它用于获取类型的字节大小。编译时应该知道该类型。
Marshal.SizeOf(object)
告诉您对象的非托管大小。对象的非托管大小可能与其托管大小不同
sizeof(typename)
告诉您name
typename
类型实例的托管大小
sizeof
只能应用于作为值类型名称的
typename
s
sizeof
只能在不安全的代码中使用。请不要在
bool
char
上使用
Marshal.sizeof()
:-)@xanatos为什么
Marshal.sizeof
对bool和char有不当行为?还是C#operator行为不端?谁报告这些值是正确的。它是不是某种程度上归因于一些关于它们如何存储在内存中的事实内部表示?
int
的大小在C#中总是32位。这是因为
int
System.Int32
System的别名。根据定义,Int32
是32位,这一点永远不会改变。句号,故事结束。@Jason,这不是很光荣吗@Jason:我显然没有以那种特定的形式使用它。@Jason:可能的重复点是直接获取
变量的大小,而不引用其类型,这样如果有人决定将来将
变量
int
更改为
short
,他不必在其他地方做替换。我不是用它来确定操作系统的比特度。我需要它知道内存中一个基本变量的大小。
marshall.SizeOf
API错误地报告了char和bool类型变量的大小,这实际上是错误的,或者归因于内存中如何存储这些变量的一些实际内部表示?@RBT“错误”大小是因为返回的是对Windows API进行封送处理时使用的大小(您使用的是
Marshal.SizeOf
:-)。例如,请参阅:
一个4字节的布尔值
感谢您在@xanatos的回复。与此同时,出于好奇,我问了同样的问题,汉斯解释得很漂亮。你可以看看。
int x = Marshal.SizeOf(typeof(IntPtr));
int x = IntPtr.Size;