2017-02-03 104 views
4

這是自從在VB編程之日起就一直在腦海中一直在困擾的問題之一。我有自己的個人想法,但我想知道靜態變量的使用是什麼。靜態或私人

靜態變量:

Public Function Whatever() as Boolean 
    Static Flag as Boolean 
    If not Flag then 
     ' do something 
     Flag = True 
    end if 
    Return Something 
End sub 

VS:

私有變量:

Private Flag as Boolean 
Public Function Whatever() as Boolean 
    If not Flag then 
     ' do something 
     Flag = True 
    end if 
    Return Something 
End sub 

除非有人否則知道,上述相同的功能,除了一個事實,即 「私人」國旗暴露在課堂上其他地方使用。

問題開始靜..等,以產生..

他們在哪裏存儲..它們真的創建和設置時等

顯然,編譯器將它們添加到數據堆(I知道這個詞的不好用法)...但是在開銷,垃圾回收等方面有沒有懲罰。

通常我會避免他們像瘟疫,因爲他們提出的問題比答案要多。

是否真的有任何使用靜力學的固體原因?

PS:希望這傳遞SO問題測試...

注意我不是問如何創建靜態細節..我更問如果有什麼事情會讓使用靜態值得的。

附錄....

我做了一點研究,發現這個相當有啓發性。

https://weblogs.asp.net/psteele/7717

+1

聲明爲靜態的變量通常在類的所有實例中共享......此外,該變量的靜態值與每個對象不唯一的對象無關。我認爲靜態作爲一種常數... – Codexer

+1

可能的重複[什麼時候在Visual Basic中創建靜態變量?](http://stackoverflow.com/questions/12199698/when-is-a-static-變量在視覺基本創建) –

+4

嗯...沒有@ Zaggler靜態特定於實例。 –

回答

0

所以從研究,我想出了以下內容。

靜態變量是「惰性」變量,因爲它們是在第一次調用函數或例程時需要時創建的。有一個與創建相關的開銷,更重要的是,首先進行初始化以使其線程安全。

Konrad建議使用靜態的主要原因是將變量的範圍最小化到需要的地方。

所以......需要

  1. 使用簡單的靜態函數和子程序不常用的變量(布爾,整數等)時。如果你期望這個類的用戶總是調用這個函數,並且期望這個類有1000個實例......那麼你會添加很多開銷。

  2. 切勿使用需要處理的對象類型的靜態變量,除非您在例程中添加一些功能(參數),以便在Dispose模式下調用它,並記住在Dispose函數中這樣做。

  3. 同樣,不要將靜態變量用作項目中某個其他對象的引用。這樣做可以防止所述對象在代碼中的其他地方被垃圾回收,因爲它仍然被引用。

  4. 最後,如果您使用私有變量方法,請爲其指定一個名稱,以明確該變量正在用於該功能。 stat_Half_Time_Score

5

是否真的有任何理由去用不完靜?

是的。在「單一責任原則」的第一個字母SOLIDS中有爭議。在這種特殊背景下這是一個稍微不同的規則:

Objects should have the smallest possible scope.

如果不需要外部的範圍X一個對象,它應該範圍內X聲明。這確保了它有一個單一的責任,並沒有不恰當地訪問其他地方。它也確保只有一個方法有責任訪問這個對象。

因此,在你的情況下,最好的想法的確是使變量成爲函數靜態(=局部)變量而不是對象私有變量。

這確實在我的經驗中並不常見。但這是最佳做法。

(在性能/內存方面這兩種變型也完全相同。)

+0

啊..很高興認識後者。康拉德。是的,我同意這一點,但是,也有一些限制,尤其是如果你碰巧使用了比簡單變量更復雜的東西,而這些變量超出了任何處理程序的範圍。 –