Megosztás a következőn keresztül:


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.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

Helytelen gyakorlatnak számít több névtér deklarálása 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

Amikor nincs using direktíva, minden típusra annak teljesen minősített nevével, vagyis a teljes névtér elérési útjával és a típusnévvel kell hivatkoznia:

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

A using fájl tetején lévő direktíva importál egy névteret, így a típusokat egyszerű nevük alapján használhatja:

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

Ha minden fájlba ugyanazokat using az irányelveket írja, a globálisan használt irányelvek lehetővé teszik, hogy egyszer deklarálja őket a teljes projekthez. 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 az adott névtérből származó típusokra egyszerű nevek használatával, további using irányelv nélkül.

Implicit használat

A .NET SDK automatikusan generál globális használati irányelveket a projekt típusa alapján a leggyakoribb névterekhez. 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. Az aktuális SDK lehetővé teszi ImplicitUsings, amikor új projektet hoz létre az dotnet new használatával.

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

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.