簡體   English   中英

在C#中調用靜態方法會發生什么?

[英]What happens when you call a static method in C#?

創建類的實例時,該實例中的所有變量都特定於該實例,並在實例超出范圍時被殺死。 但它如何在靜態方法中工作? 假設有兩個人在同一時間調用System.Math.Abs​​()。 運行時如何區分兩個調用者? 這是線程進來的地方嗎? 是否為每個調用者自動創建了單獨的線程?

創建類的實例時,當實例超出范圍時,將殺死特定於該實例的所有變量。

變量 - 通常稱為“字段”在實例的生命周期 后被釋放。 范圍是程序文本的區域,編譯器通過其名稱識別某些內容; liftime是存儲位置有效的時間部分 范圍和壽命經常混淆。

但它如何在靜態方法中工作?

靜態場具有無限的生命周期; 存儲位置是在訪問字段之前的某個時間創建的,並且在應用程序域被拆除之前不會被銷毀。

假設有兩個人在同一時間調用System.Math.Abs​​()。

好。 您如何提出這種情況?

運行時如何區分兩個調用者? 這是線程進來的地方嗎?

靜態方法被嵌入到一堆機器指令中,這些指令是內存中的數字。 每個執行線程都有一個與之關聯的編號,稱為指令當前指令的指令指針 兩個不同的線程都可以同時具有同一靜態方法內的指令指針。

是否為每個調用者自動創建了單獨的線程?

這個問題沒有任何意義。 如果他們不在單獨的線程上,你是如何同時獲得兩個呼叫者

在方法變量生命周期方面,靜態和非靜態方法之間沒有真正的區別。 在這兩種情況下, 作為一個實現細節 ,本地人通常(不總是:有例外)在堆棧上分配。 堆棧是每線程的,因此本地方法變量不會在線程之間交叉。

實例和靜態之間唯一的區別是,實例方法有一個隱含的零參數,又名“這個”,由主叫用戶(加上一些虛擬調度和空檢查的樂趣)推動。

為簡單起見,我正在瀏覽迭代器塊,捕獲的變量等。

即使沒有該類的實例,也存在類的所有靜態成員。 它們在首次使用之前的某個時間進行初始化,並在程序完成時進行清理。

如果您同時調用靜態方法,則它們將使用該類的任何靜態成員的相同副本(如果他們使用它們)。 因此,如果靜態方法對靜態成員(或參數)進行操作,則應以線程安全的方式進行操作。 如果靜態方法僅在本地操作,則方法本身通常是線程安全的。

至於運行時如何區分兩個調用者,這是線程的本質。 每個線程都有自己的調用堆棧,它有自己的任何局部變量,參數,返回地址等的副本。因此,兩個調用不會混淆,每個調用都會正確返回其調用者。 唯一的問題是,如果靜態方法對非線程安全的靜態成員(或非線程安全的參數)進行操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM