2010-03-26 17 views

Respuesta

353

El valor por defecto de acceso para todo en C# es "el acceso más restringido que podría declarar para ese miembro".

Así, por ejemplo:

namespace MyCompany 
{ 
    class Outer 
    { 
     void Foo() {} 
     class Inner {} 
    } 
} 

es equivalente a

namespace MyCompany 
{ 
    internal class Outer 
    { 
     private void Foo() {} 
     private class Inner {} 
    } 
} 

El tipo de excepción a esto está haciendo una parte de una propiedad (por lo general el colocador) más restringida que la accesibilidad declarada de la propiedad en sí:

public string Name 
{ 
    get { ... } 
    private set { ... } // This isn't the default, have to do it explicitly 
} 

Esto es lo que la especificación de C# 3.0 tiene que decir (sección 3.5.1):

Dependiendo del contexto en el que una declaración miembro lleva a cabo, sólo se permiten ciertos tipos de declarada accesibilidad. Además, cuando una declaración de miembro no incluye ningún modificador de acceso, el contexto en el que tiene lugar la declaración determina la accesibilidad declarada predeterminada.

  • Los espacios de nombres tienen implícitamente acceso público declarado. No se permiten modificadores de acceso en las declaraciones de espacio de nombres .
  • Los tipos declarados en unidades de compilación o espacios de nombres pueden tener pública o accesibilidad interna declarada y por defecto a accesibilidad interna declarada.
  • Los miembros de la clase pueden tener cualquiera de los cinco tipos de accesibilidad declarada y de forma predeterminada a la accesibilidad declarada privada . (Tenga en cuenta que un tipo declara como un miembro de una clase puede tener cualquiera de los cinco tipos de declarada accesibilidad, mientras que un tipo declarado como miembro de un espacio de nombres puede tener única pública o interna declarada accesibilidad.)
  • Los miembros de Struct pueden tener acceso público, interno o privado declarado y acceso predeterminado a privado declarado porque las estructuras están implícitamente selladas. Los miembros de estructura introducidos en una estructura (es decir, no heredada por esa estructura) no pueden tener protegido o protegido interno declarado acceso. (Tenga en cuenta que un tipo declarada como miembro de una estructura puede tener accesibilidad pública, interna o privada declarada, mientras que un tipo declara como un miembro de un espacio de nombres sólo puede tener acceso público o interno declarado.)
  • Los miembros de la interfaz implícitamente tienen acceso público declarado. No se permiten modificadores de acceso en declaraciones de miembro de interfaz .
  • Los miembros de enumeración tienen implícitamente acceso público declarado. No se permiten modificadores de acceso en declaraciones de miembros de enumeración.

(Tenga en cuenta que los tipos anidados caerían bajo los "miembros de la clase" o "miembros de la estructura" partes -. Y por lo tanto de forma predeterminada visibilidad privada)

+0

"el acceso más restringido que podría declarar para ese miembro" ... no es cierto para los constructores, ya que el acceso más restringido es privado, pero el predeterminado está protegido. –

+14

@ZaidMasud: No, no lo es. Si declara un constructor y no especifica una accesibilidad, será privado. Ver la sección 10.3.5 de la especificación de C#. –

+1

Gracias echaremos un vistazo ...Estaba (erróneamente) asumiendo que la respuesta de John Buchanan a continuación era correcta. –

115
top level class: internal 
method: private 
members (unless an interface or enum): private (including nested classes) 
members (of interface or enum): public 
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined) 
delegate: internal 
interface: internal 
explicitly implemented interface member: public! 
+1

ya esto es lo que quiero gracias Mr.John Buchanana –

+11

Esto no quiere dejar claro que si una clase es también un miembro (debido a ser un tipo anidado), entonces el valor predeterminado es privado. Además, los miembros de una interfaz y una enumeración son siempre públicos. –

+1

¿Solo agrega las palabras "nivel superior" antes de "clase" y las clases anidadas estarán cubiertas por "miembros"? – Draemon

11

Tenga una mirada en Access Modifiers (C# Programming Guide)

clase y Struct Accesibilidad
interno es el valor por defecto si no se especifica el acceso modificador.

clase y Struct miembro de Accesibilidad
miembros de la Clase (incluyendo clases anidadas y estructuras) se pueden declarar con cualquiera de los cinco tipos de acceso. Los miembros de Struct no pueden declararse como protegidos porque las estructuras no son compatibles con la herencia.

La accesibilidad de un miembro de puede no ser mayor que el accesibilidad de su tipo que contiene

operadores definidos por el usuario siempre deben ser declarados como pública. Para obtener más información sobre , consulte al operador (C# Referencia).

Destructores no pueden tener accesibilidad modificadores.

Otros Tipos
interfaces declaradas directamente con un espacio de nombres pueden ser declaradas como pública o interna y como clases y las estructuras, interfaces por defecto para el acceso interno. Los miembros de enumeración son siempre públicos, y no se pueden aplicar modificadores de acceso

De forma predeterminada, los delegados tienen acceso interno .

+6

Este bit me concierne: "La accesibilidad de un miembro nunca puede ser mayor que la accesibilidad de su tipo contenedor" - considere la 'clase interna Foo: IDisposable {public void Dispose() { }} '. Además, "de forma predeterminada, los delegados tienen acceso interno" es incorrecto: si se declaran dentro de un tipo, serán privados. Del mismo modo "Internal es el valor predeterminado si no se especifica ningún modificador de acceso" solo es cierto para los tipos de nivel superior. –

+0

Esto es de la documentación de MS, pero gracias de todos modos X-) –

+0

Downvoted por la inexactitud, aunque, por supuesto, es la página la que realmente tiene la culpa: no se debía saber que MSDN no sería digno de confianza en este frente. Veré si la especificación de C# tiene un bit similar para citar. –

0

nivel de espacio de nombres: internal

nivel Tipo: private

+2

@leppie: ¿podría darnos un ejemplo de qué es el nivel de espacio de nombres frente al nivel de tipo? –

+0

Nivel de espacio de nombres, cosa que puede declarar en un espacio de nombres. Escriba el nivel, las cosas que puede declarar en un tipo. – leppie

+3

Miembros de una interfaz? –

1

interna es el modificador por defecto

93

Respuesta corta: mínimo acceso posible (consulte la respuesta de Jon Skeet).

Respuesta larga:

no anidados tipos, enumeración y delegado accesibilidades (sólo se puede tener acceso interno o público)

     | Default | Permitted declared accessibilities 
------------------------------------------------------------------ 
namespace   | public | none (always implicitly public) 

enum     | public | none (always implicitly public) 

interface   | internal | public, internal 

class    | internal | public, internal 

struct    | internal | public, internal 

delegate    | internal | public, internal 

Nes Ted tipo y miembro de accessiblities

     | Default | Permitted declared accessibilities 
------------------------------------------------------------------ 
namespace   | public | none (always implicitly public) 

enum     | public | none (always implicitly public) 

interface   | public | none 

class    | private | All¹ 

struct    | private | public, internal, private² 

delegate    | private | All¹ 

constructor   | private | All¹ 

interface member  | public | none (always implicitly public) 

method    | private | All¹ 

field    | private | All¹ 

user-defined operator| none  | public (must be declared public) 

¹ Todo === pública, protegida, interna, privada, interna protegida

² estructuras no pueden heredar de estructuras o clases (por más que puedan, las interfaces) , por lo tanto protegido no es un modificador válido

La accesibilidad de un tipo anidado depende de su dominio de accesibilidad, que está determinado por la accesibilidad declarada de la memb er y el dominio de accesibilidad del tipo que contiene inmediatamente. Sin embargo, el dominio de accesibilidad de un tipo anidado no puede exceder el del tipo contenedor.

Nota: CIL también tiene la provisión para protegida e interna (en contraposición al protegidas existentes "o" interna), pero que yo sepa esto no está actualmente disponible para su uso en C#.


Ver:

http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en-us/library/cx03xt0t.aspx
(Hombre que yo amo ... Microsoft URI)

+0

Tengo una pequeña confusión sobre enum. Aunque público es correcto, pero creo que el modificador de acceso predeterminado es interno. La clase – dotnetstep

2

me gustaría añadir un poco de enlace de documentación. Ver más detalles here.

enter image description here

+1

es por defecto interna y no privada. – Baahubali

+1

¿Dónde escribí la clase es privada? – UnKnown

+0

Esta tabla es válida solo para tipos anidados. La clase – BlueSilver

Cuestiones relacionadas