The static keyword is used to declare static members. This modifier can be used with classes, fields, methods, operators, etc. Without this operator we wouldn’t be able to do many things. But on the other hand I think it is sometimes overused. What’s more, sometimes people who use it do not realize the risk that is associated with it.
My friend, with whom I had pleasure to work, used to say each time that static is used it causes death of one software developer. In many situations he was totally right. Many times we have remove static elements during refactoring.
I think that the best way to demonstrate the issue is to present following example:
public static class A { public static int a = B.b + 1; } public static class B { public static int b = A.a + 1; } public class Program { static void Main(string[] args) { Console.WriteLine("a: " + A.a); Console.WriteLine("b: " + B.b); } }
And the question at the end. What will happen when I want to compile this code and then run it.
“każde użycie słowa static powoduje śmierć jednego programisty” -- piękne słowa, nic dodać nic ująć.
Dokładnie. W sumie nic nie muszę dodawać.
A na koniec jeszcze jedna uwaga. Efekt może być jeszcze ciekawszy, gdybyśmy każde Console.WriteLine uruchomili w osobnym wątku. Wtedy nie mielibyśmy pewności jaki otrzymamy wynik. Wszystko zależy od tego, która linijka wykona się szybciej.
Gdybyś zamienił kolejność definicji klas to zagadka byłaby ciekawsza, bo wynik się nie zmieni i wygląda na to, że pola statyczne są inicjalizowane w kolejności alfabetycznej, a nie w kolejności wystąpienia w programie, co jest niezłą niespodzianką.
A tak wszystko jest logiczne, pierw zmienne “a” i “b” są ustawiane na 0 jako że lądują na stercie, pierw jest inicjalizowane “a” które odwołuje się do “b”, czym uruchamia inicjalizacje b. A jest już oznaczone jako zainicjalizowane (pomimo tego że defacto proces ten się nie skończył), więc “b” pobiera wartość “a”, która wynosi 0, dodaje 1, wiec “b” =1 co jest zwracane do “a” które wynosi 2. Proste :D.
Program się kompiluje, a =2 b =1. Chętnie się dowiem czemu tak się dzieje…