gpt4 book ai didi

c# - C# 中 delegate() 方法的确切含义是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 18:21:03 25 4
gpt4 key购买 nike

我是 C# 的新手(我来自 Java),我正在处理一个 SharePoint 项目。

我对我的代码中的这个方法有以下疑问:

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
lock (this)
{
try
{
SPSecurity.RunWithElevatedPrivileges(delegate ()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
DeleteExistingJob(JobName, parentWebApp);
});
}
catch (Exception ex)
{
throw ex;
}
}
}

如您所见,此代码在 delegate() {...}“ block ”中执行:

SPSecurity.RunWithElevatedPrivileges(delegate ()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
DeleteExistingJob(JobName, parentWebApp);
});

delegate() 方法到底是什么意思?

阅读此处:https://learn.microsoft.com/it-it/dotnet/csharp/language-reference/keywords/delegate

在我看来,它类似于一种声明“匿名”方法的方法,其中该方法的实现是代码到 {...} block 中。

这是正确的解释还是我遗漏了什么?

如果它是正确的,这个delegate() 方法的用途是什么?为什么我不将代码声明为经典方法?具体用途是什么?

最佳答案

根据您提到的文档,delegate 关键字用于两个目的:

  • 声明委托(delegate)类型
  • 创建一个转换为委托(delegate)实例的匿名方法

现在您可以在常规方法中编写匿名方法中的所有代码,然后使用方法组转换来创建委托(delegate)实例,但这通常很烦人 - 特别是如果您想要在匿名方法中使用任何局部变量或参数。

这就是为什么您要使用匿名方法的原因 - 或者在 C# 3 之后的任何内容中,您更有可能改用 lambda 表达式

如果您没有使用匿名方法或 lambda 表达式,请考虑如何在您的示例中创建委托(delegate)。你需要写这样的东西:

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
lock (this)
{
// Note: try/catch removed as it's pointless here, unless you're
// *trying* to obscure the stack trace in case of an exception
JobDeletionHelper helper = new JobDeletionHelper(properties);
// Note that we're using a method group conversion here - we're not
// invoking the method. We're creating a delegate which will invoke
// the method when the delegate is invoked.
SPSecurity.RunWithElevatedPrivileges(helper.DeleteJob);
}
}
// We need this extra class because the properties parameter is *captured*
// by the anonymous method
class JobDeletionHelper
{
private SPFeatureReceiverProperties properties;

internal JobDeletionHelper(SPFeatureReceiverProperties properties)
{
this.properties = properties;
}

public void DeleteJob()
{
// This is the code that was within the anonymous method
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
DeleteExistingJob(JobName, parentWebApp);
}
}

如果您要问的是委托(delegate)本身的目的,那是一个稍微大一点的话题 - 但简而言之,它是将可执行代码表示为对象的能力,因此可以将其传递给其他代码来执行。 (如果有用的话,您可以将委托(delegate)类型视为单一方法接口(interface)。)

关于c# - C# 中 delegate() 方法的确切含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53943672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com