Exemplu (adaugati de exemplu StaticsClass.cs in App_Code al unui proiect):
Cod: |
public static class StaticClass { private static int _n = 0; public static void init(int i) { _n = i; } public static string get() { return "value: " + _n; } } |
Problema consta in faptul ca aceste proprietati si metode statice sint unice pt. toate instantele clasei, ce pot modifica toate aceleasi proprietati unice.
Pt. acest caz, apelul functiei StaticClass.init() va pune o valoare in _n, ce apoi poate fi modificata de alta utilizare a clasei. Intre apelul init() si get() nu exista nici o garantie ca variabila statica _n nu a fost cumva modificata.
Un exemplu de folosire a clasei in 2 fisiere ASP.NET:
Static1.aspx:
Cod: |
<form id="form1" runat="server"> <div> <% StaticClass.init(1); System.Threading.Thread.Sleep(20000); Response.Write(StaticClass.get()); %> </div> </form> |
Static2.aspx:
Cod: |
<form id="form1" runat="server"> <div> <% StaticClass.init(2); //System.Threading.Thread.Sleep(10000); Response.Write(StaticClass.get()); %> </div> </form> |
Daca o sa incarcati static1.aspx iar apoi imediat static2.aspx (inainte de expirarea celor 20 se sec. de asteptare) o sa vedeti ca ambele pagini afiseaza aceeasi valoare (2).
Se intimpla asta pt. ca desi valoarea _n pt. prima pagina a fost initializata cu 1, vine a 2 pagina si o modifica la 2, fiind vorba de o variabila unica, statica, asociata clasei. Iar valoarea ramine 2, modificata.
Asadar mare atentie cu folosirea claselor cu metode si proprietati statice pt. ca acestea pot cauza probleme sau o 'gituire' a aplicatiei, pt. cazul in care metodele ei dureaza mai mult (toate acele apeluri se vor executa secvential, unul dupa altul).
Exista cazuri cind clasele sau metodele statice pot fi un avantaj, in special pt. apeluri scurte de functii ce sint executate intr-un singur pas ('stateless'). In acest caz este mai simplu doar sa apelezi metodele clasei fara sa o mai instantiezi.
Odata inteles dedesubturile decideti singuri cind acestea ajuta sau incurca.