2009-04-28 7 views
6

Często używam metod, które są regularnie wywoływane i mają pewne "stan", który musi być zachowany między połączeniami, jak w:C#: Ogranicz zakres globalnego pola do metody/właściwości LUB zachowaj wartość zmiennej lokalnej/właściwości między wywołaniami

float lastTime = 0.0f; 
void Draw(float currentTime) 
{ 
    if(currentTime - lastTime > 0.5f) 
    { 
     // not enough FPS 
    } 
    lastTime = currentTime; 
} 

I doprowadza mnie to do szału, że globalne pole "stanu" (tutaj "lastTime") jest widoczne w całej klasie, podczas gdy jest potrzebne tylko w tej jednej metodzie. Czy istnieje sposób na ograniczenie zakresu widoczności tego pola globalnego tylko do metody lub do uczynienia jej lokalnym, ale zachowaj wartość między połączeniami? To samo pytanie dotyczy pól używanych przez Właściwości (które mają pewną logikę i nie mogą być automatyczne).

Z góry dziękuję za wszelkie sugestie ...

Odpowiedz

0

Nie, przepraszam. C# nie pozwala na statykę na poziomie funkcji, taką jak C. Zaleciłbym nadanie mu "icky" nazwę, jak Draw_Data_lastTime lub coś podobnego. To przynajmniej przekazuje informacje o tym, gdzie powinno się go używać.

1

W języku C#, nie. To właśnie zmienne static są w VB.NET (i uważam, że C, chociaż nie jestem ekspertem). Jestem jednak dość pewien, że zmienne static w VB.NET są po prostu kompilowane do IL z nazwami generowanymi automatycznie jako polami instancji.

Wystarczy przykleić do pól instancji, które są odpowiednio nazwane (np. lastDrawTime dla twojego przykładu).

0

Nie, najbardziej restrykcyjnym zakresem jest "prywatny", który umożliwia dostęp z tego samego typu.

6

Jedynym sposobem na uczynienie go prywatnym tylko w części klasy byłoby uczynienie go oddzielnym obiektem, który zarządzałby tą właściwością, wewnętrzną w klasie.

Zalecam jednak ponowne przemyślenie tego. Pomysł przywiązuje go do tego, aby utrzymywać członka prywatnego wobec samej klasy - jeśli martwisz się, że twoja klasa widzi swoje dane, nadszedł czas, aby przekształcić się w mniejsze klasy, każda z własną funkcją.

To ma "zapach" klasy, która staje się zbyt duża.

+0

Całkowicie uzgodnione; odpowiedziałeś w ten sam sposób jednocześnie! :-) –

0

Obawiam się, że twoje pytanie nie jest możliwe.

Myślę, że jedyną opcją jest przekazanie bieżącego stanu jako parametru w metodzie, ale oznacza to, że obiekt wywołujący byłby odpowiedzialny za zarządzanie stanem.

Też myślę, że mógłbyś refactor twój kod, ponieważ jeśli reszta twojej klasy nie potrzebuje wiedzieć o tej zmiennej może ta część mogłaby być gdzieś indziej.

0

Nie, nie ma mowy; ale twoje pytanie rodzi kilka interesujących problemów. Jeśli masz obawy dotyczące zmiennej członkowskiej do śledzenia, która jest widoczna w całej klasie, to podnosi ona flagi, że być może zakres klasy stał się zbyt duży i że klasa musi zostać refaktoryzowana na kilka mniejszych klas.

Ogólnie, jeśli zaczynasz martwić się o segregację członków w swoich klasach, możesz mieć sytuację, która wymaga refaktoryzacji na mniejsze klasy. Z drugiej strony możesz nie (sytuacje są różne), ale przynajmniej warto się nad tym zastanowić.