2011-02-10 20 views
17

Eventuali duplicati:
How to check the number of bytes consumed by my Structure?Ottenere dimensione della struct in C#

ho una struct in forma imballata di

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct test 
{ 
    public int a; 
    public uint16 b; 
} 

Come faccio ad avere le dimensioni di la struct come il compilatore afferma che sizeof può essere usato solo in un contesto non sicuro?

Grazie.

+0

Per cosa ti serve? –

+2

Ho bisogno di inviarlo attraverso la rete. Ho ottenuto l'API che mi serve per specificare i byte della struttura, inclusi l'intestazione + i dati, ecc. – Nick

+0

Dai un'occhiata a http://stackoverflow.com/questions/2418749/c-why-sizeof-is-unsafe-and-how -a-get-size-of-a-struct-in-a-safe-way – Ray

risposta

1

Hai messo l'operatore sizeof in un contesto non sicuro come suggerisce il compilatore?

Qualcosa di simile credo:

int size; 
unsafe 
{ 
    size=sizeof(Test); 
} 

Ma io non sono sicuro se si vuole veramente farlo. Tenderei a usare un normale serializzatore invece di strutture con un layout specifico per questo. IMO dovresti usare tali strutture solo per l'interoperabilità nativa e non per una semplice serializzazione.

E guardando la documentazione del SizeOf il marshalling delle funzioni può compromettere anche la dimensione (non in questo esempio).

+2

Ciò darebbe comunque l'errore di compilazione. –

+0

@ JohnB.Lambe Cosa intendi? Questo codice compila e restituisce '6', come previsto (una volta risolti gli errori banali nel codice dell'OP) – CodesInChaos

+0

@Porges' non sicuro 'non è contagioso. Hai solo bisogno di usare il flag corretto per l'assemblaggio e contrassegnare il blocco di codice rilevante 'non sicuro'. – CodesInChaos

24

Il metodo SizeOf fa il trucco.

int size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Point)); 
+1

Per essere più specifici, è System.Runtime.InteropServices.Marshal.SizeOf, applicato a un'istanza. Dovrebbe restituire gli stessi risultati della lingua "sizeof" applicata al tipo. Esempio di seguito. –

+0

Questo ha funzionato in combinazione con il commento di Reb.Cabin. Grazie, ora posso effettivamente scoprire che cosa è una struttura efficiente e cosa no. – Madmenyo

+1

typeof (Point), Point è una classe. Con struct mi dà l'eccezione !! Prova int size = System.Runtime.InteropServices.Marshal.SizeOf (typeof (test)); – MrHIDEn

Problemi correlati