C# 如何使用C中预定义的委托类#

C# 如何使用C中预定义的委托类#,c#,unity3d,delegates,audioclip,C#,Unity3d,Delegates,Audioclip,我对编程相当陌生,目前正在尝试学习如何在C#中使用委托。我已经阅读了MSDN上的C#delegates编程指南,并查看了其他一些关于堆栈溢出的示例。我想我已经了解了整个概念,但是对于如何使用已经在类中定义的委托感到困惑。例如,在UnityAudioClip类中,有一个名为PCMReaderCallback的委托,每次音频片段读取信息时都会调用该委托。它采用的参数只是一个float值数组 public delegate void PCMReaderCallback(float[] data);

我对编程相当陌生,目前正在尝试学习如何在C#中使用委托。我已经阅读了MSDN上的C#delegates编程指南,并查看了其他一些关于堆栈溢出的示例。我想我已经了解了整个概念,但是对于如何使用已经在类中定义的委托感到困惑。例如,在Unity
AudioClip
类中,有一个名为
PCMReaderCallback
的委托,每次音频片段读取信息时都会调用该委托。它采用的参数只是一个
float
值数组

public delegate void PCMReaderCallback(float[] data);
我猜这意味着我可以使用这个委托包装任何使用浮点数组作为参数的方法。在我学习过的教程中,他们解释了如何创建一个委托,该委托封装了定义委托时选择的方法,这对我没有帮助,因为
PCMReaderCalled
back已经在
AudioClip
类中定义

我的问题是如何使用已定义的委托来调用我选择的方法


也许这是不可能的,或者也许我首先对委托的目的感到困惑。

您将委托声明为:

public delegate void PCMReaderCallback(float[] data);
然后有一个Unity函数,它将此委托用作参数。这是这里唯一需要理解的事情

这就是它看起来的样子:

public static AudioClip Create(string name, int lengthSamples, int channels, int frequency, bool stream, PCMReaderCallback pcmreadercallback);
如您所见,它将
PCMReaderCallback
作为参数,该参数是上面代理的名称

现在,为了使用它,您首先需要创建一个与委托参数匹配的函数。请记住,我们的委托将
float[]
作为参数,并且是
void
返回类型。这个函数的名字其实并不重要。它应该如下所示:

void OnAudioRead(float[] data)
{

}
最后,要使用该函数:

AudioClip newAudioClip = AudioClip.Create("Pigeon", samplerate * 2, 1, samplerate, true, OnAudioRead);
AudioSource attachedSource = GetComponent<AudioSource>();
attachedSource.clip = newAudioClip;
attachedSource.Play();
该功能的使用

创建一个函数,该函数将在
makeAlecAudioFunction
完成数据处理时调用

void OnAlecAudio(float[] data)
{
    for (int i = 0; i < data.Length; i++)
    {
        Debug.Log("Alec Audio Data: " + data[i]);
    }
}

最后,我认为回调函数背后的主要原因是在不让程序的其余部分等待的情况下执行某个操作,然后在该操作完成时执行回调。因此,您的
makeAlecAudioFunction
应该是一个协程函数,或者应该在另一个
线程中调用(统一复杂)。如果使用
线程
,则必须在主
线程
中调用回调。请尽量简化此示例。

委托是您(或其他人)定义的方法描述类型。如果您熟悉类型Action和Func。它们是定义作为参数传递的预定义方法类型的委托

例如,您的类型
PCMReaderCallback(float[]data)
,可以在如下方法中使用:

public void ProcessData(PCMReaderCallback callback)
{
   List<float> data = new List<float>();
   // generate data here, or load it, etc
   // Then pass the data to the callback.
   callback(data.ToArray());
} 
还有另一种方法

public void PrintData(float[] data)
{
   foreach(var d in data)
      Console.WriteLine(d.ToString());
}
你会调用ProcessData,比如

ProcessData(LogData); // or...
ProcessData(PrintData);
委托还用于创建事件,然后可以订阅这些事件。查看事件和代表。但一个事件可能是

public event PCMReaderCallback DataRead;
然后在后面的read方法中,我们让世界知道数据已经被读取,订阅了事件DataRead的任何人都可以对其进行处理。像

// read data here
// Then pass to event, first check to see if we have any subscribers.
if (DataRead != null)
{
   // Then prevent race conditions (subscribes and unsubscribes while processing events)
   var Event = DataRead;
   Event(data); // Then call the event here
}

你能用代码代替成堆的句子吗?@LeiYang-我已经不顾一切地对问题进行了重新编排。我想在回调使用的相关代码中看到OP add。我试着阅读文档,我可以看到它在哪里。这说明了你需要做什么吗?@AlexC你最关心的是什么:C#委托/活动还是unity3d?我在想象这样的事情。public void MyMethod(参数){我希望发生什么}先前存在的delegate=MyMethod;谢谢你们!!!这一切真的很有帮助!我要放弃所有人的选票!!!!不客气。你不能因为没有足够的声誉而放弃投票。你唯一能做的就是接受一个你认为对你帮助最大的答案。是如何做到这一点。谢谢大家我这一切都非常有帮助!我给每个人投票选出最好的亚历克斯
ProcessData(LogData); // or...
ProcessData(PrintData);
public event PCMReaderCallback DataRead;
// read data here
// Then pass to event, first check to see if we have any subscribers.
if (DataRead != null)
{
   // Then prevent race conditions (subscribes and unsubscribes while processing events)
   var Event = DataRead;
   Event(data); // Then call the event here
}