【问题标题】:Inline function blocks in C#C# 中的内联函数块
【发布时间】:2015-10-19 06:04:16
【问题描述】:

使用 Unity 的 dotween 库:http://dotween.demigiant.com/documentation.php

在 C# 上生疏了...

例如,有没有办法将内联函数指定为 .OnComplete 的参数,这样我们就不必在单独的函数中分割一系列动作?

也就是说,我想在 ObjC 中使用称为块的功能,但在 C# 中。

冗长不直观的方式:

void myCallback () {
   // do more stuff here
}
void mysequence() {
    transform.DOMoveX(4, 1).OnComplete(myCallback);
}

我想做的事情是更容易阅读并保持原状:

void mysequence() {
    transform.DOMoveX(4, 1).OnComplete({
        // do more stuff here
    });
}

【问题讨论】:

标签: c# unity3d objective-c-blocks dotween


【解决方案1】:

C# 使用 lambdas 的方式是:

void mysequence() {
    transform.DOMoveX(4, 1).OnComplete(() => {
        // do more stuff here
    });
}

来自您链接到的文档:

// Callback without parameters
transform.DOMoveX(4, 1).OnComplete(myCallback);
// Callback with parameters
transform.DOMoveX(4, 1).OnComplete(()=>myCallback(someParam, someOtherParam));

【讨论】:

    【解决方案2】:

    您正在寻找 C# statement lambdas

    void mysequence() {
        transform.DOMoveX(4, 1).OnComplete(() => {
            // do more stuff here
        });
    }
    

    【讨论】:

      【解决方案3】:

      使用匿名 lambda 函数:

      void mysequence() {
          transform.DOMoveX(4, 1).OnComplete(() => {/*code goes here*/});
      }
      

      () => {}; 是一个匿名函数,不接受任何参数并且不返回任何内容。

      a => a 是一个匿名函数,它接受一个参数并返回它。

      c# 中的匿名函数可以是闭包,即函数可以修改在它们外部声明的变量。

      var a = 0;
      
      var f = () => a++;
      
      f();
      
      f();
      
      // a is now 2
      

      【讨论】:

        【解决方案4】:

        一般来说,除了已经给出的答案之外,C#/.NET 还包含类似于函数指针的委托的概念。您可以通过定义方法的签名来定义自己的委托类型,如下所示:

        delegate ReturnType MethodPointer(ParamTypeA paramA, ParamTypeB paramB);
        

        然后您可以将方法分配为函数指针,如下所示:

        private ReturnType SomeMethod(ParamTypeA paramA, ParamTypeB paramB)
        {
            ...
        }
        
        MethodPointer = SomeMethod;
        

        或将其作为回调传递给另一个函数/方法:

        private void OnComplete(MethodPointer callback)
        {
           ...
        }
        
        OnComplete(SomeMethod);
        

        由于以这种方式声明委托可能非常耗时且代码混乱,因此他们提出了通用委托类型:Action<...>(用于 void 方法)和Func<...>(用于具有返回类型的方法)。现在你可以简单地说:

        Func<ParamTypeA, ParamTypeB, ReturnType> func = SomeMethod;
        

        无需显式定义自定义 MethodPointer-delegate。

        Lambda 表达式,正如其他帖子中提到的,通过让您定义类似内联的函数,使实例化委托变得更加容易,这样您就可以直接在对 OnComplete() 的调用中定义 SomeMethod() 的实现,例如:

        private void OnComplete(Action<ParameterType> callback)
        {
        }
        
        OnComplete(parameter =>
        {
           // implementation goes here...
        });
        

        使用 lambda 的另一个优点是实现可以访问局部变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-10
          • 2011-03-07
          • 2019-03-24
          • 2017-01-05
          • 2011-08-23
          • 1970-01-01
          相关资源
          最近更新 更多