Wie verwende ich die C # 6-Funktion "Verwenden von Statik"?

121

Ich schaue mir einige der neuen Funktionen in C # 6 an, insbesondere "Verwenden von Statik" .

Die Verwendung von static ist eine neue Art der using-Klausel, mit der Sie statische Elemente von Typen direkt in den Bereich importieren können.
(Unten im Blogbeitrag)

Die Idee ist wie folgt, gemäß ein paar Tutorials, die ich gefunden habe,
anstatt:

using System;

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

Sie können die wiederholte ConsoleAnweisung mit der neuen C # 6-Funktion zur Verwendung statischer Klassen weglassen :

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

Dies scheint jedoch bei mir nicht zu funktionieren. Ich erhalte eine Fehlermeldung in der usingErklärung:

"Eine ' using namespace' Direktive kann nur auf Namespaces angewendet werden. ' Console' Ist ein Typ, kein Namespace. Betrachten Sie using staticstattdessen eine ' ' Direktive."

Ich verwende Visual Studio 2015 und habe die Build-Sprachversion auf "C # 6.0" eingestellt.

Was gibt? Ist das Beispiel des msdn-Blogs falsch? Warum funktioniert das nicht?


Der Blog-Beitrag wurde jetzt aktualisiert, um die neuesten Updates wiederzugeben. Hier ist jedoch ein Screenshot für den Fall, dass der Blog ausfällt:

Blog

Cerbrus
quelle

Antworten:

175

Es scheint, dass sich die Syntax seit dem Schreiben dieser Blog-Beiträge geringfügig geändert hat. Fügen Sie, wie in der Fehlermeldung angegeben, staticIhrer include-Anweisung Folgendes hinzu:

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

Dann wird Ihr Code kompiliert.


Beachten Sie, dass dies in C # 6.0 nur für Mitglieder funktioniert, die als deklariert sind static.

Betrachten Sie zum Beispiel System.Math:

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

Wann using static System.Mathkönnen Sie einfach verwenden Abs();.
Sie müssten jedoch immer noch ein Präfix setzen, PIda es sich nicht um ein statisches Mitglied handelt : Math.PI;.

Ab C # Version 7.2 sollte dies nicht der Fall sein, constWerte wie PIkönnen ebenfalls verwendet werden.

Cerbrus
quelle
3
Ich habe ein ähnliches Problem, aber stattdessen System.Mathspeziell mit Math.PI. Wenn ich using static System.MathMethoden wie Sqrt()Arbeit verwende, aber keine Konstante wie PI. Ich muss weiter schreiben Math.PIoder der Code wird nicht kompiliert. Ich bin gespannt, warum das nicht funktioniert. Soll ich dazu eine neue Frage stellen?
Skwear
5
@skwear: das klingt nach Material für eine neue Frage, ja.
Cerbrus
1
Als schnelle Antwort auf die Frage von @ skwear: "Die Verwendung von static ist eine neue Art der using-Klausel, mit der Sie statische Mitglieder <...> importieren können . " PIist kein statisches Mitglied der MathKlasse. Es ist eine Konstante. Einfach ausgedrückt: Das Mitglied muss als deklariert werden static.
Cerbrus
3
Klingt nach einer Gelegenheit für eine neue Syntax wie: using const System.Math;:)
Filip Skakun
1
Das Beispiel in der Microsoft-Dokumentation behauptet, PI kann ohne Präfix verwendet werden: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Guney
1

Das staticSchlüsselwort in einer usingAnweisung importiert nur den angegebenen Typ (und die verschachtelten Typen). Außerdem dürfen Sie den Typnamen nicht mehr angeben. Fügen Sie Ihrer Verwendung einfach Statik hinzu.

Hinweis: Verwenden Sie diese Funktion nur, wenn die beiden Klassen logisch eng miteinander verbunden sind. Andernfalls wird das Lesen des Codes ziemlich schwierig.

Tobias Brohl
quelle
"Sie dürfen den Typnamen nicht angeben" Was meinen Sie damit? Wo habe ich das gemacht
Cerbrus
Thobias, ich kombiniere die beiden nirgendwo.
Cerbrus
@ Cerbrus Oh, der Kontext des "wie du es getan hast" hat sich versehentlich geändert, wird das beheben
Tobias Brohl