C#中的“委托”关键字是什么意思

时间:2019-06-13 07:56:20

标签: c# unity3d

我正在尝试使用Hololens拍摄照片,我指的是C#中的Unity手册。

在手册中,我找到了以下包含关键字“ delegate”的代码段。我知道“ delegate”关键字用于指代功能。但是在这个代码示例中,我无法理解它是如何工作的。

此功能中“委托”关键字的确切目的是什么

PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject)
{
    photoCaptureObject = captureObject;
    CameraParameters cameraParameters = new CameraParameters();
    cameraParameters.hologramOpacity = 0.0f;
    cameraParameters.cameraResolutionWidth = cameraResolution.width;
    cameraParameters.cameraResolutionHeight = 
    cameraResolution.height;
    cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;
});

2 个答案:

答案 0 :(得分:1)

这是一个匿名方法。匿名方法是没有名称的方法

例如具有名称,采用字符串且未返回任何内容的方法将如下所示:

void DoSomething(string s)
{
}

一个匿名方法,该方法采用字符串,但不返回任何内容,但没有名称,看起来像这样:

delegate (string s) 
{
}

使用它们的地方

您只能将此类匿名方法用作表达式,即作为其他方法的参数,返回类型或在赋值语句中使用

在上面的示例中,您有一个匿名方法,该方法接受一个PhotoCapture对象,但不返回任何内容,如下所示:

delegate (PhotoCapture captureObject)
{
}

它将作为参数传递给另一个名为CreateAsync的方法,因此它看起来像这样:

PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject)
{
});

也可以使用命名方法(即具有名称的方法)来编写相同的内容。

PhotoCapture.CretaeAsync(false, ANamedMethod);

void ANamedMethod(PhotoCapture captureObject)
{
}

为什么使用它们?

要传递委托实例的地方可以使用匿名方法。通过传入匿名方法,您实际上是在将该匿名方法添加到隐式委托实例的调用列表中。

所以,这个:

PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject)
{
});

也与以下内容相同:

// this method does something with a PhotoCapture object
// It makes it look nice
void MakePhotoCaptureNice(PhotoCapture captureObject)
{
}

// Delegate type
public delegate void DoerOfSomethingWithPhotoCapture(PhotoCapture captureObject);

var delegateInstance = new DoerOfSomethingWithPhotoCapture(MakePhotoCaptureNice);

PhotoCapture.CreateAsync(false, delegateInstance);

为什么我要使用匿名方法代替命名方法?

匿名方法是一种捷径,一种简写的语法,显然是为了方便起见,因此您不必键入上面看到的所有内容。

您将在以下情况下使用它: 1.您想少打字;和 2.您知道您将永远不必在其他地方使用MakePhotoCaptureNice方法。那么,为什么要给它起个名字并输入所有这些东西呢?

然后,您可以将MakePhotoCaptureNice方法转换为匿名方法,如下所示:

// Delegate type
public delegate void DoerOfSomethingWithPhotoCapture(PhotoCapture captureObject);

var delegateInstance = new DoerOfSomethingWithPhotoCapture(delegate  (PhotoCapture captureObject)
{
});


PhotoCapture.CreateAsync(false, delegateInstance);

或更妙的是,只需摆脱delegateInstance并替换其位置,如下所示替换匿名方法:

PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject)
{
});

关于代表

这里有一些英语和印地语的视频,可以帮助您学习与会代表。

  1. Delegates (in Hindi) - Part 1
  2. Delegates (in Hindi) - Part 2
  3. Delegates (in Hindi) - Part 3
  4. Delegates (in Hindi) - Part 4
  5. Delegates(这是英文)

答案 1 :(得分:0)

PhotoCapture.CreateAsync方法签名可能看起来像这样:

PhotoCapture.CreateAsync(bool b, Action<PhotoCapture> action){
   ...
}

这意味着您将不会传递普通对象,而是传递对可以(但不必)执行的函数的引用。

也可以使用lambda expxression而不是'delegate'关键字来编写呼叫,如下所示:

PhotoCapture.CreateAsync(false, captureObject =>
     {
         photoCaptureObject = captureObject;
         CameraParameters cameraParameters = new CameraParameters();
         cameraParameters.hologramOpacity = 0.0f;
         cameraParameters.cameraResolutionWidth = cameraResolution.width;
         cameraParameters.cameraResolutionHeight = 
         cameraResolution.height;
         cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;

     });