2011-03-28 13 views
9

Soy bastante nuevo en la programación de C#, por lo que esta es una pregunta para principiantes.Nivel de protección de un campo struct dentro de una clase

obtengo un "'A.Test.That.Fails' es inaccesible debido a su nivel de protección" error en el siguiente fragmento de código y no entiendo el motivo.

namespace A 
{ 
    class Test 
    { 
     public void Demo() 
     { 
      That[] it = new That[42]; 
      it[0].fails = 21; 
     } 

     public struct That 
     { 
      int fails; 
     } 
    } 
} 

Viniendo de programación C++ y después de leer las normas de protección que son casi los mismos, ya que existe una sola clase que se puede esperar que funcione incluso si tanto el That estructura y el método Demo eran private.

Como nota al margen, un enlace a algunas páginas que resumen el alcance y las reglas de protección para el programador C++ sería muy apreciado.

+12

'A.Test.That.fails' .. ingenioso +1 – BoltClock

+2

Ver la respuesta de Cody; hay una gran diferencia entre las estructuras y las clases en C#; Apenas están relacionados, de hecho. La mayoría de las veces que las personas usan una estructura en C#, es incorrecta. Asegúrate de usarlo por la razón correcta. "Debido a que es un objeto simple" no es una razón. –

+0

@BoltClock:;) @Marc: ¿será una excusa "porque solo quiero una matriz rápida de pares escalares"? –

Respuesta

10

Las otras respuestas dadas ya tienen su respuesta, así que no voy a vencer a un caballo muerto aquí. Debe declarar el campo public para poder acceder a él desde un código externo.

En C++, las estructuras y las clases son equivalentes, con la única diferencia que es el nivel de acceso predeterminado de sus miembros respectivos.

Sin embargo, ese no es el caso en C#. En general, solo debe usar una estructura para objetos pequeños, de vida corta, que sean inmutables (no cambiarán). Una estructura tiene tipo de valor semántica, donde como clase tiene tipo de referencia semántica. Es muy importante que comprenda la diferencia entre los tipos de valores y los tipos de referencia si está aprendiendo a programar en C#. Jon Skeet ha publicado an article que intenta proporcionar esa explicación. Pero definitivamente querrá elegir un buen libro introductorio a C# que trate estos problemas con más detalle.

La mayoría de las veces, querrá usar una clase en C#, en lugar de una estructura. Y cuando use esa clase, tenga en cuenta que las pautas de diseño de Microsoft para C# tienden a recomendar en contra de exponiendo campos públicos. En cambio, recomiendan que use una propiedad pública, respaldada por un campo privado. Una exposición más completa de la razón de ser de esa directriz se da here. Por ejemplo:

class TimePeriod 
{ 
    private double seconds; 

    public double Seconds 
    { 
     get { return seconds; } 
     set { seconds = value; } 
    } 
} 

O puede utilizar el sencillo "propiedades automáticas" sintaxis, que tiene el compilador generará automáticamente ese campo respaldo privado:

class TimePeriod 
{ 
    public double Seconds { get; set; } 
} 
+0

Sí, por el bien del ejemplo que puse en público, pero en la vida real las cosas son lo más privadas posible, y esta capacidad para definir set/get claramente ayuda. Gracias por la descripción general y el enlace. –

+1

@Julien: por supuesto. Supuse que el ejemplo fue ideado solo con fines de demostración. Obviamente, en el mundo real existen casos legítimos en los que desea utilizar una estructura. No solo para la semántica del tipo de valor, sino también para fines de interoperabilidad. Pero, en general, los objetos se modelan mejor usando una clase en C#. –

+0

+1 La interoperabilidad de Win32 me ha forzado a utilizar estructuras de mi aplicación WPF ... y la estoy detestando. – BoltClock

3

El modificador de acceso predeterminado en C# para los campos de estructura (y campos de clase) es private. Entonces int fails; es privado para su estructura, a menos que usted lo declare público.

+0

¡Ay! Muchas gracias. –

2

consulte la respuesta a this question

Ese miembro se declara privada por defecto - que necesita para poner el modificador public antes.

+0

Genial, muchas gracias! –

1

Los miembros privados de Test se limitan a Test y no están disponibles fuera de Test. Demo está fuera de Test. No importa quién es el padre.

Defina Demo dentro de Prueba y puede acceder a los miembros privados.

+0

Demo está fuera de prueba? – V4Vendetta

+0

Por supuesto. No está dentro de la definición de Prueba, por lo que está afuera. QED. Para estar dentro, necesita estar dentro de las llaves de la estructura Test. –

2

Debido fails no es public .. por defecto de los campos en struct e incluso son classprivate

Según MSDN

El nivel de acceso para clase miembros y struct miembros, incluidas las clases y estructuras anidadas, es privado por predeterminado.

+0

Ok, lo obtuve, no como C/C++ donde los campos struct son públicos por defecto. Gracias. –

+0

de nada .. He agregado un enlace al documento de MSDN para su referencia. :) –

Cuestiones relacionadas