Han*_*ant 12
Func <>是委托类型,实例在x86抖动中占用32个字节的存储空间:
目标方法大小不相关,委托对象仅存储方法的地址.
这个问题在很多层面都有答案,我担心你不会得到真正100%准确的答案,但是这里有.
我想在这里关注两个不同的内存:
第一部分由JITter分配,这肯定与方法中的代码量有关.但是,如果您决定将该方法扩展到多个方法(您应该这样做,方法不应该是千行,更不用说50个),那么您还将通过这些方法分散内存.事实上,每种方法可能有一定数量的开销,所以从这个角度来看,如果你使用的方法多于一个大的方法,它最终可能会为JITted代码使用更多的内存,但这是无关紧要的.拆分它.认真.
第二块内存是代码在执行时分配的内容.这当然完全取决于代码的作用,因此没有办法说一种方法比仅根据行数判断的方法更好.1000行方法可能不会分配太多,而1行方法可能会分配很多.除了检查实际代码之外,没有办法说出来.
此外,在调试器外部运行的发布模式构建中,垃圾收集器非常具有攻击性,因此在方法顶部声明的变量填充了数据结构,然后在不再使用的方法中, GC可能会回收它,因为它可以鸟瞰你的代码.它可以"看到"该变量不再使用,因此只收集其中的任何内容是安全的.
但是,在调试期间,该变量的使用寿命会延长到持续到示波器/方法的结尾,因此如果您在代码中不再使用该变量的部分某处停止程序,您仍然可以检查它内容.
所以,得出结论:
现在,至于a System.Func<T...>,这只是一个指向小对象的指针.该对象的大小将取决于它所引用的func /方法的参数数量(如果我没记错),但是它不依赖于方法,代码或内存分配的大小等等.
正如@Marc指出的那样,.NET中的委托是启用了多播的.这是使用一系列对象解决的,因此使用的内存也将取决于该链中的元素数量.
不要担心使用委托.它们相当便宜,无论是CPU还是内存方面.