4

在分析 Orchard.cms 源代码时,我发现了有趣的代码,当 C# 中的括号不用于定义任何内部对象时。似乎它是为某些上下文使用而制作的。您能否澄清使用这样的括号的目标是什么?

这是它的代码示例:

 builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().As<IEventHandler>().SingleInstance();
 {
     builder.RegisterType<ShellSettingsManager>().As<IShellSettingsManager>().SingleInstance();

     builder.RegisterType<ShellContextFactory>().As<IShellContextFactory>().SingleInstance();
     {
         builder.RegisterType<ShellDescriptorCache>().As<IShellDescriptorCache>().SingleInstance();

         builder.RegisterType<CompositionStrategy>().As<ICompositionStrategy>().SingleInstance();
         {
             builder.RegisterType<ShellContainerRegistrations>().As<IShellContainerRegistrations>().SingleInstance();
             builder.RegisterType<ExtensionLoaderCoordinator>().As<IExtensionLoaderCoordinator>().SingleInstance();
             builder.RegisterType<ExtensionMonitoringCoordinator>().As<IExtensionMonitoringCoordinator>().SingleInstance();
             builder.RegisterType<ExtensionManager>().As<IExtensionManager>().SingleInstance();
             {
                 builder.RegisterType<ExtensionHarvester>().As<IExtensionHarvester>().SingleInstance();
                 builder.RegisterType<ModuleFolders>().As<IExtensionFolders>().SingleInstance()
                     .WithParameter(new NamedParameter("paths", new[] { "~/Modules" }));
                 builder.RegisterType<CoreModuleFolders>().As<IExtensionFolders>().SingleInstance()
                     .WithParameter(new NamedParameter("paths", new[] { "~/Core" }));
                 builder.RegisterType<ThemeFolders>().As<IExtensionFolders>().SingleInstance()
                     .WithParameter(new NamedParameter("paths", new[] { "~/Themes" }));

                 builder.RegisterType<CoreExtensionLoader>().As<IExtensionLoader>().SingleInstance();
                 builder.RegisterType<ReferencedExtensionLoader>().As<IExtensionLoader>().SingleInstance();
                 builder.RegisterType<PrecompiledExtensionLoader>().As<IExtensionLoader>().SingleInstance();
                 builder.RegisterType<DynamicExtensionLoader>().As<IExtensionLoader>().SingleInstance();
                 builder.RegisterType<RawThemeExtensionLoader>().As<IExtensionLoader>().SingleInstance();
             }
         }

         builder.RegisterType<ShellContainerFactory>().As<IShellContainerFactory>().SingleInstance();
     }

     builder.RegisterType<DefaultProcessingEngine>().As<IProcessingEngine>().SingleInstance();
 }
4

3 回答 3

5

在这种情况下,目标只是让开发人员/人类在阅读代码时更容易理解类型如何分层关联,以便更容易理解代码

(使用像这样的花括号会缩进大多数 IDE 中的行,例如 Visual Studio)

于 2013-07-26T12:17:39.807 回答
4

您能否澄清使用这样的括号的目标是什么?

它们只是块。它们形成一个范围,如:

Method1(1);

{
   int i = 1;  // i is local to this {} block
   Method1(i++);
}
// Here i does not exist any more

请注意,该块与前面的语句没有任何关系,您的示例中缺少空行可能会产生误导。

但是在发布的代码中,没有声明任何变量。所以它们完全是多余的。我猜它们是一些代码预处理留下的。

于 2013-07-26T12:15:36.807 回答
1

在这种情况下,它只是一个组织的事情。花括号创建了一个范围,因此在括号内声明的任何变量都是该代码块的本地变量。所以这是他们的正常目的。

也就是说,在您给出的示例中,它们中的任何一个都没有声明任何内容。在这种情况下,Orchard 的人只是将其作为一种组织方法来使代码更易于理解。我猜如果您查看您给出的示例中的类,您会发现它们以分层方式相关,类似于它们按花括号分组的方式。

于 2013-07-26T12:19:11.303 回答