В C я могу сделатьЕсть ли эквивалент статичности C в C#?
void foo() {
static int c = 0;
printf("%d,", c);
C++;
}
foo();
foo();
foo();
foo();
он должен напечатать 0,1,2,3
Есть ли эквивалент в C#?
В C я могу сделатьЕсть ли эквивалент статичности C в C#?
void foo() {
static int c = 0;
printf("%d,", c);
C++;
}
foo();
foo();
foo();
foo();
он должен напечатать 0,1,2,3
Есть ли эквивалент в C#?
Что-то вроде:
class C
{
private static int c = 0;
public void foo()
{
Console.WriteLine(c);
c++;
}
}
ooh избил меня до удара .... –
Только «вид», 'c' виден всем методам. –
@pst Я не думаю, что существует способ определения статических переменных в C# без использования внутреннего/внешнего шаблона. –
В C# нет глобалов, однако вы можете создать статическое поле внутри своего класса.
public class Foo{
private static int c = 0;
void Bar(){
Console.WriteLine(c++);
}
}
Только «вид», 'c' виден всем методам. –
'WriteLine()' тип данных '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Вам не нужно преобразовывать его в строку. Только: 'Console.WriteLine (C++);' –
Я думаю, что «член» или «поле» - это слово, которое вы ищете, а не «постоянное», так как a) это не постоянно, а b) true константы объявляются с помощью 'const', а не' static', как в 'private static const int Zero = 0'. – Ruben
Вы не можете сделать это на уровне метода. Самое близкое, что вы можете сделать на уровне метода, это что-то вроде этого, и это не так уж близко. В частности, он работает только в том случае, если у вас есть ссылка на счетчик. Если кто-то еще называет этот метод, они не будут видеть ваши изменения.
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 подделывает ее, добавляя переменную статического класса.
Yikes! Также обратите внимание, что это не очень глобально/статично, так как вам нужно постоянно отслеживать счетчик 'x'. Статическое поле намного ближе к статической переменной в C, кроме видимости, которая более шире в C# для статического поля, чем для статической переменной в C. – Ruben
Я знаю об этом :). Я не знаю всей причины, почему OP хотел сделать что-то подобное, поэтому я включил это просто как то, что он * может хотеть посмотреть. Наверное, я должен удалить, прежде чем я снова закрою. :) – aquinas
Если по этому пути я предпочел бы использовать «нормальное» закрытие, но интересный подход ... и так как это не говорит «использовать статический член», ну, +1! –
Нет нет никакого способа, чтобы добиться такого же поведения, как статической переменной с функцией ...
В то время как некоторые из них предложили в качестве 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.
Счастливое кодирование.
Но я хочу сделать именно то, как в приведенном выше коде C. Возможно? – Jack
no Вы не можете иметь локальные статические переменные в C#. Наличие переменной класса так же близко, как вы можете получить – shf301