Jak używać funkcji „Korzystanie ze statycznego” języka C # 6?

123

Rzucam okiem na kilka nowych funkcji w C # 6, a konkretnie na „używanie statyczne” .

using static to nowy rodzaj klauzuli using, która umożliwia importowanie statycznych elementów członkowskich typów bezpośrednio do zakresu.
(U dołu wpisu na blogu)

Pomysł jest następujący, zgodnie z kilkoma samouczkami, które znalazłem,
Zamiast:

using System;

class Program 
{ 
    static void Main() 
    { 
        Console.WriteLine("Hello world!"); 
        Console.WriteLine("Another message"); 
    } 
}

Możesz pominąć powtarzającą się Consoleinstrukcję, korzystając z nowej funkcji C # 6 używającej klas statycznych:

using System.Console;
//           ^ `.Console` added.
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } // ^ `Console.` removed.
}

Jednak wydaje mi się, że to nie działa. Otrzymuję błąd w usingwyciągu, mówiąc:

using namespaceDyrektywę „ ” można zastosować tylko do przestrzeni nazw; „ Console” jest typem, a nie przestrzenią nazw. using staticZamiast tego rozważ dyrektywę „” ”

Używam programu Visual Studio 2015 i mam wersję języka kompilacji ustawioną na „C # 6.0”

Co daje? Czy przykład bloga msdn jest nieprawidłowy? Dlaczego to nie działa?


Wpis na blogu został zaktualizowany, aby odzwierciedlał najnowsze aktualizacje, ale oto zrzut ekranu na wypadek, gdyby blog przestał działać:

blog

Cerbrus
źródło

Odpowiedzi:

177

Wygląda na to, że składnia nieznacznie się zmieniła od czasu napisania tych postów na blogu. Jak sugeruje komunikat o błędzie, dodaj staticdo instrukcji include:

using static System.Console;
//      ^
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } 
}

Następnie twój kod zostanie skompilowany.


Należy zauważyć, że w C # 6,0 będzie to działać tylko dla członków zadeklarowanych jako static.

Weźmy na przykład pod uwagę System.Math:

public static class Math {
    public const double PI = 3.1415926535897931;
    public static double Abs(double value);
    // <more stuff>
}

Kiedy using static System.Mathmożesz po prostu użyć Abs();.
Jednak, to trzeba jeszcze prefiksu PI, ponieważ nie jest członkiem statyczny: Math.PI;.

Począwszy od wersji C # 7.2, nie powinno tak być, constwartości takie jak również PImogą być używane.

Cerbrus
źródło
3
Mam podobny problem, ale System.Mathkonkretnie z Math.PI. Kiedy używam using static System.Math, metody takie jak Sqrt()praca, ale nie stałe PI. Muszę kontynuować pisanie Math.PIlub kod się nie kompiluje. Ciekaw jestem, dlaczego to nie działa. Czy powinienem zadać nowe pytanie w tej sprawie?
skwear
5
@skwear: to brzmi jak materiał na nowe pytanie, tak.
Cerbrus
1
Jako szybka odpowiedź na pytanie @ skwear: „używanie static to nowy rodzaj klauzuli using, która umożliwia importowanie statycznych elementów członkowskich <...>” . PInie jest statycznym członkiem Mathklasy. To jest stała. Krótko mówiąc: członek musi zostać zadeklarowany jako static.
Cerbrus
3
Brzmi jak okazja do nowej składni, takiej jak: using const System.Math;:)
Filip Skakun
1
Przykład w zastrzeżeniach dokumentacja PI Microsoft mogą być używane bez przedrostka: docs.microsoft.com/en-us/dotnet/csharp/language-reference/...
Guney Ozsan
1

staticSłowo na usingrachunku będzie importować tylko jeden, określony typ (i to zagnieżdżone typy). Ponadto nie możesz już podawać nazwy typu. Więc po prostu dodaj statyczne do swojego używania.

Uwaga: użyj tej funkcji tylko wtedy, gdy dwie klasy są logicznie powiązane, w przeciwnym razie czytanie kodu będzie dość trudne.

Tobias Brohl
źródło
„nie wolno podawać nazwy typu” Co przez to rozumiesz? Gdzie ja to zrobiłem?
Cerbrus
Thobias, nigdzie nie łączę tych dwóch.
Cerbrus
@Cerbrus Och, kontekst `` tak jak to zrobiłeś '' przypadkowo zmienił się, naprawi to
Tobias Brohl