【问题标题】:What is the purpose of a Action callback delegate? [duplicate]Action 回调委托的目的是什么? [复制]
【发布时间】:2020-11-13 08:38:34
【问题描述】:

大家好,我正在尝试更多地了解 C# 中的 Action Delegates,但我不太了解它。所以下面我有一个来自 Unity C# 项目的代码示例。我的问题是。这个“Action doneCallback”参数的目的是什么,以及“doneCallback.Invoke()”代码的作用是什么。提前致谢!

public static IEnumerator StartWaiting(
    float time, Action doneCallback, 
    float increment, Action<float> incrementCallback, 
    bool countUp = true)
{
    float timeElapsed = 0f;
    float timeRemaining = time;

    while (timeRemaining > 0f)
    {
        yield return new WaitForSeconds(increment);
        timeRemaining -= increment;
        timeElapsed += increment;
        incrementCallback.Invoke(countUp ? timeElapsed : timeRemaining);
    }
    doneCallback.Invoke();
}

public static IEnumerator StartWaiting(float time, 
    Action doneCallback)
{
    yield return new WaitForSeconds(time);
    doneCallback.Invoke();
}

}

【问题讨论】:

  • 您可以将它们视为指向方法的“指针”。 Invoke 执行该方法。 dotnetpattern.com/csharp-action-delegate 所以基本上在您的代码中,您可以将任何具有浮点参数的方法(例如 private void CoolMethod(float bla))传递给 incremenentCallback 参数。

标签: c# unity3d delegates ienumerator


【解决方案1】:

这是Action的定义:

public delegate void Action();

它是一个占位符,用于返回 void 且不接受任何参数的函数。

您可以使用与其签名匹配的任何方法或匿名函数/ lambda 表达式。

举个例子:

StartWaiting(1000f, () => Console.WriteLine("done"));

或者其他:

private void WriteToConsole()
{
    Console.WriteLine("done");
}

StartWaiting(1000f, WriteToConsole);

doneCallback.Invoke(); 实际上调用了那个函数,但是你也可以把它写成doneCallback();它们是等价的。


同样,这是Action&lt;T&gt;

public delegate void Action<in T>(T obj);

所以Action&lt;float&gt; 是一个函数的占位符,它返回 void 并接受 float 类型的单个参数。

一个例子:

var increments = new List<float>();
StartWaiting(1000f, WriteToConsole, 1f, floats.Add);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2017-11-13
    • 2012-03-23
    • 2013-12-30
    相关资源
    最近更新 更多