在什么情况下我在C#中运行?

我在想…

当我有这样的代码:

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

MyAgent可以包含识别它在lock块下运行的代码吗?

关于什么:

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

MyAgent可以包含识别它在loop块下运行的代码吗?

using块, unsafe代码等可以问同样的问题…… – 你明白了……

这可能在C#中吗?

这只是一个理论问题,我不想做任何事情……只是知识。

这并非完全不可能,您可以使用StackTrace类来获取对调用方法的引用,并使用MethodInfo.GetMethodBody()来获取该方法的IL。

但是你永远不会得到这种可靠性,即时编译器的优化器会让你很难确定呼叫的确切位置。 方法体内联将使方法完全消失。 循环展开将使得无法了解循环索引。 优化器使用cpu寄存器来存储局部变量和方法参数,从而无法获得可靠的变量值。

更不用说反编译IL的锡箔咀嚼工作。 这些都不是仅仅将参数传递给方法的简单性和速度。

否(禁止代码明确地将此信息转发给方法)。

这样做的原因是这些概念不会转换为在IL或元数据中保留的结构化信息,然后CLR可以在运行时向您公开。 将其与在元数据中编码的类进行对比,从而在运行时启用reflection。

试图保留这些信息会导致复杂性增加,当然还有额外的开销,因为如果你需要你的程序保持这种状态很容易在代码中实现这一点(这是一个好主意,要求这个状态是另一个问题) 。

我不相信.NET支持您直接描述的function,尽管您可以通过使用StackFrame获取当前调用堆栈并使用reflection来分析方法体等来获取该信息但我不确定你有多精确。

.NET确实具有同步的上下文,但不是您要求的级别。 例如,查看System.ContextBoundObject 。