我正在尝试使用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;
});
答案 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 :(得分: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;
});