Comment utiliser la fonctionnalité C # 6 «Utilisation statique»?

123

Je suis en train de jeter un œil à quelques nouvelles fonctionnalités de C # 6, en particulier, "using static" .

using static est un nouveau type de clause using qui vous permet d'importer des membres statiques de types directement dans la portée.
(En bas du billet de blog)

L'idée est la suivante, selon quelques tutoriels que j'ai trouvés, au
lieu de:

using System;

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

Vous pouvez omettre l' Consoleinstruction répétée , en utilisant la nouvelle fonctionnalité C # 6 d'utilisation des classes statiques:

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

Cependant, cela ne semble pas fonctionner pour moi. J'obtiens une erreur sur la usingdéclaration, disant:

"Une using namespacedirective ' ' ne peut être appliquée qu'aux espaces de noms; ' Console' est un type et non un espace de noms. Considérez using staticplutôt une directive ' '"

J'utilise Visual Studio 2015 et la version du langage de compilation est définie sur «C # 6.0»

Ce qui donne? L'exemple du blog msdn est-il incorrect? Pourquoi ça ne marche pas?


Le billet de blog a maintenant été mis à jour pour refléter les dernières mises à jour, mais voici une capture d'écran au cas où le blog tomberait en panne:

Blog

Cerbrus
la source

Réponses:

177

Il semble que la syntaxe ait légèrement changé depuis la rédaction de ces articles de blog. Comme le message d'erreur le suggère, ajoutez staticà votre instruction d'inclusion:

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

Ensuite, votre code se compilera.


Notez que, dans C # 6.0, cela ne fonctionnera que pour les membres déclarés comme static.

Par exemple, considérez System.Math:

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

Quand using static System.Math, vous pouvez simplement utiliser Abs();.
Cependant, vous auriez encore à préfixe PIcar il n'est pas membre de statique: Math.PI;.

À partir de C # version 7.2, cela ne devrait pas être le cas, des constvaleurs comme PIpeuvent également être utilisées.

Cerbrus
la source
3
J'ai un problème similaire, mais à la place avec System.Math, spécifiquement Math.PI. Quand j'utilise using static System.Math, des méthodes comme le Sqrt()travail mais pas une constante comme PI. Je dois continuer à écrire Math.PIou le code ne se compile pas. Je suis curieux de savoir pourquoi cela ne fonctionne pas. Dois-je soumettre une nouvelle question à ce sujet?
skwear du
5
@skwear: cela ressemble à un matériau pour une nouvelle question, oui.
Cerbrus
1
Comme réponse rapide à la question de @ skwear: "using static est un nouveau type de clause using qui vous permet d'importer des membres statiques <...>" . PIn'est pas un membre statique de la Mathclasse. C'est une constante. En termes simples: le membre doit être déclaré comme static.
Cerbrus
3
Sonne comme une opportunité pour une nouvelle syntaxe comme: using const System.Math;:)
Filip Skakun
1
L'exemple de la documentation Microsoft affirme que PI peut être utilisé sans préfixe: docs.microsoft.com/en-us/dotnet/csharp/language-reference
Guney Ozsan
1

Le staticmot-clé sur une usinginstruction n'importera que le seul type spécifié (et ses types imbriqués). De plus, vous ne devez plus donner le nom du type. Alors ajoutez simplement de la statique à votre utilisation.

Remarque: veuillez utiliser cette fonctionnalité uniquement lorsque les deux classes sont logiquement étroitement liées, sinon cela rend la lecture du code assez difficile.

Tobias Brohl
la source
"vous ne devez pas donner le nom du type" Que voulez-vous dire par là? Où ai-je fait ça?
Cerbrus
Thobias, je ne combine les deux nulle part.
Cerbrus
@Cerbrus Oh, le contexte du `` comme vous l'avez fait '' a été accidentellement changé, corrigera cela
Tobias Brohl