2012-07-07 51 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

相关问题