【问题标题】:Global "using" directives in VS2010/C#?VS2010/C# 中的全局“使用”指令?
【发布时间】:2011-05-06 01:44:57
【问题描述】:

我很确定我知道答案,但我想知道是否有办法在我的 C# 项目中定义一个全局“使用”指令,这样我就不必在每个代码文件的顶部重复该指令.

我的兴趣真正源于在 .NET Framework 中引入扩展方法。使用扩展方法的唯一方法是为包含扩展方法的命名空间定义 using 指令。如果没有 using 指令,我将失去扩展方法的 Intellisense 功能,这意味着我不会总是看到可用的方法。

作为一名框架开发人员,确保框架中提供的类型和方法清晰且可供消费开发人员使用是我的关键。虽然文档和培训服务于他们的目的,但我发现大多数开发人员会在这段时间内滚动浏览 Intellisense 列表以查看可用的方法和属性。即使他们去对象浏览器或查看参考文档,除非他们知道扩展方法,否则他们不会知道扩展方法。这就是 Intellisense 的用武之地。

而且,虽然我可以将 using 指令添加到 VS 使用的模板中,但 VS 中的“删除和排序”选项将删除引用扩展方法的指令(如果没有使用)。

那么,说了这么多,有没有办法在 VS 2010 中定义全局“使用”指令?如果没有,MS 是否有可能在未来考虑它?

【问题讨论】:

  • 这是由扩展方法滥用引起的。开发人员现在很难找到合适的#using。几年后当其他人必须阅读代码时谋杀。
  • 我不同意。扩展方法是有目的的,但只有在您知道它们存在时才有用。默认情况下,当没有 using 指令时,它们不可用。因此,如果开发人员必须首先了解该方法,这不是开发人员找到正确的 using 语句的问题。而且,借助 VS 中内置的 Resolve 功能以及 ReSharper 等工具,找到正确的 using 指令变得更加容易。

标签: c# visual-studio-2010 using-statement using-directives .net-4.0


【解决方案1】:

您可以将扩展方法放置在全局命名空间中,方法是确保不在命名空间中声明包含的类。这将使它们在全球范围内可用。

至于默认命名空间 - 除了更改 VS 模板之外,这是不可能的。

当然,MS 会考虑它总是可能。不太可能,但可能。

与其寻找技术解决方案,也许您应该考虑教育您的开发人员并提供有关扩展方法的约定(例如,已知的位置/命名空间架构)?

【讨论】:

  • 我同意你的最后一段;没有人(好吧,也许几乎没有人)想要使用一个污染其全局命名空间的框架,他们希望在需要时有针对性地使用该框架,并在不需要时将其消失。
  • 正如我所说,教育和文档仅能走这么远,绝大多数人(包括开发人员)通过申请保留。虽然我们可以在代码审查期间提供培训和参考资料以及捕获实例,但如果这些方法显示在 Intellisense 中仍然会很好。如果 ReSharper 完成了这一点,如下所示,那么我认为我没问题。
  • @SonOfPirate - 据我所知,Resharper 不会自动添加 using 语句。
【解决方案2】:

为了回答您的实际问题,如果您将带有扩展名的静态类放在 no 命名空间中,那么它将随处可用。小心使用!

【讨论】:

  • 我没有想过以这种方式“隐藏”扩展方法,但我同意这听起来不是一个好习惯。
【解决方案3】:

如果它对您来说真的很重要,您可以让您的公司购买 ReSharper 并将其安装在所有开发机器上,这样您就可以为这些方法提供 Intellisense,并可以选择“自动添加” using 指令。

据我所知(我自己没有使用它)ReSharper 扫描所有可能的程序集,我假设您可以将它配置为在创建新类时自动添加“使用”指令,尽管我对此不是 100% 确定.

【讨论】:

  • 我将不得不再次查看 ReSharper 以查看它是否在 Intellisense 中显示扩展方法,即使没有 using 指令也是如此。这将解决我的问题,并且我们已经在所有开发系统上安装了 ReSharper。不幸的是,正是 ReSharper 的内置组织功能在保存时对未使用的 using 指令进行排序和删除,这导致了这种情况。但是,如果它们仍然显示在 Intellisense 中,那么我认为一切都很好。
  • @SonOfPirate - 我相信确实如此,但也许只有在较新的版本中......:/
【解决方案4】:

您可以为包含您的 using 指令的类创建 .net 文件模板。

请参阅创建项目和项模板 (https://msdn.microsoft.com/en-us/library/ms247121.aspx)。

您可以将模板保存为您的扩展项目的一部分;但是,最好在不同的项目中完成。

【讨论】:

    【解决方案5】:

    VS 2010 中没有选项可以这样做,但在VS 2022C# 10.0 中,您可以使用Global Usings

    global using <TheNamespace>;
    

    【讨论】:

      【解决方案6】:

      global using 指令是 C# 10 中的一个新 language feature。在 .NET 6 上运行时,还有 implicit global using 指令在 certain namespaces 中可用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多