Unity/C# 匿名函数/闭包/lambda 的Target为{Class.<>c__DisplayClass10_0}

问题追踪

一般情况下 我们的lambda表达式的this指针就是 所在方法所属类

比如:

class Test {

	public void foo1(){
		
		Action lamFunc = ()=>{
			
			
		};
	
		//此时这个 lamFunc 的Target是等价于this指针的
		if( lamFunc == this ){
			Debug.Log("lamFunc作用域等于this");
		}
	}
}

但特殊情况下 我们的编译器会给这个 lamFunc套上一层
class Test {

public void foo1(){
	
	float  fValue = 0f;
	Action lamFunc = ()=>{
		
		Debug.Log(fValue);
	};

	//此时这个 lamFunc 的Target是一个类似这样的类 {Test.<>c__DisplayClass10_0}
	if( lamFunc == this ){
		Debug.Log("lamFunc作用域等于this");  //这句话不会在这个案例中打印出来
	}
}

}

这种情况产生的推测

当需要捕获 方法内的临时变量时 闭包的特性会缓存这个临时对象 类似 嵌套闭包
这是的闭包的Target调用者就改成了 上一层的闭包值

用C++的方式来解释就是

如果存在外部捕获的临时变量 会生成一个仿函数 其本质上是一个结构体 用法和class相同 在内存中同样占用1个字节的描述 区别在于默认 public
这个仿函数对象会把所有捕获的临时变量全部都设置为自身的成员变量 这个很好验证
直接去下断点就可以了

而且这个特性会影响到其作用域下的其它闭包函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity "System.ArgumentException: JSON must represent an object type.\r\n at (wrapper managed-to-native) UnityEngine.JsonUtility.FromJsonInternal(string,object,System.Type)\r\n at UnityEngine.JsonUtility.FromJson (System.String json, System.Type type) [0x0005c] in <d773524469e64e608a0d15b877a002d5>:0 \r\n at UnityEngine.JsonUtility.FromJson[T] (System.String json) [0x00001] in <d773524469e64e608a0d15b877a002d5>:0 \r\n at GameConfig+<>c__DisplayClass13_0`1[T].<LoadListAsync>b__0 (UnityEngine.TextAsset asset) [0x00014] in E:\\work\\ShootingRumble\\shootingrumble\\Assets\\_Scripts\\Config\\GameConfig.cs:95 \r\n at AssetsManager+<>c__DisplayClass1_0`1[T].<LoadAssetsAsyncByLabel>b__0 (T handle) [0x00001] in E:\\work\\ShootingRumble\\shootingrumble\\Assets\\_Scripts\\Core\\Manager\\AssetsManager.cs:35 \r\n at UnityEngine.ResourceManagement.ResourceManager+<>c__DisplayClass92_0`1[TObject].<ProvideResources>b__0 (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle x) [0x00000] in E:\\work\\ShootingRumble\\shootingrumble\\Library\\PackageCache\\com.unity.addressables@1.19.19\\Runtime\\ResourceManager\\ResourceManager.cs:746 \r\n at UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1+<>c__DisplayClass57_0[TObject].<add_CompletedTypeless>b__0 (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1[TObject] s) [0x00000] in E:\\work\\ShootingRumble\\shootingrumble\\Library\\PackageCache\\com.unity.addressables@1.19.19\\Runtime\\ResourceManager\\AsyncOperations\\AsyncOperationBase.cs:286 \r\n at DelegateList`1[T].Invoke (T res) [0x00038] in E:\\work\\ShootingRumble\\shootingrumble\\Library\\PackageCache\\com.unity.addressables@1.19.19\\Runtime\\ResourceManager\\Util\\DelegateList.cs:69 "
最新发布
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值