namespaces
Namespaces declare scopes:
namespace SomeNamespace
{
class SomeClass { }
}
Namespace declarations can also be file-scoped:
using SomeNamespace; // Imports all classes from namespace.
Imports (using Directive)
using SomeNamespace;
aliases
The using directive can create aliases to namespaces:
using MyNamespace = Really.Long.Nested.Namespace;
ℹ️ Important
Availability: C# 12
Or, to a type:
using WpfButton = System.Windows.Controls.Button;
using WinFormsButton = System.Windows.Forms.Button;
var wpfButton = new WpfButton();
var winFormsButton = new WinFormsButton();
Including generic types:
using StringList = System.Collections.Generic.List<string>;
var strings = new StringList { "C#", "TypeScript" };
Even a Tuple:
using MyTuple = (int Min, int Max);
But not a reference type:
// ILLEGAL
using X = string?;
global
The global modifier has the same effect as adding the same using directive to every source file in a project:
global using SomeNamespace;
Can also be added to project file instead:
<Using>namespace</Using>
static
The static modifier imports only the static members and nested types from a namespace:
static using SomeNamespace;
using static System.Console; // Imports a type's methods, like WriteLine.
Implicit Using Directives
Some SDKs have implicit using directives. For example, for console applications (Microsoft.Net.Sdk):
SystemSystem.IOSystem.Collections.GenericSystem.LinqSystem.Net.HttpSystem.ThreadingSystem.Threading.Tasks
disabling
To disable implicit imports, add this line to the project file:
<ImplicitUsings>disable</ImplicitUsings>
To use implicit imports but remove a specific one:
<ItemGroup>
<Using Remove="System.Net.Http" />
</ItemGroup>
using statement
The using statement generates a finally statement that calls the Dispose() method on an object that implements IDisposable:
using (FileStream xmlFileStream = File.Create(file.xml)) { … }