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?
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?
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
Dzięki. Nowe było łatwe. Ale czy z ciekawości robi się "sizeof"? – c00000fd
Służy do uzyskania rozmiaru w bajtach dla typu. Typ powinien być znany podczas kompilacji. – hazzik
'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
.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ć)
Nie używam go do określenia bitness systemu operacyjnego. Potrzebuję go znać rozmiar prymitywnej zmiennej w pamięci. – c00000fd
Można użyć metody Marshal.SizeOf()
lub użyj sizeof
w kodzie niezarządzanym:
Console.WriteLine(Marshal.SizeOf(typeof(int)));
Oto link to Eric Lippert's blog opisując różnica między dwoma opcjami sizeof.
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.
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
@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
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
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
@Jason i czy to nie jest wspaniałe ?! –
@Jason: Oczywiście nie używam go w tej konkretnej formie. – c00000fd