Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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# 如何将回调函数嵌入触发回调函数的函数中?_C# - Fatal编程技术网

C# 如何将回调函数嵌入触发回调函数的函数中?

C# 如何将回调函数嵌入触发回调函数的函数中?,c#,C#,我有以下代码: void ChangeVolume(AudioSource myAudioSource) { LeanTween.value(gameObject, myCallback, 0, 1, 1f); } void myCallback( float val, float ratio ){ myAudioSource.volume = val; } 如何在LeanTween.value函数中直接包含“myAudioSource.volume=val;”,而无需

我有以下代码:

void ChangeVolume(AudioSource myAudioSource) {

    LeanTween.value(gameObject, myCallback, 0, 1, 1f);
}

void myCallback( float val, float ratio ){

     myAudioSource.volume = val;
}
如何在LeanTween.value函数中直接包含“
myAudioSource.volume=val;
”,而无需声明单独的回调函数

我希望将其嵌入的原因是我希望将“myAudioSource”作为参数传递给它。这样,我就不需要为每个音频源编写回调函数

基本上,我想这样做:

    void ChangeVolume(AudioSource myAudioSource) {

        LeanTween.value(gameObject, () => { 
             myAudioSource.volume = val; } , 0, 1, 1f);
    }
但是我不确定应该使用什么语法。

非常简单,只需使用

无效更改卷(AudioSource myAudioSource){
LeanTween.value(游戏对象,
(val,比率)=>{
myAudioSource.volume=val;
},
0,1,1f
);
}

但是正如您所看到的,它很难读取,因为它是嵌套的,而且如果/当回调变得更复杂时,它只会变得更难读取,因此它是一个混合包。

实际上有几种方法可以做到这一点

您可以使用lambda表达式,正如您已经看到和听到的:

void ChangeVolume(AudioSource myAudioSource) 
{
    LeanTween.value(gameObject, (val, ratio) => myAudioSource.volume = val, 0, 1, 1f);
}
这是一个非常简单的lambda,即使去掉括号和分号,它也已经开始变得难看和难以阅读了。在这种情况下,这可能不是问题,但在其他情况下,还有其他方法。例如

使用
操作
*:

使用:


*如果您有一个返回某些值的回调,请使用
Func

调用您要查找的概念。对于较大的lambda,使用单独的函数可以更直观,更容易直接测试。感谢您的回答。我希望它嵌入的原因是我想给它分配一个外部变量“myAudioSource”。这样,我就不需要每次使用不同的音频源变量时都创建函数。对于这个非常简单的情况,不需要使用大括号和分号,这样就更容易阅读了
void ChangeVolume(AudioSource myAudioSource)
{    
    var actionCallback = (val, ratio) => 
    { 
        // lots of code here... 
    };
    LeanTween.value(gameObject, actionCallback, 0, 1, 1f);
}
void ChangeVolume(AudioSource myAudioSource)
{
    LeanTween.value(gameObject, localFunc, 0, 1, 1f);
    
    void localFunc(float val, float ratio)
    {
        // lots of code here...
    }
}