2012-07-02 16 views
13

Los modificadores de acceso como public, private no están permitidos en constructores estáticos en C#. Sin embargo, el análisis de código de Visual Studio tiene una advertencia en la categoría de seguridad C# que dice "CA2121: Static constructors should be private".¿Cómo pueden los constructores estáticos no hacerse privados?

¿Es posible hacer que un constructor estático no sea privado? ¿O es un error del análisis de código de Visual Studio?

ACLARACIÓN: No estoy tratando de hacer cualquier constructor no privado. ¿Entonces por qué?" las preguntas son irrelevantes. Solo tengo curiosidad sobre la contradicción entre dos herramientas de Microsoft y quiero ver si hay algo que no sé sobre cómo se manejan los constructores estáticos.

+0

Una cita del enlace de arriba: 'El usuario no tiene control sobre cuándo se llama al constructor estático. Si un constructor estático no es privado, puede ser llamado por un código que no sea el sistema. Dependiendo de las operaciones que se realizan en el constructor, esto puede causar un comportamiento inesperado. – Tisho

+1

Creo que la cita relevante es "Esta regla es impuesta por los compiladores C# y Visual Basic .NET". Entonces, no, no puedes hacerlo no privado en C#. – Henrik

Respuesta

9

Un constructor estático C# siempre es privado. Nunca debería ver esa advertencia para el código C#, y la advertencia no es útil allí. Code Analysis también está disponible para otros idiomas, y son esos otros lenguajes los que pueden hacer que escriba clases con constructores estáticos no privados.

+0

Entonces, ¿por qué se establece como aplicable a C#? ¿Crees que ese es el error? –

+0

@ssg ¿Dónde se dice eso? – hvd

+0

@ssg Si se refiere a la "Esta regla es aplicada por los compiladores C# y Visual Basic .NET."mencionado en el comentario sobre tu pregunta, entonces no, eso significa que el compilador ya asegura que los constructores estáticos son privados, lo que significa que esta advertencia nunca debería desencadenar. – hvd

3

Si usted lee la documentación que establece claramente

Si un constructor estático no es privado, se le puede llamar por código distinto del sistema. Dependiendo de las operaciones que se realizan en el constructor, esto puede causar un comportamiento inesperado.

supongo que la pregunta más importante sería por qué le gustaría a?

+0

El caso es que no puedo. El compilador arroja un error cuando intento anteponer el estático con un modificador de acceso. Tal vez en el nivel de IL? –

+0

C# no permite que elctor no sea privado, consulte el comentario anterior de Hendriks. – usr

+0

@ssg Me preguntaría * por qué * usted necesita que sea algo más que 'privado'. Seguramente diría que es más probable que su diseño sea incorrecto que el equipo de C# que pierde un truco para el uso de constructores estáticos no privados. – James

1

¿Es posible crear un constructor estático no privado?

¿Cuál sería el sentido de ello?

Un constructor estático se llama el momento en que la clase se carga desde el enlazador, antes de que se ejecute cualquier método. Como tal, un constructor estático no podría ser llamado fuera de la llamada automática desde el enlazador, lo que significa que no tiene sentido tener ningún modificador de acceso.

Básicamente no se puede hacer referencia a una clase SIN EL EJECUTOR DE MODIFICADOR ESTÁTICO, y eso antes de que se ejecute el código que incluye la referencia.

Cuestiones relacionadas