VS2010/C# 中的全局“使用”指令?

Global "using" directives in VS2010/C#?

提问人:SonOfPirate 提问时间:11/7/2010 最后编辑:AzharSonOfPirate 更新时间:1/11/2022 访问量:5127

问:

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

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

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

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

那么,话虽如此,有没有办法在 VS 2010 中定义全局“使用”指令?如果没有,MS 有没有可能在未来考虑它?

C# visual-studio-2010 using-statement using-directives NET-4.0

评论

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

答:

6赞 Oded 11/7/2010 #1

可以通过确保未在命名空间中声明包含类来将扩展方法放在全局命名空间中。这将使它们在全球范围内可用。

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

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

与其寻找技术解决方案,也许你应该考虑教育你的开发人员同事,并提供一个关于扩展方法的约定(例如,已知的位置/命名空间模式)?

评论

0赞 Randolpho 11/7/2010
我同意你的最后一段;没有人(好吧,也许大部分人)都不想使用一个污染他们全局命名空间的框架,他们希望在他们想要的时候有针对性地使用这个框架,并在不需要的时候让它消失。
0赞 SonOfPirate 11/8/2010
正如我所说,教育和文档只能走到这一步,绝大多数人(包括开发人员)通过申请留住了学生。虽然我们可以提供培训和参考资料,并在代码审查期间捕获实例,但如果在 Intellisense 中显示这些方法,那仍然会很好。如果 ReSharper 做到了这一点,如下所示,那么我想我没问题。
0赞 Oded 11/8/2010
@SonOfPirate - 据我所知,Resharper 不会自动添加语句。using
0赞 Despacito 2 1/11/2022
您现在可以这样做。请参阅我的回答
0赞 vcsjones 11/7/2010 #2

为了回答你的实际问题,如果你把你的静态类和扩展放在没有命名空间中,它将在任何地方都可用。请小心使用!

评论

0赞 SonOfPirate 11/8/2010
我没有想过以这种方式“隐藏”扩展方法,但我同意这听起来不像是好的做法。
0赞 Shadow Wizard Is Sad And Angry 11/7/2010 #3

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

据我所知(我自己没有使用它)ReSharper 会扫描所有可能的程序集,我认为您可以将其配置为在创建新类时自动添加“using”指令,尽管我不是 100% 确定这一点。

评论

0赞 SonOfPirate 11/8/2010
我必须再次查看 ReSharper,看看它是否在 Intellisense 中显示扩展方法,即使没有 using 指令也是如此。这将解决我的问题,我们已经在所有开发系统上安装了 ReSharper。不幸的是,正是 ReSharper 的内置组织功能在保存时对未使用的使用指令进行排序和删除,导致这种情况成为焦点。但是,如果它们仍然显示在 Intellisense 中,那么我认为一切都很好。
0赞 Shadow Wizard Is Sad And Angry 11/8/2010
@SonOfPirate - 我相信它确实如此,也许只是在较新的版本中。:/
0赞 cynical.coder 3/20/2017 #4

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

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

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

1赞 Misha Zaslavsky 8/16/2021 #5

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

global using <TheNamespace>;
2赞 Beltway 10/21/2021 #6

该指令是 C# 10 中的一项新语言功能。在 .NET 6 上运行时,某些命名空间中还提供了 using 指令。global usingimplicit global

0赞 Despacito 2 1/11/2022 #7

全局 using 指令是在 C# 10 中引入的。

它可以通过与本地 using 指令相同的方式使用,只是您在它的前面放置一个关键字,以便指示编译器在整个项目中提供对以下指令的访问:global

global using System;

建议的标准是将所有指令放在一个文件中,以将它们与项目的其余部分分开。global usingUsings.cs