2012-06-07 3 views
7

В C я могу сделатьЕсть ли эквивалент статичности C в C#?

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

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

он должен напечатать 0,1,2,3

Есть ли эквивалент в C#?

+0

Но я хочу сделать именно то, как в приведенном выше коде C. Возможно? – Jack

+1

no Вы не можете иметь локальные статические переменные в C#. Наличие переменной класса так же близко, как вы можете получить – shf301

ответ

3

Что-то вроде:

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

ooh избил меня до удара .... –

+0

Только «вид», 'c' виден всем методам. –

+0

@pst Я не думаю, что существует способ определения статических переменных в C# без использования внутреннего/внешнего шаблона. –

2

В C# нет глобалов, однако вы можете создать статическое поле внутри своего класса.

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

Только «вид», 'c' виден всем методам. –

+0

'WriteLine()' тип данных '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Вам не нужно преобразовывать его в строку. Только: 'Console.WriteLine (C++);' –

+1

Я думаю, что «член» или «поле» - это слово, которое вы ищете, а не «постоянное», так как a) это не постоянно, а b) true константы объявляются с помощью 'const', а не' static', как в 'private static const int Zero = 0'. – Ruben

2

Вы не можете сделать это на уровне метода. Самое близкое, что вы можете сделать на уровне метода, это что-то вроде этого, и это не так уж близко. В частности, он работает только в том случае, если у вас есть ссылка на счетчик. Если кто-то еще называет этот метод, они не будут видеть ваши изменения.

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(); 
     } 
    } 

Что интересно, VB.NET поддерживает статические локальные переменные: http://weblogs.asp.net/psteele/pages/7717.aspx. Как отмечает эта страница, сама .NET этого не поддерживает, но компилятор VB.NET подделывает ее, добавляя переменную статического класса.

+1

Yikes! Также обратите внимание, что это не очень глобально/статично, так как вам нужно постоянно отслеживать счетчик 'x'. Статическое поле намного ближе к статической переменной в C, кроме видимости, которая более шире в C# для статического поля, чем для статической переменной в C. – Ruben

+0

Я знаю об этом :). Я не знаю всей причины, почему OP хотел сделать что-то подобное, поэтому я включил это просто как то, что он * может хотеть посмотреть. Наверное, я должен удалить, прежде чем я снова закрою. :) – aquinas

+1

Если по этому пути я предпочел бы использовать «нормальное» закрытие, но интересный подход ... и так как это не говорит «использовать статический член», ну, +1! –

3

Нет нет никакого способа, чтобы добиться такого же поведения, как статической переменной с функцией ...

3

В то время как некоторые из них предложили в качестве staticчлен переменной, это не является не то же самое из-за видимости. В качестве альтернативного к ответу Аквинского, если закрытия принимаются, то это можно сделать:

(Обратите внимание, что Foo аа свойство и не метод и c является «в случае ».)

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 

Однако C# не имеет никакого прямого эквивалентный static переменной в C.

Счастливое кодирование.

Смежные вопросы