匿名函数访问外部变量有gc

直接上测试代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestStructGC : MonoBehaviour
{
    public struct StructDef
    {
        public System.Action act;

        public StructDef(System.Action callback)
        {
            act = callback;
        }
    }

    public int memberValue;

    private void Update()
    {
        // 使用匿名函数,不访问外部函数,0 gc
        {
            UnityEngine.Profiling.Profiler.BeginSample("*** Test1 ***");
            StructDef obj = new StructDef(null);
            UnityEngine.Profiling.Profiler.EndSample();
        }

        // 使用匿名函数,访问临时变量,112B gc
        {
            int tmp = 1;
            UnityEngine.Profiling.Profiler.BeginSample("*** Test2 ***");
            StructDef obj = new StructDef(() => { var v = tmp; });
            UnityEngine.Profiling.Profiler.EndSample();
        }

        // 使用匿名函数,访问外部变量,112B gc
        {
            UnityEngine.Profiling.Profiler.BeginSample("*** Test3 ***");
            StructDef obj = new StructDef(() =>
            {
                Debug.LogError(memberValue);
            });
            UnityEngine.Profiling.Profiler.EndSample();
        }

        // 不使用匿名函数,0 gc
        {
            UnityEngine.Profiling.Profiler.BeginSample("*** Test4 ***");
            StructDef obj = new StructDef(actCallback);
            UnityEngine.Profiling.Profiler.EndSample();
        }
    }

    #region optimize for test4
    private System.Action actCallback;

    public TestStructGC()
    {
        actCallback = LocalCallback;
    }

    private void LocalCallback()
    {
        Debug.LogError(memberValue);
    }
    #endregion
}

参考:https://blog.uwa4d.com/archives/Anonymous_heapmemory.html

原文地址:https://www.cnblogs.com/sifenkesi/p/9762183.html

时间: 2024-08-29 12:44:45

匿名函数访问外部变量有gc的相关文章

JS里面匿名函数的调用 & 变量作用域的实验

参考 http://www.educity.cn/wenda/54753.html 已实验验证结果正确. 1.下列哪些正确?(B.C) A.function(){ alert("Here!"); }(); B.(function(){ alert("Here!"); })(); C.(function(){ alert("Here!"); }()); 下面也已经实验验证结果正确. 2.下列哪个结果是正确的?(A.B.C.D) A.(functio

关于Lambda表达式访问外部变量

在<C#高级编程>一书中提到通过Lambda表达式可以访问Lambda表达式块外部的变量 ,这是一个很好的功能(类似Js中的 闭包).但是如果没有正确的使用,会非常危险. 比如下面的事例中 int someVal  = 5; Fun<int, int> f = x => x + someVal; Console.WriteLine(f(3)); 我们这个表达式的本意是返回一个数x+5的结果.所以f(3)的结果应该是 3 + someVal = 8. 但是如果以后在不经意中修改

[沫沫金]JS匿名函数this调用变量报错

背景 今天使用Dcloud扫码功能,success成功方法设置data中的scanContext变量,报"undefined"! 思路 一.怀疑是扫码内容不是JSON对象,无法点属性报错.排除,使用JSON.parse转换成功后,依然报"undefined".二.怎么就"undefined"呢,百思不得其解.继续想办法 解决 突然,看到附件选择的方法,人家是设置的this.fileUrl成功的.比对下,什么区别.发现定义的匿名方法,写法不同.我的

第六章 域 作用域 内部变量访问外部变量的值的变化!

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <script> window.onload = function (){ //js第一步解析:i最后为3: var aBtn = document

C#:在匿名方法中捕获外部变量

先来一段代码引入主题.如果你可以直接说出代码的输出结果,说明本文不适合你.(代码引自<深入理解C#>第三版) class Program { private delegate void TestDelegate(); static void Main(string[] args) { TestDelegate[] delegates = new TestDelegate[2]; int outside = 0; for(int i = 0; i < 2; i++) { int insid

14.匿名函数和闭包

匿名函数和闭包 学习要点:1.匿名函数2.闭包 匿名函数就是没有名字的函数,闭包是可以访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础. 一.匿名函数 //普通函数function box(){ //函数名是box return 'Lee'; } //匿名函数function(){ //匿名函数,会报错,单独的匿名函数是无法运行的 return 'Lee';} //通过表达式自我执行(function box(){ //封装成表达式 alert('Lee');})(

匿名函数与闭包

1.匿名函数: 普通函数   function box(){return "lee";}   //函数名是box 匿名函数   function(){return "lee";}   //匿名函数,会报错 通过表达式自我执行    (function box(){alert("lee");})();  //封装成表达式 把匿名函数赋值给变量   var box=function(){return 'lee';}; 函数里的匿名函数    func

匿名函数模仿块级作用域

问题 [无块级作用域]JavaScript中没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的. function outputNumbers(count){ for(var i = 0; i < count; i++){ alert(i); } console.log(i); } outputNumbers(2);//弹出0,1输出2 //变量i是定义在outputNumbers()的活动对象中的,因此从它有定义开始,就可以在函数内部随时访问它. 函数中的

自调用匿名函数

通常定义函数并调用 function a(){ } a(); 或是 var a = function(){ } a(); 但是查看jquery源码会发现它最外层的架构是这样的 (function( window, undefined ) { // jquery code })(window); 解释:首先jquery是定义了一个匿名函数(所谓的匿名函数就是没有名字的函数,顺便说一下闭包的概念:闭包就是在一个函数内部定义一个函数指向外部函数的一个成员变量,并且内部定义的这个函数访问外部函数中定义的