Przestrzenie nazw

Przestrzenie nazw #

Przestrzenie nazw działają na tej samej zasadzie co w C++. Różnicą jest sposób wyłuskiwania elementów z przestrzeni nazw, w C# robi się to za pomocą operatora .. Poza tym mamy kilka sposobów definicji przestrzeni nazw.

Wyjątkiem jest globalna przestrzeń nazw z której wyłuskuje się elementy poprzez operator global::. W praktyce jest to jednak rzadko przydatne (wcale).

Outer.Middle.Inner.ClassA a;

namespace Outer
{
    namespace Middle
    {
        namespace Inner
        {
            class ClassA {}
        }
    }
}

namespace Outer.Middle.Inner
{
    class ClassB {}
}

namespace Outer.Middle.Inner; // Obowiązuje do końca pliku

class classC {}

Dyrektywa using #

Durektywa using pozwala na importowanie przestrzeni nazw do bieżącego pliku, dzięki czemu nie trzeba używać pełnej kwalifikacji nazw dla typów w nich zawartych.

using Outer.Middle.Inner;

Outer.Middle.Inner.ClassB b1;
ClassB b2; // Można też tak

namespace Outer.Middle.Inner
{
    class ClassB {}
}

Statyczne using #

Statyczne using importuje typy, a nie przestrzenie nazw. Efektem tego jest możliwość używania wszystkich statycznych członków klas, a w przypadku wyliczeń jego elementów, bez podawania pełnego kwalifikatora.

using static System.Console; // class
using static System.DayOfWeek; // enum

WriteLine("Hello, world!");
WriteLine(Monday); // without using, it would be `DayOfWeek.Monday`

Globalne using #

Globalne using propaguje się na wszystkie pliki projektu. Musi być umieszczone przed innymi dyrektywami using.

global using System;
global using System.IO;

Niejawne, globalne using (Implicit global using) #

Od .NETa 6.0, projekty w stylu SDK posiadają opcję, która w momencie budowania programu dodaje do naszego programu plik z globalnymi dyrektywami using.

Dyrektywy te zależą od wybranego SDK, dla “Microsoft.NET.Sdk” są to:

  • System
  • System.Collections.Generic
  • System.IO
  • System.Linq
  • System.Net.Http
  • System.Threading
  • System.Threading.Tasks

Można tę opcję wyłączyć ustawiając właściwość ImplicitUsings na false w pliku projektu.

Aliasy typów #

Dyrektywy using można też używać do wprowadzania aliasu pojedynczego typu lub przestrzeni nazw, zamiast importowania wszystkiego z przestrzeni nazw. Przydatne wtedy gdy dwa typy kolidują w dwóch różnych przestrzeniach nazw, a chcemy używać obydwu, np. Vector3 z System.Numerics i Vector3 z zewnętrznej biblioteki. Od C# 12 możemy aliasować praktycznie dowolny typ, w tym tablice i krotki.

using Vec3 = System.Numerics.Vector3;
using Refl = System.Reflection;
using NumberList = double[];
using PersonInfo = (string Name, int Age);

Vec3 vector;
Refl.PropertyInfo propInfo;
NumberList numbers = { -0.5, 0.5 };
PersonInfo person = ("Alice", 42);