Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我在什么环境下运行C#?_C#_.net_.net 4.0 - Fatal编程技术网

我在什么环境下运行C#?

我在什么环境下运行C#?,c#,.net,.net-4.0,C#,.net,.net 4.0,我在想 当我有这样的代码时: lock (obj) { MyCode.MyAgent(); } MyAgent是否可以包含识别它在锁定块下运行的代码 那么: for (int i=0;i<5;i++) { MyCode.MyAgent(); } for(int i=0;iNo)(当然,禁止将此信息显式转发给方法的代码) 这是因为这样的概念不会被转换为保存在IL或元数据中的结构化信息,CLR可以在运行时向您公开这些信息。将其与在元数据中编码的类进行对比,从而在运行时启用反射

我在想

当我有这样的代码时:

lock (obj)
{
    MyCode.MyAgent();
}
MyAgent
是否可以包含识别它在
锁定
块下运行的代码

那么:

for (int i=0;i<5;i++)
{
   MyCode.MyAgent();
}
for(int i=0;iNo)(当然,禁止将此信息显式转发给方法的代码)

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


试图保存这些信息会增加复杂性,当然也会增加额外的开销,但实际上没有任何好处,因为如果您需要程序保持这种状态,那么在代码中很容易实现这一点(要求这种状态是否好是另一个问题).

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

但是,您永远无法获得可靠的结果,即时编译器的优化器将让您很难准确地找出调用的位置。方法体内联将使方法完全消失。循环展开将使您无法了解循环索引。优化器使用cpu寄存器存储本地v变量和方法参数,使得无法获得可靠的变量值


更不用说反编译IL所涉及的锡箔咀嚼工作了。所有这些都比不上将参数传递给方法的简单性和速度。

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


.NET确实有用于同步的上下文,但不是您所要求的级别。例如,请查看。

好吧,我认为每一个问题都是不同的。可能有一些关于
锁定的问题,但是
可以优化掉,而
使用
只是
尝试
/
最后
的语法。所有这些都是这样,在运行时,这些机制中的许多都不存在……不,我从来没有听说过这样的事情,我怀疑这些机制是否存在:)我认为每个C#开发人员都可以回答。