2012-09-08 102 views
2

考慮下面的代碼靜態對象的行爲?

class Repository{ 
    public static Item i; //Item is a type (class) 
    GetItem(){ 
    // initialize i if null. Read i from an xml file if the last write time of file is greater than last read time else return current i 
    return i; 
    } 
    SaveItem(item){ 
    //save i; 
    //write i to xml file 
    i=item; 
    } 
} 

class User{ 
    public static void Main(){ 
    Repository r = new Repository(); 
    r.GetItem().MakeChangesToItem(); //method inside item to make some changes 
    r.SaveItem(r.GetItem()); 
    } 
} 

是否有此行爲的代碼零星任何機會。顯然它確實適合我。有時候,這些更改反映在靜態項目中。當我將主方法代碼更改爲

Item i=new Repository().GetItem(); 
i.MakeChangesToItem(); 
r.SaveItem(i); 

它正常工作。 有沒有人遇到過這個?謝謝

+0

「Item」是一個結構體還是一個類? –

+0

@GiladNaaman看看代碼中的評論,這是一個類 – dpp

+0

哦,對不起。沒有注意到。 –

回答

3

靜態意味着它不綁定到任何實例,而是每個類型。靜態的一個常見問題是線程。如果你有多個線程(例如,ASP.NET或WCF應用程序,或者你自己使用線程/任務/並行的任何東西),那麼瘋狂會隨之而來,因爲他們都認爲他們在談論不同的事情,覆蓋相同的領域。

我會說靜態是非常不適合該領域。

+0

我不明白這條線「如果你有多個線程,然後瘋狂可以隨之而來,因爲他們都認爲他們在談論不同的事情,覆蓋相同的領域」。請你解釋一下謝謝 – Sat

+0

@Sat什麼不清楚?不同的線程改變相同的變量/對象,認爲他們「擁有」它,沒有同步?糟糕的食譜。 –

+0

ok.pardon我的無知,但這裏的變化和保存是相同方法的連續行。你能解釋它如何失效嗎?只是爲了添加此代碼是從一個asp.net mvc應用程序,如果這將有所幫助。謝謝 – Sat

0

另外,靜態對象與在一組關閉類型的實例之間共享的類類型有關。所以靜態對象在執行時會有不同的表現。相比之下,如果您的靜態對象是不可變的,那麼您不需要關心使用多線程的這個對象。