Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# 是否声明Func<&燃气轮机;是否在List.ForEach中导致内存泄漏并增加进程内存?_C#_Memory Leaks_Func - Fatal编程技术网

C# 是否声明Func<&燃气轮机;是否在List.ForEach中导致内存泄漏并增加进程内存?

C# 是否声明Func<&燃气轮机;是否在List.ForEach中导致内存泄漏并增加进程内存?,c#,memory-leaks,func,C#,Memory Leaks,Func,我知道我不应该在foreach中声明Func,但我想知道此C代码是否会增加进程内存并导致内存泄漏 class-Foo{ int[]FooA={1,2,3,4}; 字符串结果=”; void myMethod(){ FooA.ToList().ForEach(a=>{ Func myFunc=myFuncVar=>$“值:{myFuncVar}\n”; 结果+=myFunc(a); }); MessageBox.Show(结果); } } 使用像这样的反汇编工具很有帮助 //修剪 内部类Foo {

我知道我不应该在
foreach
中声明
Func
,但我想知道此C代码是否会增加进程内存并导致内存泄漏

class-Foo{
int[]FooA={1,2,3,4};
字符串结果=”;
void myMethod(){
FooA.ToList().ForEach(a=>{
Func myFunc=myFuncVar=>$“值:{myFuncVar}\n”;
结果+=myFunc(a);
});
MessageBox.Show(结果);
}
}

使用像这样的反汇编工具很有帮助

//修剪
内部类Foo
{
[可序列化]
[编译生成]
私人密封c类
{
公共静态只读c 9=新c();
公共静态函数9_uu2_u1;
内部字符串b__2_1(int myFuncVar)
{
返回string.Format(“值:{0}\n”,myFuncVar);
}
}
私人互联网【】FooA;
私有字符串结果;
私有void myMethod()
{
可枚举的.ToList(FooA).ForEach(新操作(b_uu2_0));
}
公共食物(
{
int[]数组=新的int[4];
RuntimeHelpers.InitializeArray(数组,(RuntimeFieldHandle)/*不支持操作码:LdMemberToken*/);
FooA=数组;
结果=”;
base..ctor();
}
[编译生成]
私有无效b_uuu2_u0(内部a)
{
Func Func=c.9_uuu2_1??(c.9_u2_1=新Func(c.9.b_u2_1));
结果+=func(a);
}
}
//修剪
您可以看到,您的lambda(
myFuncVar=>$“Value:{myFuncVar}\n”
)已升级为单实例(
c.9
)上的方法(
b\u 2\u 1
)。使用Func委托的延迟初始化静态缓存(
c.9_uuu2_u1

所以不,至少在这种情况下,这里实际上没有每次迭代的分配


编译器可以证明lambda不需要对局部变量的引用,也不需要任何其他实例字段。即使分配给该lambda的变量具有局部作用域和生存期,lambda本身也可以提升为静态生存期。与字符串文本分配给变量的方式类似,但字符串对象具有静态生存期。

不会出现内存泄漏,因为
myFunc
不会离开作用域,也没有人引用它。在给定的情况下,
myFunc
将在gen0(最频繁的集合)中收集,因此内存开销很小minimal@JL0PD你的意思是如果我在其他方法中调用
myMethod()
,就不会有任何内存泄漏?你对“我不应该在
foreach
中声明
Func
有什么理由?”?我不知道,所以想知道。。。(很明显,在这种特殊情况下,它是无用的,但我们完全希望严格证明问题,并且不包括本文中所示的额外代码……因此您可能有其他原因)@TCPW01,是的。但是,如果您确实需要该代码,那么最好使用
string.Join
托管框架,如.NET本身就没有内存泄漏。也就是说,你可以“打包老鼠”,塞进一堆你永远不会在某处使用的参考资料,这样浪费内存。但您永远不会丢失对内存管理器无法摆脱的内存块的引用。