2009-05-05 8 views
32

En Visual Studio cuando agrega una nueva clase, siempre se crea sin modificadores y eso hace que la clase sea interna.¿Por qué Visual Studio no crea una clase pública de forma predeterminada?

class MyClass 
{ 
} 

Preferiría que mi clase por defecto se cree como pública.

¿Por qué es interno por defecto?

¿Qué prefieres?

+12

Ahora bien, si solo estaba sellado por defecto, así sería perfecto. –

+1

Esta no es una pregunta duplicada a la marcada. Esta pregunta específicamente pregunta por qué, no cómo cambiarla. – Syndog

+0

Si desea modificar el comportamiento predeterminado, consulte esta pregunta/respuesta ... [http://stackoverflow.com/questions/700086/how-do-you-default-a-new-class-to-public- when-creating-it-in-visual-studio] (http://stackoverflow.com/questions/700086/how-do-you-default-a-new-class-to-public-when-creating-it-in -visual-studio) –

Respuesta

25

Hacer la clase internal tiene perfecto sentido para mí: mantén tus partes privadas y solo expone explícitamente las partes que realmente necesitan ser expuestas: todo lo demás es solo detalles de implementación y no debe ser visible para el mundo exterior.

En caso de que quiera probar sus internal clases, .NET 2.0 en adelante introduce un nuevo atributo llamado InternalsVisibleToAttribute, que

Especifica que los tipos que son normalmente visibles sólo dentro del conjunto actual son visibles a otro montaje.

Si esto realmente le molesta, vea %ProgramFiles%\Microsoft Visual Studio 8\Common7 IDE\ItemTemplates\CSharp\1033\Class.zip. Esta es una plantilla que puede cambiar para satisfacer sus necesidades. ReSharper tiene una capacidad similar, pero se puede acceder directamente desde dentro de la UI.

+9

ReSharper crea clases públicas por defecto. Y eso tiene perfecto sentido para mí. – Vadim

+0

Puede usar InternalsVisbleToAttribute solo con ensambles de firmas fuertes. – Vadim

+4

@Vadim: Estás equivocado. –

4

C# tiende a configurar todo al alcance mínimo necesario. Esta es una buena convención y citado en el libro de Skeet (C# In Depth, p 224 "Nota/Trivia"):

[propiedades son las] único lugar en el “privado” se requiere -Everywhere demás en C#, el modificador de acceso predeterminado en cualquier situación dada es el más privado posible. En otras palabras, si algo puede declararse como privado, omitir los modificadores de acceso por completo lo convertirá en privado. Este es un buen elemento de diseño del lenguaje, porque es difícil equivocarse accidentalmente: si desea que algo sea más público de lo que es, lo notará cuando intente usarlo.

+7

En realidad, las clases son internas por defecto. Los miembros de la clase son privados. –

+0

Intenta crear una clase con un reflector. – Vadim

+2

Joe es correcto. Las clases * no pueden * ser privadas (a menos que estén anidadas dentro de otros tipos), aunque sus miembros por defecto sí lo son. – Noldorin

1

Curiosamente esto sólo sucede en C# - en vb.net se obtiene una clase pública por defecto.

Personalmente, prefiero una clase pública por defecto ya que generalmente otras clases necesitan acceso a ella. (La mayor parte de mi trabajo es en la capa de datos, aunque)

+1

¿Hay otras clases fuera de su ensamblaje que realmente necesiten acceso a la mayoría de sus clases? Lo dudo, pero si es así, ¡debería reconsiderar cómo agrupa las clases en asambleas! C# se establece por defecto en interno, donde todas las clases en el mismo conjunto tienen acceso. –

+2

Lo hacen en la capa de datos ... – Pondidum

1

se podían cambiar las plantillas para una clase C# - Por lo general se encuentra en "C: \ Archivos de programa (x86) \ Microsoft Visual Studio 9.0 \ VC#"

o incluso crea tu propia plantilla.

+0

sarnath'd - personalmente Me gusta que se me pida una palabra clave real, pero el 99% de las veces mis clases son públicas. Hmm, tal vez sea un olor de diseño ... – annakata

2

Lo prefiero tal como es. De esta forma, debe decidir conscientemente que quiere que se exponga al público.Es muy parecido al argumento: ¿quieres que tu computadora esté abierta al mundo exterior de forma predeterminada o prefieres configurarla para el acceso a Internet tú mismo?

Ambos enfoques tienen sus ventajas, uno tiene importantes implicaciones de seguridad potencial que creo que usted debe conocer y tomar una decisión consciente en lugar de simplemente suceder de manera automática.

+0

Buen argumento, en mi opinión. Optar por la exposición pública es preferible a la exclusión voluntaria. – Noldorin

1

Personalmente, lo prefiero como es, te obliga a pensar activamente qué clases quieres hacer públicas.

En última instancia, lo predetermina en un diseño de API más limpio y, por lo tanto, un software más amigable. No querrás exponer el funcionamiento interno de tu código, lo que inevitablemente ocurriría si todo se convirtiera en público.

Esto es algo subjetivo, personalmente prefiero todo a apagado y encender solo lo que no necesito al revés.

0

Es una buena práctica en todas las áreas de código mantener las cosas lo más restringidas posible. Sin una razón específica para ser diferente, todo debe ser privado, de solo lectura (mejor aún const) y estático. Si una variable, método o propiedad puede ser privada, hágalo privado. Si no puede ser privado, pero puede protegerse, hágalo protegido. Si puede ser de solo lectura, hazlo de solo lectura. Si puede ser estático, hágalo estático. Lo mismo es cierto para las clases: deben ser internas por defecto, y hacerse públicas solo cuando haya decidido que esta es una clase que desea exportar.

3

para crear una clase pública por defecto para el año 2012 de Visual Studio:

Editar este archivo: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs

Para tener este aspecto:

using System; 
using System.Collections.Generic; 
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq; 
$endif$using System.Text; 
$if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks; 
$endif$ 
namespace $rootnamespace$ 
{ 
    public class $safeitemrootname$ 
    { 
    } 
} 

Más información: http://aaron-hoffman.blogspot.com/2013/05/edit-default-visual-studio-2012-item.html

Cuestiones relacionadas