2009-05-08 31 views

Respuesta

20

¿Por qué C no admite el método estático variables?

Q: En C++, es posible escribir una variable método estático , y tienen una variable que sólo se puede acceder desde el interior del método. C# no proporciona esta característica. ¿Por qué?

A: Hay dos razones por las que C# no tiene tiene esta característica.

primer lugar, es posible conseguir casi el mismo efecto por tener un nivel de clase estática, y añadiendo método estática requerirían una mayor complejidad .

En segundo lugar, la estática de nivel de método son un tanto conocidos por causar problemas cuando el código se llama repetidamente o de múltiples hilos, y dado que las definiciones están en los métodos , es más difícil encontrar las definiciones .

- msdn c# faq

+3

> "notorio por causar problemas cuando se llama código de forma repetida o desde múltiples hilos" - Gracioso, porque la implementación de VB.Net se considera segura para subprocesos. –

+11

Thread-safe y hacer lo que espera son dos cosas diferentes ... –

+2

¿Cómo se comprobó esto como la mejor respuesta? La respuesta simplemente es no. Se dice, pero sigue siendo un no. La respuesta proporcionada aquí, que es una cita de Eric Gunnerson, es la salida de Mircosoft. Es útil simple como eso. BTW, Java ha tenido esta habilidad desde al menos 1.2 y C++ durante el tiempo que puedo recordar. Uno pensaría que un lenguaje que combina C++, Java y VB sería compatible con las cosas que los tres tenían en común.Si hay tres idiomas que lo respaldan, debe haber una buena razón, y abandonarla con esas dos razones es cojo y obviamente están ocultando algo. –

3

Lo más parecido a VB.NET de Static es la creación de un campo en el tipo actual. Aparte de eso C# no tiene equivalente.

1

No, CLR no es compatible con esto, y VB.NET recurre a trucos de compilación para permitirlo. Ugh.

+3

Si no le gustan los trucos del compilador, ¿usa la palabra clave "yield" en C#? –

+0

¿Cómo es un truco de compilación? Es solo una variable miembro que tiene una visibilidad reducida. –

+0

Yo tampoco uso rendimiento. Me gustaría que los métodos de variables estáticas, aunque – rotard

4

No hay pero no en qué se diferencia luego tener una variable estática en el nivel de clase?

Actually if you look en cómo se implementa compartido, es un truco de compilación que crea un campo estático en la clase.

+1

Sí, es exactamente lo mismo que tener uno a nivel de clase. Solo se permite declarar a nivel de método porque la palabra clave estática de VB heredada significaba que el valor de un local persistiría después de la función/subvuelta. – x0n

+0

Es diferente porque el "truco del compilador" de VB también usa la clase de monitor para asegurarse de que es seguro para subprocesos y porque tiene un alcance para el método, por lo que el acceso en otro lugar fallará (mejor semántica). –

+0

Su único ámbito porque el nombre del método se utiliza para nombrar la variable. Y supongo que si quisieras que sea inseguro en C#, implementarías un monitor también. Prefiero que C# implemente una seguridad de subprocesos estáticos que envuelva el acceso a la variable como lo hacen en VB, pero no se preocupe por el alcance de un método. – JoshBerke

-5

estoy bastante seguro de que el equivalente C# es const: por lo tanto:

 
public const Collection myCollection = new Collection(); 

No estoy muy familiarizado con VB.NET, por lo que podría ser fuera de la base, pero que le permitirá configurar una variable que no puede ser cambiado

+1

variables estáticas no son constantes. Una variable estática es aquella en la que cada instancia de la clase comparte la misma instancia variable. La variable es mutable, y un cambio al valor en una clase cambiará el valor en todas las demás instancias de esa clase. – NerdFury

+0

Corrección leve. Una variable estática en C# es compartida. En VB, una variable estática solo se comparte si la función que lo contiene se comparte. –