2014-09-27 4 views
5

Ich verstehe, dass SizeOf() soll verwendet werden, um mit nicht verwalteten Code zu interagieren, aber meine Frage ist, warum System.Runtime.InteropServices.Marshal.SizeOf(typeof(System.Char))1 anstelle von 2 zurückgeben? Ich würde annehmen, dass C# char gleichbedeutend mit unmanaged wchar_t sein soll, das 2 Bytes groß ist. Würde das Probleme verursachen?Marshal.SizeOf (Typ t) -Funktion

Antwort

6

Von Marshal.SizeOf:

Für Zeichentypen wird die Größe der zu dieser Klasse angewendet CharSet Wert beeinträchtigt.

Und nach CharSet Enumeration, der Standard ist CharSet.Ansi:

Obwohl die Common Language Runtime Standard Auto ist, kann Sprachen diese Standardeinstellung außer Kraft setzen. Zum Beispiel markiert C# standardmäßig alle Methoden und Typen als Ansi.


Zum Beispiel:

[StructLayout(LayoutKind.Sequential)] 
struct A 
{ 
    char c; 
} 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
struct B 
{ 
    char c; 
} 

.... 

Console.WriteLine("{0} {1}", Marshal.SizeOf(typeof(A)), Marshal.SizeOf(typeof(B))); 

die Ausgabe

1 2 
+0

Können Sie den Code bearbeiten und hinzufügen, die die CharSet ändert und macht SizeOf() return 2? –

+0

Komisch, ich habe gerade Joel Spolskys Beitrag zu Zeichensätzen gelesen. Guter Fang. http://www.joelonsoftware.com/articles/Unicode.html – raney

+0

@raney, yeah, er hat viele gute Artikel über Unicode –

Verwandte Themen