2011-08-22 46 views
0

如果我有一個班級沒有標記爲static,但它確實有static成員變量,這是否使班級本身static?它像代碼一樣被使用,但它有一個公共構造函數。我認爲他們只能擁有私人構造函數?是一個靜態成員和一個公共構造函數靜態類的類?

此外,在Web頁面中的Web應用程序中,我調用靜態類並將其分配給要在頁面中使用的靜態成員變量。如果用戶離開頁面,靜態成員變量會保留在內存中嗎?我正在考慮那個用戶會話的持續時間,對嗎?或者,GC是否會避免在更長一段時間內收集?

確定這裏的一些代碼:

public class CustomerManager 
{ 

    private static MyFactory _customerFactory = MyFactory.GetInstance(); 

    public CustomerManager() 
    { } 

    public static List<CustUser> GetCustomersByWebRequest(int iClientID, string sEmployeeNumber) 

它被稱爲另一個類,它是靜態的,像這樣:

List<CustUser> customers = CustomerManager.GetCustomersByWebRequest(1, "23434"); 

,這是在生產。

+2

您的問題並不清楚,因爲您最初談論的是一個非靜態類,然後將其稱爲靜態類... –

+0

確定已更新,以反映對非靜態類的更好理解。 :)需要澄清與網絡應用程序的內存管理。謝謝 – DotNetDude

回答

3

不,對於非靜態類來說,包含靜態成員是完全合理的。

Static classes沒有任何實例構造函數。非靜態類默認具有公共實例構造函數,但您可以使用私有實例構造函數「阻止」從外部實例化。

編輯:ASP.NET用戶會話與.NET中的內存管理無關,除非某些數據肯定存儲在他們的會話中 - 基本上只是充當對該對象的強引用。

靜態變量將阻止它引用的對象被垃圾收集,而AppDomain它的一部分仍然存在。

關於customers變量 - 這隻會防止作爲變量被認爲是「活的」,只要收集到的List<CustUser>是垃圾 - 這將取決於它是什麼樣的變量以及它如何被使用。

+2

靜態類可以有靜態私有構造函數。它是第一次將該類加載到內存中。 – Dani

+0

@Dani:雖然這不是它的正常含義的構造函數。當有人說「構造函數」而沒有指定其他的時候,他們幾乎總是指「實例構造函數」。請注意,您不能給靜態構造函數*任何*訪問修飾符,包括私有,所以「靜態私有構造函數」沒有多大意義。將編輯,使這絕對清楚,雖然... –

+0

嗨喬恩我添加了一些代碼,讓你更好地瞭解我的意思。 – DotNetDude

相關問題