何時分配靜態變量,即何時聲明類或創建對象時?.net中的靜態變量分配時間
回答
它被編譯成靜態構造函數。因此,當任何人第一次創建該類的對象或調用靜態方法或屬性時,就會進行初始化。
編輯:如果初始化發生在自己的靜態構造函數代碼之前(以及其他一些邊界情況),當它對你很重要時,請通過divo檢查註釋中的鏈接。
它不那麼簡單。 Jon Skeet有關於此的綜合性文章,請參閱http://www.yoda.arachsys.com/csharp/beforefieldinit.html。在沒有靜態構造函數的類中,類型初始值設定項可能會在程序集被加載時執行,或者當該類型的靜態方法被執行,或者甚至只有當類型的第一個字段被訪問時纔會運行。 – 2009-12-21 15:29:56
這是一個非常有趣的鏈接,divo。謝謝。我認爲在大多數實際的目的中,我的答案是可以的,但似乎比我想象的要多。 – 2009-12-21 15:35:39
是的,正如Jon所寫的:「很多類實際上並不需要許多C#程序員所承擔的行爲 - 實際上,大多數人不需要知道其中的差異。」但它可能正是這些邊緣案例引發的意外錯誤。 – 2009-12-21 15:40:05
只要調用static(type)構造函數就會分配靜態變量。當您在方法執行之前調用任何第一次引用類型的方法時,會發生這種情況。
只有*是*靜態類型的構造函數時纔是如此。 – 2009-12-21 15:35:18
任何顯式字段初始化都將在構造函數體之前編譯到構造函數中。如果沒有聲明的靜態構造函數,編譯器會生成一個。 – ironic 2009-12-21 15:52:15
@ironic:不,情況並非如此。如果沒有靜態構造函數,該類將被標記爲'beforefieldinit'標誌,這意味着執行類型初始化程序的時間不確定。 – 2009-12-21 16:03:33
正如其他答案已經表明,這將發生在類型(靜態)構造函數。如果你的類沒有明確定義的類型構造函數,那麼編譯器會爲你生成一個類型構造函數。但是,確定何時調用該構造函數的確切時間有點多。
如果您的類未定義顯式類型構造函數,例如
public class Foo
{
public static int Bar = 1;
}
然後C#編譯器將生成一個構造函數並使用beforefieldinit
標誌發出類定義。這將導致JIT編譯器保證類型構造函數在第一次使用該類型的成員之前被調用,但這次是非確定性的,即不可能確切地知道何時會發生這種情況,並且它可能在比首次使用類型成員時要早得多。
如果你的類聲明瞭一個顯式的類型構造函數,例如
public class Foo
{
public static int Bar;
static Foo()
{
Bar = 1;
}
}
然後編譯器會發出IL而沒有beforefieldinit
標誌。在這種情況下,JIT編譯器將在確定的時間調用類型構造器,即緊接在第一類型成員訪問之前。
前者JIT行爲稱爲前場-INIT語義和後者作爲精確 sematntics。瞭解兩者之間的差異很重要,因爲在某些情況下,它們可能會有重大的性能影響。
nitpick:對於'beforefieldinit'而言,重要的是靜態構造函數是否存在,而不是*你的字段是否在構造函數中初始化。如果類沒有靜態構造函數,那麼它將被編譯器標記爲'beforefieldinit';如果該類有一個靜態構造函數,那麼它將不會被標記爲'beforefieldinit',而不管它的字段被初始化的位置。 – LukeH 2009-12-21 15:51:19
仍然這應該是被接受的答案:-) – 2009-12-21 15:52:26
@Luke - 感謝指出。 Nitpicking是好的;-)已編輯 – 2009-12-22 07:17:03
- 1. 靜態成員變量分配時間
- 2. 內存分配靜態變量在非靜態類在.net
- 3. 分配實例變量靜態變量
- 4. 將靜態變量分配給非靜態變量
- 5. Python的靜態變量再分配
- 6. 靜態變量內存分配
- 7. .NET中靜態變量的生存期
- 8. 分配時間給變量
- 9. java中的靜態變量與靜態變量之間的區別
- 10. 如何防止.NET運行時中的靜態變量共享?
- 11. Java中靜態變量和最終靜態變量之間的區別
- 12. 類中的靜態變量和內存分配及其使用
- 13. 的XCode靜態分析報告,當實例變量被分配
- 14. 靜態變量工作在.NET
- 15. PHP:引用靜態變量中的另一個靜態變量
- 16. 同一類中的Java靜態變量和非靜態變量
- 17. 需要動態分配(初始化)靜態變量
- 18. PHP中的靜態變量變量
- 19. C++中的靜態變量
- 20. Monodroid中的靜態變量
- 21. ASP.NET中的靜態變量
- 22. asp.net中的靜態變量?
- 23. PHP中的靜態變量
- 24. asp.net中的靜態變量
- 25. ruby中的靜態變量
- 26. R中的靜態變量
- 27. Java中的靜態變量?
- 28. ObjectiveC中的靜態變量
- 29. Tcl中的靜態變量
- 30. Python中的靜態變量?
請參閱此相關的問題:http://stackoverflow.com/questions/218461/difference-initializing-static-variable-inline-or-in-static-constructor-in-c – 2009-12-21 15:31:59