2012-06-07 21 views
7

En C que puedo hacer¿Hay un equivalente de estática de C en C#?

void foo() { 
    static int c = 0; 
    printf("%d,", c); 
    C++; 
} 

foo(); 
foo(); 
foo(); 
foo(); 

debe imprimir 0,1,2,3

¿Hay un equivalente en C#?

+0

Pero quiero hacer exactamente cómo en el código C. ¿Es posible? – Jack

+1

no, no puede tener variables locales estáticas en C#. Tener una variable de clase es lo más cercano que se puede obtener – shf301

Respuesta

3

Algo así como:

class C 
{ 
    private static int c = 0; 
    public void foo() 
    { 
     Console.WriteLine(c); 
     c++; 
    } 
} 
+0

ooh me golpeó al golpe .... –

+0

Solo "tipo de", "c" es visible para todos los métodos. –

+0

@pst No creo que haya una forma de determinar las variables estáticas en C# sin utilizar un patrón interno/externo. –

2

No hay valores globales en C#, sin embargo, puede crear un campo estático dentro de su clase.

public class Foo{ 
    private static int c = 0; 
    void Bar(){ 
     Console.WriteLine(c++); 
    } 
} 
+0

Solo "tipo de", "c" es visible para todos los métodos. –

+0

'WriteLine()' acepta el tipo de datos 'object'. No es necesario convertirlo a cadena. Solo hacer: 'Console.WriteLine (C++);' –

+1

Creo que "miembro" o "campo" es la palabra que está buscando, no "constante", ya que a) esto no es constante a propósito, yb) verdadero las constantes se declaran con 'const' en lugar de' static', como en 'private static const int Zero = 0'. – Ruben

2

Usted no puede hacerlo a un nivel de método. Lo más cercano que puede hacer a nivel de método es algo como esto, y esto no es tan cercano. En particular, solo funciona si tiene una referencia al enumerador. Si alguien más llama a este método, no verán sus cambios.

class Program { 
     static IEnumerable<int> Foo() { 
      int c = 0; 
      while (true) { 
       c++; 
       yield return c; 
      } 
     } 
     static void Main(string[] args) { 
      var x = Foo().GetEnumerator(); 
      Console.WriteLine(x.Current); //0    
      x.MoveNext(); 
      Console.WriteLine(x.Current); //1 
      x.MoveNext(); 
      Console.WriteLine(x.Current); //2 
      Console.ReadLine(); 
     } 
    } 

Lo interesante es que VB.NET es compatible con las variables locales estáticas: http://weblogs.asp.net/psteele/pages/7717.aspx. Como se señala en esta página, .NET por sí mismo no es compatible con esto, pero el compilador de VB.NET lo falsifica agregando una variable de nivel de clase estática.

+1

¡Yikes! También tenga en cuenta que esto no es realmente muy global/estático, ya que tendrá que realizar un seguimiento del enumerador 'x' todo el tiempo. Un campo estático está mucho más cerca de una variable estática en C, aparte de la visibilidad, que es más amplia en C# para un campo estático que para una variable estática en C. – Ruben

+0

Estoy al tanto de eso :). No sé la razón por la cual el OP quería hacer algo así, así que lo incluí simplemente como algo que él * puede * querer ver. Supongo que debería eliminar antes de obtener downvoted más. :) – aquinas

+1

Si sigo esta ruta prefiero usar un cierre "normal", pero un enfoque interesante ... y ya que esto no dice "use un miembro estático", bueno, ¡+1! –

3

No hay ninguna manera de lograr el mismo comportamiento que la variable estática función c ...

3

Mientras que algunos han sugerido como miembro de static variables, esta no es la misma debido a la visibilidad. Como alternativa a la respuesta de Aquino, si cierres se aceptan, entonces esto se puede hacer:

(Tenga en cuenta que Foo es AA propiedad y no un método y que c es "por instancia ".)

class F { 
    public readonly Action Foo; 
    public F() { 
     int c = 0; // closured 
     Foo =() => { 
      Console.WriteLine(c); 
      c++; 
     }; 
    } 
} 

var f = new F(); 
f.Foo(); // 0 
f.Foo(); // 1 

sin embargo, C# tiene no directo equivalente a una variable static en C.

Happy coding.

Cuestiones relacionadas