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ź.

perlon
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 lata
  • Postów:33
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.

edytowany 1x, ostatnio: perlon
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?

perlon
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 lata
  • Postów:33
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.

edytowany 1x, ostatnio: perlon
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?

dam1an
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
  • Postów:1589
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

perlon
  • Rejestracja:około 11 lat
  • Ostatnio:około 2 lata
  • Postów:33
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.

edytowany 1x, ostatnio: perlon
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.

perlon
Na abstrakcyjny przykład masz abstrakcyjną odpowiedź ;-)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
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

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
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.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
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

n0name_l
WTF?! Przecież napisałem dokładnie kiedy co jest inicjalizowane i @somekind napisał dokładnie to samo, z tym że pominął kwestie statycznego konstruktora bo w wątku nie ma o nim żadnej mowy.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
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/

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)