operatore sizeof () per i tipi

Lo farei normalmente nel mio codice C ++:

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

Ma non sembra funzionare per C #. C’è un analogo?

L’operatore sizeof in C # funziona solo su tipi noti in fase di compilazione, non su variabili (istanze).

L’esempio corretto sarebbe

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

Quindi probabilmente stai cercando Marshal.SizeOf che può essere utilizzato su istanze di oggetti o tipi di runtime.

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

Vedi qui per maggiori informazioni

.NET 4.0 in poi:

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

Versioni precedenti di .NET Framework:

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

( Dal tuo esempio presumo che tu voglia fare questo per determinare il testimone del processo, che in realtà potrebbe non essere quello che stai cercando di fare!)

È ansible utilizzare il metodo Marshal.SizeOf() o utilizzare sizeof nel codice non gestito:

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

Questo stampa 4 su ideone.

Ecco un link al blog di Eric Lippert che descrive la differenza tra le due opzioni delle dimensioni.

Ci sono solo alcune situazioni standard in cui vorrete farlo:

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

purtroppo non funziona 🙂

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

funziona tranne che per char e bool ( Marshal.SizeOf(typeof(char)) == 1 invece di 2, Marshal.SizeOf(typeof(bool)) == 4 invece di 1)

 int x = sizeof(IntPtr); 

non funziona, ma puoi farlo come

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

o meglio

 int x = IntPtr.Size; 

Tutti gli altri tipi di base ( byte , sbyte , short , ushort , int , uint , long , ulong , float , double , decimal , bool , char ) hanno una lunghezza fissa, quindi puoi fare sizeof(int) e sarà sempre 4.

È ansible utilizzare sizeof su strutture definite dall’utente in contesti non sicuri, ma a differenza di Marshal.SizeOf non supporta oggetti in scatola