Dyrektywa using umożliwia używanie typów zdefiniowanych w przestrzeni nazw bez określania w pełni kwalifikowanej przestrzeni nazw tego typu. W jej podstawowej formie using dyrektywa importuje wszystkie typy z jednej przestrzeni nazw, jak pokazano w poniższym przykładzie:
C#
using System.Text;
Do dyrektywy można zastosować dwa modyfikatory using :
Modyfikator global ma taki sam efekt jak dodanie tej samej using dyrektywy do każdego pliku źródłowego w projekcie.
Modyfikator static importuje static elementy członkowskie i typy zagnieżdżone z pojedynczego typu zamiast importować wszystkie typy w przestrzeni nazw.
Oba modyfikatory można połączyć, aby zaimportować statyczne elementy członkowskie z typu do wszystkich plików źródłowych w projekcie.
Możesz również utworzyć alias dla przestrzeni nazw lub typu z dyrektywą aliasu.
C#
using Project = PC.MyCompany.Project;
Modyfikator można użyć global w dyrektywie aliasu.
Uwaga
Słowo using kluczowe jest również używane do tworzenia using instrukcji, co pomaga zapewnić IDisposable prawidłowe obsługę obiektów, takich jak pliki i czcionki. Aby uzyskać więcej informacji na temat instrukcjiusing, zobacz using instrukcję.
Zakres using dyrektywy bez global modyfikatora to plik, w którym się pojawia.
Dyrektywa global using musi pojawić się przed wszystkimi przestrzeniami nazw i deklaracjami typów. Wszystkie globalne dyrektywy dotyczące używania muszą znajdować się w pliku źródłowym przed wszelkimi dyrektywami nieglobali using .
Inne using dyrektywy mogą być wyświetlane:
Na początku pliku kodu źródłowego przed wszelkimi deklaracjami przestrzeni nazw lub typów.
W dowolnej przestrzeni nazw o zablokowanym zakresie, ale przed wszelkimi przestrzeniami nazw lub typami zadeklarowanym w tej przestrzeni nazw.
W przeciwnym razie jest generowany błąd kompilatora.
Utwórz dyrektywę using , aby używać typów w przestrzeni nazw bez konieczności określania przestrzeni nazw.
using Dyrektywa nie zapewnia dostępu do żadnych przestrzeni nazw, które są zagnieżdżone w określonej przestrzeni nazw. Przestrzenie nazw są dostępne w dwóch kategoriach: zdefiniowanych przez użytkownika i zdefiniowanych przez system. Przestrzenie nazw zdefiniowane przez użytkownika to przestrzenie nazw zdefiniowane w kodzie. Aby uzyskać listę przestrzeni nazw zdefiniowanych przez system, zobacz Przeglądarka interfejsów API platformy .NET.
global Modyfikator
Dodanie modyfikatora global do dyrektywy using oznacza, że użycie jest stosowane do wszystkich plików w kompilacji (zazwyczaj projekt):
C#
globalusing <fully-qualified-namespace>;
Gdzie w pełni kwalifikowana przestrzeń nazw jest w pełni kwalifikowaną nazwą przestrzeni nazw, do której można się odwoływać bez określania przestrzeni nazw.
Globalna dyrektywa using może pojawić się na początku dowolnego pliku kodu źródłowego. Wszystkie global using dyrektywy w jednym pliku muszą występować przed:
Wszystkie using dyrektywy bez global modyfikatora.
Wszystkie deklaracje przestrzeni nazw i typów w pliku.
Można dodawać global using dyrektywy do dowolnego pliku źródłowego. Zazwyczaj chcesz zachować je w jednej lokalizacji. Kolejność global using dyrektyw nie ma znaczenia, ani w jednym pliku, ani między plikami.
global Modyfikator można połączyć z modyfikatoremstatic. Modyfikator global można zastosować do dyrektywy aliasu. W obu przypadkach zakres dyrektywy to wszystkie pliki w bieżącej kompilacji. Poniższy przykład umożliwia używanie wszystkich metod zadeklarowanych we System.Math wszystkich plikach w projekcie:
C#
globalusingstatic System.Math;
Możesz również globalnie uwzględnić przestrzeń nazw, dodając <Using> element do pliku projektu, na przykład <Using Include="My.Awesome.Namespace" />. Aby uzyskać więcej informacji, zobacz <Using> element.
Analizatory wystawiają diagnostykę, jeśli zduplikujesz global dyrektywy w różnych lokalizacjach. Te same analizatory informują również o dodaniu using dyrektywy dla przestrzeni nazw lub typu, do której global już odwołuje się dyrektywa using. Zarządzanie przy użyciu może być łatwiejsze global dzięki przechowywaniu ich razem w jednym pliku w projekcie.
Ważne
Szablony języka C# dla platformy .NET 6 używają instrukcji najwyższego poziomu. Aplikacja może nie być zgodna z kodem w tym artykule, jeśli został już uaktualniony do platformy .NET 6. Aby uzyskać więcej informacji, zobacz artykuł dotyczący nowych szablonów języka C# generowania instrukcji najwyższego poziomu
Zestaw SDK platformy .NET 6 dodaje również zestaw niejawnych global using dyrektyw dla projektów korzystających z następujących zestawów SDK:
Microsoft.NET.Sdk
Microsoft.NET.Sdk.Web
Microsoft.NET.Sdk.Worker
Te niejawne global using dyrektywy obejmują najbardziej typowe przestrzenie nazw dla typu projektu.
Dyrektywa using static nazywa typ, do którego statyczne elementy członkowskie i typy zagnieżdżone można uzyskać dostęp bez określania nazwy typu. Jego składnia to:
C#
usingstatic <fully-qualified-type-name>;
Jest <fully-qualified-type-name> to nazwa typu, do którego można odwoływać się statyczne elementy członkowskie i typy zagnieżdżone bez określania nazwy typu. Jeśli nie podasz w pełni kwalifikowanej nazwy typu (pełnej nazwy przestrzeni nazw wraz z nazwą typu), język C# generuje błąd kompilatora CS0246: "Nie można odnaleźć nazwy typu lub przestrzeni nazw "type/namespace" (czy brakuje dyrektywy using lub odwołania do zestawu?)".
Dyrektywa using static ma zastosowanie do dowolnego typu, który ma statyczne elementy członkowskie (lub typy zagnieżdżone), nawet jeśli ma również elementy członkowskie wystąpienia. Jednak elementy członkowskie wystąpień mogą być wywoływane tylko za pośrednictwem wystąpienia typu.
Dostęp do statycznych elementów członkowskich typu można uzyskać bez konieczności kwalifikowania dostępu przy użyciu nazwy typu:
Zazwyczaj podczas wywoływania statycznego elementu członkowskiego należy podać nazwę typu wraz z nazwą elementu członkowskiego. Wielokrotne wprowadzanie tej samej nazwy typu w celu wywołania elementów członkowskich typu może spowodować pełne, niejasne kod. Na przykład poniższa definicja Circle klasy odwołuje się do wielu elementów członkowskich Math klasy.
Eliminując konieczność jawnego Math odwołowania się do klasy za każdym razem, gdy element członkowski jest przywoływał, using static dyrektywa tworzy czystszy kod:
C#
using System;
usingstatic System.Math;
publicclassCircle
{
publicCircle(double radius)
{
Radius = radius;
}
publicdouble Radius { get; set; }
publicdouble Diameter
{
get { return2 * Radius; }
}
publicdouble Circumference
{
get { return2 * Radius * PI; }
}
publicdouble Area
{
get { return PI * Pow(Radius, 2); }
}
}
using static importuje tylko dostępne statyczne elementy członkowskie i zagnieżdżone typy zadeklarowane w określonym typie. Dziedziczone elementy członkowskie nie są importowane. Można importować z dowolnego nazwanego typu z dyrektywą using static , w tym modułami języka Visual Basic. Jeśli funkcje najwyższego poziomu języka F# są wyświetlane w metadanych jako statyczne elementy członkowskie nazwanego typu, którego nazwa jest prawidłowym identyfikatorem języka C#, można zaimportować funkcje języka F#.
using static udostępnia metody rozszerzenia zadeklarowane w określonym typie dla wyszukiwania metody rozszerzenia. Jednak nazwy metod rozszerzenia nie są importowane do zakresu niekwalifikowanego odwołania w kodzie.
Metody o tej samej nazwie importowane z różnych typów przez różne using static dyrektywy w tej samej jednostce kompilacji lub przestrzeni nazw tworzą grupę metod. Rozpoznawanie przeciążenia w tych grupach metod jest zgodne z normalnymi regułami języka C#.
W poniższym przykładzie użyto using static dyrektywy , aby statyczne elementy członkowskie Consoleklas , Mathi String bez konieczności określania ich nazwy typu.
C#
using System;
usingstatic System.Console;
usingstatic System.Math;
usingstatic System.String;
classProgram
{
staticvoidMain()
{
Write("Enter a circle's radius: ");
var input = ReadLine();
if (!IsNullOrEmpty(input) && double.TryParse(input, outvar radius)) {
var c = new Circle(radius);
string s = "\nInformation about the circle:\n";
s = s + Format(" Radius: {0:N2}\n", c.Radius);
s = s + Format(" Diameter: {0:N2}\n", c.Diameter);
s = s + Format(" Circumference: {0:N2}\n", c.Circumference);
s = s + Format(" Area: {0:N2}\n", c.Area);
WriteLine(s);
}
else {
WriteLine("Invalid input...");
}
}
}
publicclassCircle
{
publicCircle(double radius)
{
Radius = radius;
}
publicdouble Radius { get; set; }
publicdouble Diameter
{
get { return2 * Radius; }
}
publicdouble Circumference
{
get { return2 * Radius * PI; }
}
publicdouble Area
{
get { return PI * Pow(Radius, 2); }
}
}
// The example displays the following output:// Enter a circle's radius: 12.45//// Information about the circle:// Radius: 12.45// Diameter: 24.90// Circumference: 78.23// Area: 486.95
W tym przykładzie using static można również zastosować dyrektywę Double do typu. Dodanie tej dyrektywy umożliwi wywołanie TryParse(String, Double) metody bez określenia nazwy typu. Jednak użycie TryParse bez nazwy typu powoduje utworzenie mniej czytelnego kodu, ponieważ konieczne jest sprawdzenie using static dyrektyw w celu określenia, która metoda typu liczbowego jest wywoływana TryParse .
using static dotyczy enum również typów.
using static Dodając przy użyciu wyliczenia, typ nie jest już wymagany do używania składowych wyliczenia.
C#
usingstatic Color;
enum Color
{
Red,
Green,
Blue
}
classProgram
{
publicstaticvoidMain()
{
Color color = Green;
}
}
Alias using
Utwórz dyrektywę using aliasu, aby ułatwić kwalifikację identyfikatora do przestrzeni nazw lub typu. W każdej using dyrektywie należy używać w pełni kwalifikowanej przestrzeni nazw lub typu niezależnie od using dyrektyw, które są przed nią dostępne. W deklaracji dyrektywy nie using można używać aliasu using . Na przykład poniższy przykład generuje błąd kompilatora:
C#
using s = System.Text;
using s.RegularExpressions; // Generates a compiler error.
W poniższym przykładzie pokazano, jak zdefiniować i użyć using aliasu dla przestrzeni nazw:
C#
namespacePC
{
// Define an alias for the nested namespace.using Project = PC.MyCompany.Project;
classA
{
voidM()
{
// Use the aliasvar mc = new Project.MyClass();
}
}
namespaceMyCompany
{
namespaceProject
{
publicclassMyClass { }
}
}
}
Dyrektywa using alias nie może mieć otwartego typu ogólnego po prawej stronie. Na przykład nie można utworzyć aliasu dla elementu List<T>, ale można go utworzyć dla elementu List<int>.
W poniższym przykładzie pokazano, jak zdefiniować dyrektywę using i using alias dla klasy:
C#
using System;
// Using alias directive for a class.using AliasToMyClass = NameSpace1.MyClass;
// Using alias directive for a generic class.using UsingAlias = NameSpace2.MyClass<int>;
namespaceNameSpace1
{
publicclassMyClass
{
publicoverridestringToString()
{
return"You are in NameSpace1.MyClass.";
}
}
}
namespaceNameSpace2
{
classMyClass<T>
{
publicoverridestringToString()
{
return"You are in NameSpace2.MyClass.";
}
}
}
namespaceNameSpace3
{
classMainClass
{
staticvoidMain()
{
var instance1 = new AliasToMyClass();
Console.WriteLine(instance1);
var instance2 = new UsingAlias();
Console.WriteLine(instance2);
}
}
}
// Output:// You are in NameSpace1.MyClass.// You are in NameSpace2.MyClass.
Począwszy od języka C# 12, można tworzyć aliasy dla typów, które były wcześniej ograniczone, w tym typy krotki, typy wskaźników i inne niebezpieczne typy. Aby uzyskać więcej informacji na temat zaktualizowanych reguł, zobacz specyfikację funkcji.
Kwalifikowany element członkowski aliasu
Kwalifikator :: aliasu przestrzeni nazw zapewnia jawny dostęp do globalnej przestrzeni nazw lub innego przy użyciu aliasów potencjalnie ukrytych przez inne jednostki.
Zapewnia global:: , że wyszukiwanie przestrzeni nazw dla przestrzeni nazw po :: tokenie jest względem globalnej przestrzeni nazw. W przeciwnym razie token musi zostać rozpoznany jako używający aliasu, a następujący token :: musi zostać rozpoznany jako typ w tej aliasowanej przestrzeni nazw. W poniższym przykładzie przedstawiono obie formy:
C#
using S = System.Net.Sockets;
classA
{
publicstaticint x;
}
classC
{
publicvoidF(int A, object S)
{
// Use global::A.x instead of A.xglobal::A.x += A;
// Using ::, S must resolve to a namespace alias:
S::Socket s = S as S::Socket;
// In this form, if S were a class, it would be a compile-time error:
S.Socket s1 = S as S.Socket;
}
}
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.
Opinia o produkcie .NET
.NET to projekt typu open source. Wybierz link, aby przekazać opinię:
Dołącz do serii meetup, aby tworzyć skalowalne rozwiązania sztucznej inteligencji oparte na rzeczywistych przypadkach użycia z innymi deweloperami i ekspertami.