2012-01-24 9 views
5

Estoy intentando acceder al campo static del struct que ya definí como público. Sin embargo, todavía tengo "inaccesible debido a su nivel de protección" ¿Alguien puede ayudarme?C# Cómo acceder al campo estático de una estructura pública

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; 
    } 
} 

Respuesta

4

Por defecto los campos son privado. Agregue el modificador más restrictivo que aún le permitirá trabajar con la estructura.

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

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

La estructura es pública, pero los miembros no lo son.

8

Cambiar a:

public struct AT_CMD 
    { 
     public static int x = 7; 

     // ... 
    } 

Con una sola structpublic no afecta a sus miembros, los miembros de la struct será private por defecto a menos que se especifique lo contrario.

ACTUALIZACIÓN: Dirigirse a la confusión sobre el acceso por defecto, internal es el acceso predeterminado para el struct o class sí si se declara en el nivel de espacio de nombres (no anidada en otra clase/struct):

clases y estructuras que se declaran directamente dentro de un espacio de nombres (en otras palabras, que no están anidados dentro de otras clases o estructuras) puede ser público o interno. Internal es el valor predeterminado si no se especifica el modificador de acceso.

Mientras, los campos de un class o struct siempre por defecto a private:

El nivel de acceso para miembros de la clase y los miembros de la estructura, incluyendo clases anidadas y estructuras, es privado de forma predeterminada.

A partir del MSDN.

+0

muchas gracias, por lo que incluso es estático, aún es privado ... ¿verdad? – fiftyplus

+0

@gpakillsme: No, técnicamente el valor predeterminado es 'interno', aunque la distinción puede no ser importante para su caso. Consulte [aquí] (http://msdn.microsoft.com/en-us/library/ms173121.aspx) para obtener más información. –

+1

@BlueRaja: En realidad, interno es el valor predeterminado para una estructura/clase no anidada en sí misma (es decir, 'struct AT_CMD' es lo mismo que' internal struct AT_CMD' si no está anidado). El valor predeterminado para miembros de clase/struct es 'private'. –

2

declararlos como esto:

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

Sin embargo, parece que quiere decir que estos son constantes. En ese caso, realmente deberían declararse así:

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

Yo recomendaría un 'ReadOnlyCollection ' aquí, por nada más que por la claridad. –

+0

@Mr.Decepción: 'ReadOnlyCollection ' rara vez se usa en la práctica; por cualquier razón, 'IEnumerable ' es casi * siempre * preferred * (probablemente porque no requiere una copia) *. Dicho esto, 'IEnumerable ' no tiene un indexador, mientras que 'ReadOnlyCollection ' sí lo hace, por lo que si eso es importante, 'ReadOnlyCollection ' puede ser su única opción. –

Cuestiones relacionadas