Névterek és használati utasítások

Jótanács

Új szoftverfejlesztés? Először az Első lépések oktatóanyagokkal kezdje. Az első programok írásakor névtereket és using irányelveket vezetnek be.

Tapasztalt egy másik nyelven? A C# névterei a Java-csomagokhoz vagy a Python-modulokhoz hasonlóan működnek. Haladjon előre a szükséges szintaxishoz.

A névtér deklarációi és using irányelvei a kapcsolódó nyelvi funkciók. A névtér-deklaráció rendszerezett struktúrába helyezi a típusokat. A névtér csoportosítja a kapcsolódó típusokat, és megakadályozza az elnevezési ütközéseket. Egy using irányelv lehetővé teszi, hogy a program egyszerű nevük alapján használja ezeket a típusokat. Nem kell minden használatnál megadnia a teljes névtér elérési útját.

Már használt névtereket minden C#-programban, amelyet írt. Minden .NET-típus egy névtérhez tartozik, és a fájl tetején lévő összes using direktíva egyre hivatkozik. Például a Console és Math a System névtérhez tartozik, így a teljesen kvalifikált nevük a System.Console és a System.Math. A List<T> és Dictionary<TKey, TValue> gyűjteménytípusok System.Collections.Generic-hoz tartoznak. using Ezeknek a névtereknek egyetlen irányelve lehetővé teszi, hogy egyszerű nevük alapján hivatkozzon az összes típusára. Mindenhol List<T>-t ír, ahol System.Collections.Generic.List<T>-t használ.

Ez a cikk további hátteret biztosít a névterek és using irányelvek működéséhez, és példákat mutat be a .NET-kódtárakban már tapasztalt mintákra.

A névtér típusokat tartalmaz. Minden .NET-típus egy névtérhez tartozik. Vegyük például a System.Threading.Tasks.Taskkövetkezőt: a típus Task a System.Threading.Tasks névtérhez tartozik.

Célszerű a kapcsolódó vagy hasonló típusokat ugyanabban a névtérben csoportosítani, és ezt teszi a .NET az általa biztosított típusokkal. A System.Collections.Generic névtér gyűjteményhez kapcsolódó típusok, a System.IO névtér pedig olvasási és írási fájlokat, könyvtárakat és adatokat tartalmaz. A System névtér olyan alapvető típusokat tartalmaz, mint a Math, DateTimeés Console.

Az alábbi példa bemutatja, hogyan működnek együtt a névterek az irányelvekkel using egy tipikus C#-fájlban:

using System;
using System.Globalization;

namespace MyApp.Services;

class Greeter
{
    public string Greet(string name)
    {
        var culture = CultureInfo.CurrentCulture;
        return $"Hello, {name}! Culture: {culture.Name}";
    }
}

Az előző példában az using irányelv azt jelenti, hogy a System.Globalization.CultureInfo-t a CultureInfo név megadása nélkül használhatja System.Globalization.CultureInfo néven. Az namespace irányelv kijelenti, hogy az Greeter osztály a MyApp.Services névtér része. Teljesen minősített neve MyApp.Services.Greeter.

Névtér-deklarációk

A névtér deklarációja hozzárendeli a típusokat egy elnevezett csoporthoz. Minden írási típusnak egy névtérhez kell tartoznia. A névtér neve általában a projekt mappastruktúráját tükrözi. Egy mappa típusok Services/Payments például gyakran a MyApp.Services.Payments névtérhez tartoznak.

A névterek az operátorral fejezik ki a . hierarchiát, például System.Collections.Generic. A névtérneveknek érvényes C# azonosítóneveknek kell lenniük.

Fájlhatókörű névterek

A fájlhatókörű szintaxist akkor használja, ha egy fájl minden típusa ugyanahhoz a névtérhez tartozik. Adjon hozzá pontosvesszőt a névtér deklarációja után, és az a teljes fájlra vonatkozik. Nincs szükség további kapcsos zárójelekre vagy behúzásra.

namespace MyApp.Models;

class Customer
{
    public required string Name { get; init; }
    public string? Email { get; init; }

    public override string ToString() => $"{Name} ({Email ?? "no email"})";
}

A fájlhatókörű névterek csökkentik a beágyazást, és megkönnyítik a fájlok olvasását. Fájlonként csak egy fájlhatókörű névtér-deklarációval rendelkezhet.

Jótanács

Használjon fájlhatókörű névtereket az új kódban. A legtöbb .NET-sablon és kódelemző ezt a stílust javasolja.

Blokkhatókörű névterek

Használjon blokkhatókörű szintaxist , ha több névteret kell deklarálnia ugyanabban a fájlban. Ez a stílus további behúzási szintet ad hozzá.

Fontos

Ritkán lehet több névteret deklarálni ugyanabban a fájlban. A leggyakoribb forgatókönyv a fájlhatókörű névterek használata.

Az alábbi kódrészlet egy blokkhatókörű névtér példája:

namespace MyApp.Models
{
    class Product
    {
        public required string Name { get; init; }
        public decimal Price { get; init; }

        public override string ToString() => $"{Name}: {Price:C}";
    }
}

Irányelvek használata

using direktíva nélkül minden típusra a teljesen minősített nevével kell hivatkoznia, vagyis a teljes névtérútvonallal és a típus nevével. Ez a stílus részletes, ismétlődő és nehezebben olvasható, különösen akkor, ha egy fájl több típust használ ugyanabból a névtérből:

static void ShowFullyQualified()
{
    // Without a using directive, use the fully qualified name:
    System.Console.WriteLine("Hello from fully qualified name!");
}

A fájl elején lévő using direktíva egy névteret importál, hogy a benne lévő típusokat az egyszerű nevükkel lehessen használni. Az alábbi kódrészlet az importálás utáni rövidebb típushasználatot mutatja be, amely a fájlban rövidebb és könnyebben olvasható hivatkozásokat tartalmaz:

static void ShowShortName()
{
    // With 'using System;' (or implicit usings enabled), use the short name:
    Console.WriteLine("Hello from short name!");
}

További információt az irányelvbenusing talál.

Globálisan használt irányelvek

Az using irányelv csak arra a fájlra vonatkozik, amelyben megjelenik. Ahelyett, hogy minden fájlban ugyanazokat using az irányelveket ismételi, globálisan használjon irányelveket, amelyek lehetővé teszik, hogy a teljes projekthez egyszer deklarálja őket. Helyezze őket bármilyen fájlba. Számos csapat hoz létre egy dedikált GlobalUsings.cs fájlt:

global using System.Text;
global using System.Text.Json;

A globális használat deklarálása után a projekt minden fájlja hivatkozhat a névtérből származó típusokra egyszerű neveik alapján, további using irányelv nélkül. A globális használat eltávolítja az ismétlődést a fájlok között, csökkenti a using blokkot az egyes fájlok tetején, és központosítja a projekt névtérszabályzatát.

Implicit használat

A leggyakoribb névterek esetében egyáltalán nem kell irányelveket írnia using . A .NET SDK a projekt típusa alapján automatikusan globális using direktívákat hoz létre. Implicit használat engedélyezése a projektfájlban megadott beállítással <ImplicitUsings>enable</ImplicitUsings> . Például egy konzolalkalmazás-projekt automatikusan importálja System, System.Collections.Generic, System.IO, System.Linq, System.Threadingés System.Threading.Tasks. A(z) dotnet new használatával létrehozott új projektekben a(z) ImplicitUsings alapértelmezés szerint engedélyezve van. Az új fájlok eleve letisztultan indulnak, sablonos using direktívák nélkül az olyan mindennapos típusokhoz, mint a Console, List<T> vagy Task.

További információ: Implicit using directives.

Note

A cikkben szereplő többi kódminta és a .NET dokumentumokban található legtöbb minta feltételezi, hogy az implicit használat (vagy a projekttípus egyenértékű globális használata) engedélyezve van. Ezért nem látható using System; és hasonló irányelvek az egyes kódrészletek tetején, annak ellenére, hogy a kód hasonló Console vagy List<T> egyszerű neveket használ.

Statikus direktívák használata

Egy static using irányelv importálja egy típus statikus tagjait, hogy a típusnév előtagja nélkül is meghívhassa őket:

using static System.Math;

namespace MyApp.Utilities;

class CircleCalculator
{
    public static double CalculateArea(double radius) => PI * Pow(radius, 2);

    public static double CalculateCircumference(double radius) => 2 * PI * radius;
}

A statikus használat jól működik a gyakran használt és hasonló MathConsole segédprogram-osztályokhoz.

Típus- és névtér-aliasok

Az using alias rövidített nevet hoz létre egy típushoz vagy névtérhez. Az aliasok hosszú általános típusokhoz, az elnevezési ütközések feloldásához és az olvashatóság javításához hasznosak:

using CustomerList = System.Collections.Generic.List<MyApp.Models.Customer>;

namespace MyApp.Services;

class CustomerService
{
    public CustomerList GetTopCustomers()
    {
        CustomerList customers = [new() { Name = "Alice" }, new() { Name = "Bob" }];
        return customers;
    }
}

A C# 12-től kezdve bármilyen típusú aliast használhat, beleértve a csuplokat és a mutatótípusokat:

using Point = (double X, double Y);

namespace MyApp.Geometry;

class Shape
{
    public static double Distance(Point a, Point b)
    {
        var dx = a.X - b.X;
        var dy = a.Y - b.Y;
        return Math.Sqrt(dx * dx + dy * dy);
    }
}

A speciálisabb helyzetekben, amikor két szerelvény ugyanazt a teljes típusnevet határozza meg, használjon extern aliast a közöttük lévő egyértelműsítéshez.