Sometimes new language features can engender new anti-patterns.
C# 10 introduced global using directives, a feature that allows developers to prepend any using
directive with the keyword global
. This has the effect of making the using
directive accessible anywhere in the project.
Unfortunately, what I’ve seen is that developers will create a file named something like Global.cs
and then dump every possible using
directive they can into that file.
There are a couple problems with this:
- If you have types with the same names across different namespaces, the compiler will get confused about what’s what, and you’ll have ambiguous references. Sure, those can be fixed with
using
aliases, but it would be simpler to just not introduce the problem in the first place, would it not? - The moment you start using this feature, it becomes impossible to reason about what namespaces a given file has access to simply by looking at the file.
Consider you have a file that looks like this:
namespace ConsoleApp
{
public class Program
{
public static void Main(string[] args)
{
var fooComponent = new FooComponent();
Console.WriteLine(fooComponent.Bar);
}
}
}