Come si usa la funzionalità "Utilizzo statico" di C # 6?


123

Sto esaminando un paio delle nuove funzionalità di C # 6, in particolare "utilizzo statico" .

using static è un nuovo tipo di clausola using che consente di importare membri statici di tipi direttamente nell'ambito.
(In fondo al post del blog)

L'idea è la seguente, secondo un paio di tutorial che ho trovato,
invece di:

using System;

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

È possibile omettere l' Consoleistruzione ripetuta , utilizzando la nuova funzionalità C # 6 per l'utilizzo di classi statiche:

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

Tuttavia, questo non sembra funzionare per me. Ricevo un errore usingnell'istruzione, dicendo:

"Una using namespacedirettiva" può essere applicata solo agli spazi dei nomi; Console"è un tipo non uno spazio dei nomi. Considera invece una using staticdirettiva" ""

Utilizzo Visual Studio 2015 e la versione del linguaggio di compilazione è impostata su "C # 6.0"

Cosa succede? L'esempio del blog msdn non è corretto? Perché non funziona?


Il post del blog è stato ora aggiornato per riflettere gli ultimi aggiornamenti, ma ecco uno screenshot nel caso in cui il blog non funzioni:

blog

Risposte:


177

Sembra che la sintassi sia leggermente cambiata da quando sono stati scritti i post del blog. Come suggerisce il messaggio di errore, aggiungi staticalla tua dichiarazione include:

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

Quindi, il tuo codice verrà compilato.


Si noti che, in C # 6.0, questo funzionerà solo per i membri dichiarati come static.

Ad esempio, considera System.Math:

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

Quando using static System.Math, puoi semplicemente usare Abs();.
Tuttavia, saresti ancora bisogno di prefisso PI, perché non è un membro statico: Math.PI;.

A partire dalla versione 7.2 di C #, non dovrebbe essere così, possono essere usati anche constvalori come PI.


3
Ho un problema simile, ma invece con System.Math, specificamente Math.PI. Quando uso using static System.Mathmetodi come il Sqrt()lavoro ma non come un costante PI. Devo continuare a scrivere Math.PIo il codice non si compila. Sono curioso di sapere perché questo non funziona. Devo inviare una nuova domanda per questo?
skwear

5
@skwear: sembra materiale per una nuova domanda, sì.
Cerbrus

1
Come risposta rapida alla domanda di @ skwear: "using static è un nuovo tipo di clausola using che ti consente di importare membri statici <...>" . PInon è un membro statico della Mathclasse. È una costante. In poche parole: il membro deve essere dichiarato come static.
Cerbrus

3
Sembra un'opportunità per una nuova sintassi come: using const System.Math;:)
Filip Skakun

1
L'esempio nella documentazione Microsoft afferma che PI può essere utilizzato senza prefisso: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Guney Ozsan

1

La staticparola chiave in usingun'istruzione importerà solo il tipo specificato (ei suoi tipi annidati). Inoltre non devi più dare il nome del tipo. Quindi aggiungi solo statico al tuo utilizzo.

Nota: utilizzare questa funzione solo quando le due classi sono logicamente strettamente correlate, altrimenti la lettura del codice è piuttosto difficile.


"non devi dare il nome del tipo" Cosa intendi con questo? Dove l'ho fatto?
Cerbrus

Thobias, non combino i due da nessuna parte.
Cerbrus

@Cerbrus Oh, il contesto del "come hai fatto" è cambiato accidentalmente, lo risolverà
Tobias Brohl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.