variable usar son qué programacion métodos metodos metodo los estáticos estaticos estatico entre diferencia cuando clase atributos atributo c# .net vb.net

usar - Funciones de C#con datos estáticos



static programacion (4)

En VB.Net, puedo declarar una variable en una función como estática, como esta:

Function EncodeForXml(ByVal data As String) As String Static badAmpersand As Regex = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)") data = badAmpersand.Replace(data, "&") ''''// more processing return data End Function

Tenga en cuenta que necesito usar la palabra clave Static , en lugar de Shared , que es la forma normal de expresar esto en VB.Net. ¿Cómo puedo hacer esto en C #? No puedo encontrar su equivalente


¡Decir ah! Al publicar la pregunta, ¡encontré la respuesta! En lugar de googlear para C #, debería haber estado buscando detalles sobre cómo VB.Net lo implementa y escribiendo la pregunta que me pareció evidente. Después de aplicar esa idea, encontré esto:
http://weblogs.asp.net/psteele/articles/7717.aspx

Ese artículo explica que realmente no es compatible con el CLR, y el compilador de VB crea una variable estática (compartida) "debajo del capó" en la clase del método. Para hacer lo mismo en C #, tengo que crear la variable yo mismo.

Además, utiliza la clase Monitor para asegurarse de que el miembro estático también es seguro para la ejecución de subprocesos. Bonito.

Como nota al margen: esperaría ver esto pronto en C #. La táctica general que he observado de MS es que no le gusta que VB.Net y C # se distancien demasiado de las características. Si un idioma tiene una característica no compatible con el otro, tiende a convertirse en una prioridad para el equipo de idioma para la próxima versión.


Desafortunadamente, no hay ningún equivalente en C #.

Tendrá que usar una variable de nivel de clase.

Esta es una de las pocas cosas que tiene VB que deseo que tenga C #.


Personalmente, me alegra que C # no tenga esto. Lógicamente, los métodos no tienen estado: los tipos y las instancias sí. C # hace que ese modelo lógico sea más claro, IMO.


Tienes que declarar esto en el nivel de clase:

private static readonly RegEx badAmpersand = new RegEx("...");