2012-07-07 50 views
8

我不知道......在什麼情況下,我在C#中運行?

當我有這樣的代碼:

lock (obj) 
{ 
    MyCode.MyAgent(); 
} 

MyAgent包含的代碼識別它是根據lock塊運行?

什麼:

for (int i=0;i<5;i++) 
{ 
    MyCode.MyAgent(); 
} 

MyAgent包含的代碼識別它是根據loop塊運行?

同樣的問題可以問using塊,unsafe代碼,等等 - 以及你的想法...

這是可能在C#中?

這只是一個理論問題,我並不是想要達到什麼......只是知識。

+2

嗯,我認爲這些都是不同的問題。 'lock'可能有些東西,但'for'可以被優化掉,'using'只是'try' /'finally'的語法。無論哪種方式,在運行時,許多這些不存在... – Kobi 2012-07-07 12:22:06

+0

不,我從來沒有聽說過這樣的事情,我懷疑這些機制存在:) – GETah 2012-07-07 12:24:59

+1

我認爲每個C#開發人員都可以回答。 – 2012-07-07 12:44:39

回答

8

這不是完全不可能的,你可以使用堆棧跟蹤類去調用程序方法和MethodInfo.GetMethodBody()的引用來獲取方法的IL。

但是,你永遠不會得到這個可靠的,即時編譯器的優化器會給你一個非常困難的時間確切地搞清楚調用的位置。方法體內聯將使方法完全消失。循環展開將使得不可能瞭解循環索引。優化器使用cpu寄存器來存儲局部變量和方法參數,從而無法獲得可靠的變量值。

更不用說涉及反編譯IL的錫箔咀嚼工作。沒有任何一個地方靠近僅僅通過該方法的參數的簡單性和速度。

3

否(禁止將該信息明確轉發給當然方法的代碼)。

這樣做的原因是,如這些概念沒有得到轉換到在任一IL或元數據,其中CLR可隨後暴露於在運行時保留下來的結構化信息。將其與在元數據中進行編碼的類進行對比,從而在運行時啓用反射。

試圖保留這些信息會導致複雜性增加,當然也會帶來額外的開銷,因爲如果您需要程序來保持這種狀態,那麼很容易在代碼中實現它(這是否是一個好主意,需要此狀態是另一個問題)。

0

我不認爲.NET支持您直接描述的特徵,雖然你可能能夠使用的StackFrame抓住當前調用堆棧,並使用反射來分析方法機構等在信息獲取,但我我不確定你有多精確。

.NET確實有同步的環境中,而不是在你問的水平。例如,查看System.ContextBoundObject

相關問題