W C mogę zrobićCzy istnieje odpowiednik statycznego C w C#?
void foo() {
static int c = 0;
printf("%d,", c);
C++;
}
foo();
foo();
foo();
foo();
powinien wydrukować 0,1,2,3
Czy istnieje odpowiednik w C#?
W C mogę zrobićCzy istnieje odpowiednik statycznego C w C#?
void foo() {
static int c = 0;
printf("%d,", c);
C++;
}
foo();
foo();
foo();
foo();
powinien wydrukować 0,1,2,3
Czy istnieje odpowiednik w C#?
Coś jak:
class C
{
private static int c = 0;
public void foo()
{
Console.WriteLine(c);
c++;
}
}
ooh pokonać mnie do punch .... –
Tylko "sort", "c" jest widoczne dla wszystkich metod. –
@ pst Nie sądzę, że istnieje sposób określania zmiennych statycznych w języku C# bez użycia wzorca wewnętrznego/zewnętrznego. –
W języku C# nie ma żadnych znaków globalnych, jednak można utworzyć pole statyczne w klasie.
public class Foo{
private static int c = 0;
void Bar(){
Console.WriteLine(c++);
}
}
Tylko "sort", "c" jest widoczne dla wszystkich metod. –
'WriteLine()' typ danych obiektu 'accpets '. Nie musisz konwertować go na ciąg. Wykonuj tylko: 'Console.WriteLine (C++);' –
Uważam, że "członek" lub "pole" jest słowem, którego szukasz, a nie "stałym", ponieważ a) nie jest to celowe i b) prawdziwe stałe są deklarowane z 'const' zamiast' static', jak w 'private static const int Zero = 0'. – Ruben
nie można zrobić na poziomie metody. Najbliżej można zrobić na poziomie metody jest coś takiego, a to nie jest tak blisko. W szczególności działa tylko wtedy, gdy masz odniesienie do modułu wyliczającego. Jeśli ktoś inny zadzwoni tą metodą, nie zobaczy twoich zmian.
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();
}
}
Co ciekawe, VB.NET obsługuje statyczne zmienne lokalne: http://weblogs.asp.net/psteele/pages/7717.aspx. Jak zauważa ta strona, sama platforma .NET nie obsługuje tego, ale kompilator VB.NET podrabia go, dodając statyczną zmienną poziomu klasy.
Yikes! Zauważ też, że nie jest to bardzo globalne/statyczne, ponieważ będziesz musiał śledzić moduł wyliczający 'x' przez cały czas. Pole statyczne jest znacznie bliższe statycznej zmiennej w C, oprócz widoczności, która jest szersza w C# dla pola statycznego niż dla zmiennej statycznej w C. – Ruben
Jestem tego świadomy :). Nie znam całego powodu, dla którego OP chciał zrobić coś podobnego, więc zawarłem to jedynie jako coś, na co on * może * chcieć spojrzeć. Sądzę, że powinienem usunąć, zanim będę bardziej doceniony. :) – aquinas
Jeśli schodzę tą trasą, wolę raczej "normalne" zamknięcie, ale ciekawe podejście ... a ponieważ nie mówi "użyj statycznego członka", no, +1! –
Nie istnieje żaden sposób, aby osiągnąć ten sam zachowanie jako funkcja zmiennej statycznej c ...
Chociaż niektórzy sugerowali jako static
członkiem zmiennej, to nie jest to samo ze względu na widoczność. Jako alternatywnego do odpowiedzi przez Akwinu, jeśli zamknięcia są zaakceptowane, to można zrobić:
(Zauważ, że Foo
jest aa nieruchomość a nie metoda i że c
jest „za przykład .”)
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
Jednakże, C# ma bezpośredniego równoważność static
zmiennej C
Szczęśliwe kodowanie.
Ale chcę zrobić dokładnie w powyższym kodzie C. Jest to możliwe? – Jack
nie, nie możesz mieć lokalnych zmiennych statycznych w języku C#. Mając zmienną klasy jest tak blisko, jak tylko można uzyskać – shf301