2012-01-24 22 views
5

Sto tentando di accedere a un campo static dello struct che ho già definito pubblico. Tuttavia, ho ancora "inaccessibile a causa del suo livello di protezione" Qualcuno può aiutarmi?C# Come accedere al campo statico di una struttura pubblica

public class Program 
{ 
    public struct AT_CMD 
    { 
     static int x = 7; 
     static byte[] cmd_mode = new byte[3] { 0x2B, 0x2B, 0x2B }; 
     static byte[] end_device_assoc = new byte[4] { 0x41, 0x54, 0x41, 0x31 }; 
     //should be 0 for end device, default is 0 
     static byte[] data_rate = new byte[4] { 0x41, 0x54, 0x42, 0x44 }; //3 for 9600, 5 for 38400 
     static byte[] channel = new byte[4] { 0x41, 0x54, 0x43, 0x48 }; //0x0B-0x1A 
     static byte[] Dest_addr_high = new byte[4] { 0x41, 0x54, 0x44, 0x48 }; //0 FOR 16bit 
     static byte[] Dest_addr_low = new byte[4] { 0x41, 0x54, 0x44, 0x4C }; 
     static byte[] my_addr = new byte[4] { 0x41, 0x54, 0x4D, 0x59 }; // 0-0xFFFF 
     static byte[] carriage_return = new byte[1] { 0x0D }; 
    } 

    static void Main() 
    { 
     int y = AT_CMD.x; 
    } 
} 

risposta

4

Per impostazione predefinita i campi sono privato. Aggiungi il modificatore più limitante che ti consentirà comunque di lavorare con la struttura.

public struct AT_CMD 
{ 
    public static int x = 7; 
} 

static void Main() 
{ 
    int y = AT_CMD.x; 
} 
4

La struttura è pubblica, ma i membri non lo sono.

8

modificarla in:

public struct AT_CMD 
    { 
     public static int x = 7; 

     // ... 
    } 

Basta fare un structpublic non influenza i suoi membri, i membri del struct sarà private per difetto se non diversamente specificato.

UPDATE: Affrontare la confusione in materia di accesso di default, internal è l'accesso predefinito per il struct o class stesso se dichiarato a livello di spazio dei nomi (non annidato in un'altra classe/struct):

classi e le strutture dichiarate direttamente all'interno di uno spazio dei nomi (nelle altre parole non nidificate all'interno di altre classi o strutture) possono essere pubbliche o interne. Interno è l'impostazione predefinita se non è specificato alcun modificatore di accesso .

considerando che i campi di un class o struct DEFAULT sempre private:

Il livello di accesso per i membri della classe e membri struct, tra cui classi annidate e le strutture, è privata per impostazione predefinita.

dal MSDN.

+0

grazie mille, quindi anche statico, è privato ... giusto? – fiftyplus

+0

@gpakillsme: No, tecnicamente il valore predefinito è 'internal', anche se la distinzione potrebbe non essere importante per il tuo caso. Vedere [here] (http://msdn.microsoft.com/en-us/library/ms173121.aspx) per ulteriori informazioni. –

+1

@BlueRaja: In realtà, internal è l'impostazione predefinita per una struct/class non annidata (ovvero, 'struct AT_CMD' è uguale a' struct AT_CMD 'interno se non nidificato). L'impostazione predefinita per i membri classe/struct è 'private'. –

2

dichiararli come questo:

public static byte[] cmd_mode = new byte[3] { 0x2B, 0x2B, 0x2B }; 

Tuttavia, sembra come se si intende che questi siano costanti. In tal caso, dovrebbero essere dichiarati in questo modo:

public static readonly IEnumerable<byte> cmd_mod = new byte[3] { 0x2B, 0x2B, 0x2B }; 
+0

Consiglierei un 'ReadOnlyCollection ' qui, se non altro per chiarezza. –

+0

@Mr.Delusione: 'ReadOnlyCollection ' è usato raramente nella pratica - per qualsiasi ragione, 'IEnumerable ' è quasi * sempre * preferito * (probabilmente perché non richiede una copia) *. Detto questo, 'IEnumerable ' non ha un indicizzatore mentre 'ReadOnlyCollection ' fa, quindi se ciò è importante, 'ReadOnlyCollection ' potrebbe essere la tua unica scelta. –

Problemi correlati