Zmienne statyczne

0

W jednej z klas wykorzystuje dwie zmienne statyczne. Do każdej z nich przy deklaracji przypisana jest funkcja, która pobiera wartość typu prostego z bazy danych. Rozumiem to tak, że odwołując się do zmiennej statycznej, wykonywana jest funkcja przypisująca jej wartość, a sama zmienna zachowuje tą wartość przez okres działania programu.

Rozważam teraz jeden problem, mianowicie co w przypadku jeżeli dane zmieniły się w bazie danych, zmienna statyczna zostanie "aktualizowana"? Jeżeli tak to skąd "zmienna wie", że wymagana jest aktualizacja.

Z góry dziękuję za odpowiedź.

0

Zmienna chyba nie wie że nastąpiła zmiana. Jedyna szansa to przekazanie do aplikacji zdarzenia "nastąpiła zmiana danych" i w obsłudze zdarzenia aktualizacja zmiennej. Nie napisałeś jaka to baza ale chyba tak dobrze to tylko w erze mają. Można cyklicznie odpytywać bazę czy nie nastąpiła zmiana ale to już chyba nie jest programowanie sterowane zdarzeniami.

0

Z tego co doczytałem, zmienna statyczna inicjowana jest podczas odpalenia programu. Nie tak jak pisałem, dynamiczne podczas wywołania. Czy można więc powiedzieć, że wartość tej zmiennej nie ulegnie zmianie, nawet jeżeli taka zmiana nastąpić powinna?

0

Nie. Zmienna statyczna to taka która zachowuje wartość między kolejnymi wywołaniami funkcji/procedury/metody. W przypadku c# zmienna statyczna zadeklarowana w klasie jest współdzielona przez wszystkie instancje tej klasy.

0

Źle zadałem pytanie, bo nie do końca wiem co teraz znaczy Twoje "nie". Załóżmy, że zmienna statyczna zawiera identyfikator ostatniego elementy pobranego z tabeli produktów. Identyfikator ten jest wykorzystywany w wielu miejscach. Podczas działania programu, ktoś dodaje nowy produkt, więc identyfikator przechowywany w zmiennej statycznej jest nieaktualny. Czy w tym przypadku zmienna statyczna zostanie aktualizowana czy będzie przechowywać cały czas stary identyfikator?

0

Pokaż przykładowy kod jak to wygląda bo coś mącisz.

0

nic magicznie nie zostanie zaktualizowane - jeśli chcesz mieć coś zaktualizowane to musisz to zaktualizować

zmienna statyczna to normalna zmienna tylko jest współdzielona przez wszystkie instancje klasy

0

Z punktu widzenia filozofii są dwa jakby sposoby. Albo baza powie że LastID się zmienił i trzeba to obsłużyć. Nie znam sposobu żeby tak było. Albo program przed użyciem LastID odpyta bazę czy przypadkiem się nie zmienił, jeżeli tak to powinien użyć zaktualizowanego.

0

@dam1an to większy projekt, miałbym trudności, żeby to dobrze wyeksponować.

@gsfdgxb czyli samo odwołanie się do zmiennej statycznej nie wymusza jej ponownej inicjacji?

@perlon przykład z ostatnim produktem jest poglądowy i abstrakcyjny. Ma na celu zilustrowanie problemu.

0
Pijany Mleczarz napisał(a):

Z tego co doczytałem, zmienna statyczna inicjowana jest podczas odpalenia programu.

Gdzie to przeczytałeś?
Po pierwsze nie ma czegoś takiego jak zmienna statyczna. Statyczne mogą być klasy, pola, metody, właściwości, zdarzenia, operatory i konstruktory.
Po drugie inicjację można mieć w gimnazjum, ale nie podczas odpalenia programu.
Po trzecie, inicjalizacja (o którą zapewne Ci chodziło) statycznych elementów nie odbywa się podczas uruchomienia programu.

Czy można więc powiedzieć, że wartość tej zmiennej nie ulegnie zmianie, nawet jeżeli taka zmiana nastąpić powinna?

Zmienne ani pola same z siebie wartości nie zmieniają.

0

@somekind na Twoją odpowiedź czekałem :)

Mocno, ale rzeczowo. Powiedz mi w takim razie kiedy takie pole statyczne jest inicjalizowane?

0

przy pierwszym odwołaniu do klasy która je zawiera
ale nie sądzę żeby to było w standardzie - tak zachowuje się .NET w obecnej wersji

ogólnie wystarczy przyjąć że inicjalizują się w pewnym momencie po uruchomieniu programu, najpóźniej podczas pierwszego odwołania

0

ale możesz stworzyć statyczny propert z getterem - ten getter będzie odpalany za każdym odwołaniem i przy każdym odwołaniu będzie odpytywał bazę danych
ale gettery i settery to tak naprawdę tylko "syntax sugar" na zwykłe metody dostępowe więc nie ma w tym niczego niezwykłego

0

The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration. If a static constructor (Section 10.11) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.

0
gsdgsdfg napisał(a):

przy pierwszym odwołaniu do klasy która je zawiera

Nieprawda, przy pierwszym odwołaniu do któregokolwiek pola statycznego w klasie.

0
somekind napisał(a):

Nieprawda, przy pierwszym odwołaniu do któregokolwiek pola statycznego w klasie.

Mimo że już to sprawdzałem to specjalnie dla Ciebie napisałem test
http://ideone.com/B8Rcmx

Może nie siej dezinformacji jak czegoś nie jesteś pewien

@pijany Mleczarz: jak widzisz nawet programiści którzy wiele lat programują w danym języku sami nie wiedzą co się właściwie kiedy dzieje, Tobie też taka informacja nie jest do niczego potrzebna

0
gsdgsdfg napisał(a):

Może nie siej dezinformacji jak czegoś nie jesteś pewien

Jemu to powiedz: http://codeblog.jonskeet.uk/2010/01/26/type-initialization-changes-in-net-4-0/

1 użytkowników online, w tym zalogowanych: 0, gości: 1