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

7
我很确定我知道答案,但我想知道是否有一种方法来定义全局“using”指令在我的C#项目中,以便我不必在每个代码文件的顶部重复指令。
我的兴趣真正根植于.NET Framework中引入的扩展方法。使用扩展方法的唯一方法是为包含扩展方法的命名空间定义一个using指令。如果没有using指令,我将失去扩展方法的Intellisense功能,这意味着我不会总是看到可用的方法。
作为框架开发者,确保提供给消费开发者的类型和方法清晰并且可用对我至关重要。虽然文档和培训起到了作用,但我发现大多数开发人员会敲出句点并滚动Intellisense列表,以查看可用的方法和属性。即使他们转到对象浏览器或查看参考文档,除非他们知道有关它的信息,否则他们不会知道扩展方法。这就是Intellisense的作用所在。
虽然我可以向VS使用的模板添加using指令,但是如果没有使用该指令,则“删除和排序”选项将删除引用扩展方法的指令。
因此,所有这些都说了,是否有任何方法在VS 2010中定义全局“using”指令?如果没有,MS是否正在考虑将来这样做?

这是通过扩展方法滥用自我引发的问题。现在对开发人员来说很难找到适当的 #using。几年后,当其他人需要阅读代码时,会变得非常困难。 - Hans Passant
1
我不同意。扩展方法有其作用,但只有在您知道它们存在时才有用。默认情况下,如果没有使用指令,它们是不可用的。因此,这不是开发人员找到正确的使用语句的问题,如果他们必须首先了解该方法。而且,在VS中内置的Resolve功能以及像ReSharper等工具,查找适当的使用指令要容易得多。 - SonOfPirate
7个回答

6
您可以将扩展方法放置在全局命名空间中,确保包含类没有在命名空间中声明即可。这将使它们在全局范围内可用。
至于默认命名空间-除了更改VS模板外,这是不可能的。
当然,微软有可能考虑这一点。虽然不太可能,但也有可能。
与其寻找技术解决方案,也许您应该考虑教育您的其他开发人员,并提供关于扩展方法的公约(例如,已知的位置/命名空间模式)?

我同意你的最后一段;没有人(好吧,也许大多数人都不想)使用一个污染全局命名空间的框架,他们希望在需要时有针对性地使用框架,并且在不需要时它能够消失。 - Randolpho
正如我所说,教育和文档只能做到这一步,绝大多数人(包括开发人员在内)都是通过应用来保持记忆的。虽然我们可以提供培训和参考资料,并在代码审查中捕捉实例,但如果方法显示在智能感知中,那就更好了。如果ReSharper可以实现这一点,如下所示,那么我认为我没问题了。 - SonOfPirate
据我所知,Resharper不会自动添加“using”语句。 - Oded
您现在有这个可能性了。请参考我的回答 - Despacito 2

2

global using指令是C# 10中的一项新语言特性。在.NET 6上运行时,还有一些特定命名空间中可用的implicit global using指令。


1
在VS 2010中没有这个选项,但是在带有C# 10.0的VS 2022中,你可以使用全局Usings来实现。
global using <TheNamespace>;

0

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

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

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


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

我之前没有想过以这种方式“隐藏”扩展方法,但我同意这不是一个好的做法。 - SonOfPirate

0
如果这对你非常重要,你可以让你的公司购买ReSharper并在所有开发机器上安装它,这将为你提供这些方法的Intellisense,并具有“自动添加”using指令的选项。
据我所知(我自己没有使用过),ReSharper扫描所有可能的程序集,我认为你可以配置它在创建新类时自动添加“using”指令,尽管我不是100%确定。

我需要再次查看ReSharper,以查看它是否在没有使用指令的情况下在Intellisense中显示扩展方法。这将解决我的问题,我们已经在所有开发系统上安装了ReSharper。不幸的是,正是ReSharper内置的组织功能在保存时对未使用的使用指令进行排序和删除,导致了这种情况的出现。但是,如果它们仍然在Intellisense中显示,则我认为一切都很好。 - SonOfPirate
@SonOfPirate - 我相信它确实可以,但可能只在更新的版本中才能使用.. :/ - Shadow The Spring Wizard

0

C# 10中引入了全局using指令

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

global using System;

推荐的标准是将所有的global using指令放在一个Usings.cs文件中,以将它们与项目的其余部分分离开来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接