2013-08-04 30 views
5

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?

+5

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

+4

@ Jason và không phải là vinh quang ?! –

+0

@ Jason: Tôi rõ ràng là không sử dụng nó ở dạng cụ thể đó. – c00000fd

Trả lời

16

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

+0

Cảm ơn. Tôi mới thật dễ dàng. Nhưng chỉ từ tò mò, 'sizeof' làm gì? – c00000fd

+1

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

+7

'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

8

.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)

+0

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

5

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ừ charbool (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.

+0

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

+0

@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

+0

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

Các vấn đề liên quan