Tôi thường làm điều này trong mã C++ của tôi:sizeof() điều hành với nhiều loại
int variable = 10;
int sizeOfVariable = sizeof(variable); //Returns 4 for 32-bit process
Nhưng điều đó dường như không làm việc cho C#. Có tương tự không?
Tôi thường làm điều này trong mã C++ của tôi:sizeof() điều hành với nhiều loại
int variable = 10;
int sizeOfVariable = sizeof(variable); //Returns 4 for 32-bit process
Nhưng điều đó dường như không làm việc cho C#. Có tương tự không?
Toán tử sizeof
trong C# chỉ hoạt động trên các loại đã biết thời gian biên dịch chứ không phải trên các biến (phiên bản).
Ví dụ đúng sẽ là
int variable = 10;
int sizeOfVariable = sizeof(int);
Vì vậy, có lẽ bạn đang tìm kiếm Marshal.SizeOf
mà có thể được sử dụng trên bất kỳ trường hợp đối tượng hoặc các loại thời gian chạy.
int variable = 10;
int sizeOfVariable = Marshal.SizeOf(variable);
Xem here để biết thêm thông tin
Cảm ơn. Tôi mới thật dễ dàng. Nhưng chỉ từ tò mò, 'sizeof' làm gì? – c00000fd
Nó được sử dụng để lấy kích thước theo byte cho một loại. Loại này nên được biết tại thời gian biên dịch. – hazzik
'Marshal.SizeOf (đối tượng)' cho bạn biết kích thước * không được quản lý * của một đối tượng. Có thể * đối với kích thước * không được quản lý * của một đối tượng khác với kích thước * được quản lý * của nó. 'sizeof (typename)' cho bạn biết kích thước * được quản lý * của các kiểu có tên 'typename'. 'sizeof' có thể * chỉ * được áp dụng cho' typename's là tên của * các kiểu giá trị *. 'sizeof' chỉ có thể * * được sử dụng trong mã * không an toàn *. – jason
.NET 4.0 trở đi:
if (Environment.Is64BitProcess)
Console.WriteLine("64-bit process");
else
Console.WriteLine("32-bit process");
Cũ hơn phiên bản của .NET framework:
public static bool Is64BitProcess
{
get { return IntPtr.Size == 8; }
}
(Từ ví dụ của bạn tôi giả sử bạn muốn làm điều này để xác định bitness của quá trình, whi ch có thể trên thực tế không phải là những gì bạn đang cố gắng làm)
Tôi không sử dụng nó để xác định bitness của hệ điều hành. Tôi cần nó để biết kích thước của một biến nguyên thủy trong bộ nhớ. – c00000fd
Bạn có thể sử dụng phương pháp Marshal.SizeOf()
, hoặc sử dụng sizeof
trong mã không được quản lý:
Console.WriteLine(Marshal.SizeOf(typeof(int)));
Đây là một link to Eric Lippert's blog mô tả sự khác biệt giữa hai tùy chọn sizeof.
Chỉ có một vài tình huống tiêu chuẩn mà bạn sẽ muốn làm điều đó:
int x = sizeof(T) // where T is a generic type
buồn bã nó không hoạt động :-)
int x = Marshal.SizeOf(T) // where T is a generic type
nó không làm việc trừ char
và bool
(Marshal.SizeOf(typeof(char))
== 1 thay vì 2, Marshal.SizeOf(typeof(bool))
== 4 thay vì 1)
int x = sizeof(IntPtr);
nó không hoạt động, nhưng bạn có thể làm điều đó như
int x = Marshal.SizeOf(typeof(IntPtr));
hoặc, tốt hơn
int x = IntPtr.Size;
Tất cả các loại cơ bản khác (byte
, sbyte
, short
, ushort
, int
, uint
, long
, ulong
, float
, double
, decimal
, bool
, char
) có độ dài cố định, vì vậy bạn có thể thực hiện sizeof(int)
và sẽ luôn là 4.
Báo cáo sai về kích thước của kiểu char và bool của biến bởi 'Marshal.SizeOf' API thực sự là sai hoặc được gán cho một số biểu diễn bên trong thực tế về cách chúng được lưu trữ trong bộ nhớ? – RBT
@RBT Kích thước "sai" là do kích thước được trả về là kích thước được sử dụng trong khi thực hiện marshaling với Windows API (bạn đang sử dụng 'Marshal.SizeOf' :-)). Ví dụ, xem [UnmanagedType.Bool] (https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.unmanagedtype (v = vs.80) .aspx): 'Giá trị Boolean 4 byte ' – xanatos
Cảm ơn bạn đã phản hồi @xanatos. Trong khi đó tôi đã hỏi câu hỏi rất giống với tò mò và Hans giải thích nó một cách tuyệt vời. Bạn có thể xem [tại đây] (http://stackoverflow.com/questions/38969438/oppostie-behavior-of-marshal-sizeof-and-sizeof-operator-for-boolean-and-char-dat). – RBT
Kích thước của 'int' là * luôn * 32 bit trong C#. Điều này là do 'int' là một bí danh cho' System.Int32' và 'System.Int32' là 32-bit theo định nghĩa và sẽ không bao giờ * thay đổi. Thời gian, kết thúc của câu chuyện. – jason
@ Jason và không phải là vinh quang ?! –
@ Jason: Tôi rõ ràng là không sử dụng nó ở dạng cụ thể đó. – c00000fd