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
这个仿函数对象会把所有捕获的临时变量全部都设置为自身的成员变量 这个很好验证
直接去下断点就可以了

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

猜你喜欢

转载自blog.csdn.net/qq_39162566/article/details/129970901