2008-10-01 18 views
6

en VB.Net, que se puede declarar una variable en una función como estática, de esta manera:C# funciones con datos estáticos

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 utilizar 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

Respuesta

13

¡Ja! 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 ese conocimiento, me encontré con esto:
http://weblogs.asp.net/psteele/articles/7717.aspx

Ese artículo explica que en realidad no es apoyada por el CLR, y el compilador de VB crea una (compartido) variable estática "bajo el capó" en la clase de método. Para hacer lo mismo en C#, tengo que crear la variable yo mismo.

Más que eso, 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.

+0

Y pensar que iba a proxeneta mi propio blog (donde abordé esto hace un par de meses) ... Pero que haya guardado yo el problema, y ​​esa entrada es considerablemente más clara que la mía. Gracias por el enlace! –

+0

También puede consultar el código IL/C# generado por VB utilizando un reflector, lo noté hace algún tiempo. También es divertido ver qué posibles trucos de VB se pueden hacer en C# – faulty

4

Desafortunadamente no hay un 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#.

6

Personalmente me alegro de que C# no tiene 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.

+0

Estoy de acuerdo en que usar esto para guardar el estado con un método es una mala idea. Tenga en cuenta que en este caso el propósito es asegurarse de que la creación/compilación de la expresión regular ocurra solo una vez. Se podría decir que es una forma de estado, pero creo que se trata de rendimiento, no de mantener datos entre llamadas a métodos. –

+0

En ese caso, está bien simplemente ser un campo de solo lectura estático. Es un estado inmutable asociado con el tipo, inicializado cuando se inicializa el tipo. Tener sentido como algo estático para mí :) –

+0

Supongo que todavía no has trabajado con Closures. Literalmente son estado mutable almacenado en un método. –

1

tienes que declarar esto en el nivel de clase:

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

Eso debería funcionar en este caso, pero en el sentido general es más complicado porque puede haber problemas de concurrencia en una aplicación de subprocesos múltiples. Se supone que el miembro estático de VB.Net es seguro para subprocesos. –

Cuestiones relacionadas