2013-08-04 14 views
5

I zwykle to zrobić w moim kodu C++:sizeof() operator dla typów

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

ale to nie wydają się działać dla C#. Czy istnieje analog?

+5

Rozmiar 'int' jest * zawsze * 32-bitowy w C#. Dzieje się tak dlatego, że 'int' jest aliasem dla' System.Int32' i 'System.Int32' z definicji jest 32-bitowe i to * nigdy * się nie zmienia. Okres, koniec historii. – jason

+4

@Jason i czy to nie jest wspaniałe ?! –

+0

@Jason: Oczywiście nie używam go w tej konkretnej formie. – c00000fd

Odpowiedz

16

Operator sizeof w języku C# działa tylko w znanych typach kompilacji, a nie w zmiennych (wystąpieniach).

Prawidłowe Przykładem może być

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

Więc prawdopodobnie szukasz Marshal.SizeOf który może być używany na dowolnej instancji obiektów lub typów uruchomieniowych.

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

Zobacz here więcej informacji

+0

Dzięki. Nowe było łatwe. Ale czy z ciekawości robi się "sizeof"? – c00000fd

+1

Służy do uzyskania rozmiaru w bajtach dla typu. Typ powinien być znany podczas kompilacji. – hazzik

+7

'Marshal.SizeOf (object)' informuje o * niezarządzanym * rozmiarze obiektu. Jest * możliwe *, aby rozmiar * niezarządzanego * obiektu był inny niż jego * zarządzany * rozmiar. 'sizeof (typename)' informuje o * zarządzanym * rozmiarze instancji typu o nazwie 'typename'. 'sizeof' może * tylko * być stosowane do' typename's, które są nazwami * typów wartości *. 'sizeof' może * tylko * być użyte w * niebezpiecznym * kodzie. – jason

8

.NET 4.0 roku:

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

Starsze wersje NET:

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

(ze swojego przykład jestem zakładając, że chcesz to zrobić, aby określić bitness procesu, whi ch w rzeczywistości może nie być, co staramy się robić)

+0

Nie używam go do określenia bitness systemu operacyjnego. Potrzebuję go znać rozmiar prymitywnej zmiennej w pamięci. – c00000fd

5

Istnieje tylko kilka standardowych sytuacje, w których będziemy chcieli to zrobić:

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

niestety to nie działa :-)

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

to działa z wyjątkiem char i bool (Marshal.SizeOf(typeof(char)) == 1 zamiast 2 Marshal.SizeOf(typeof(bool)) == 4 zamiast 1)

int x = sizeof(IntPtr); 

to nie działa, ale można to zrobić jak

int x = Marshal.SizeOf(typeof(IntPtr)); 

albo lepiej

int x = IntPtr.Size; 

wszystkie inne podstawowe typy (byte, sbyte, short, ushort, int, uint, long , ulong, float, double, decimal, bool, char) mają stałą długość, dzięki czemu można wykonać sizeof(int) i zawsze będzie 4.

+0

Niewłaściwe zgłaszanie wielkości zmiennych typu char i bool przez "Marshal.SizeOf" API jest w rzeczywistości błędne lub jest przypisywane do jakiejś faktycznej reprezentacji wewnętrznej, w jaki sposób są one przechowywane w pamięci? – RBT

+0

@RBT "Niepoprawny" rozmiar jest taki, że ten, który powrócił, jest wielkością używaną podczas przepychania się do Windows API (używasz 'Marshal.SizeOf' :-)). Na przykład zobacz [UnmanagedType.Bool] (https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.unmanagedtype (v = vs.80) .aspx): '4-bajtowa wartość logiczna ' – xanatos

+0

Dzięki za odpowiedź @xanatos. Tymczasem z ciekawości zadałem to samo pytanie, a Hans pięknie to wyjaśnił. Możesz zajrzeć [tutaj] (http://stackoverflow.com/questions/38969438/oppostie-behavior-of-marshal-sizeof-and-sizeof-operator-for-boolean-and-char-dat). – RBT

Powiązane problemy