¿Cómo utilizo la función "Uso estático" de C # 6?


123

Estoy echando un vistazo a un par de nuevas características en C # 6, específicamente, "usando estática" .

using static es un nuevo tipo de cláusula using que le permite importar miembros estáticos de tipos directamente al alcance.
(Parte inferior de la publicación del blog)

La idea es la siguiente, según un par de tutoriales que encontré, en
lugar de:

using System;

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

Puede omitir la Consoledeclaración repetida , usando la nueva característica C # 6 de usar clases estáticas:

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

Sin embargo, esto no parece funcionar para mí. Recibo un error en la usingdeclaración que dice:

"Una ' using namespace' directiva solo se puede aplicar a espacios de nombres; ' Console' es un tipo, no un espacio de nombres. Considere una using staticdirectiva ' ' en su lugar"

Estoy usando Visual Studio 2015 y tengo la versión del lenguaje de compilación configurada en "C # 6.0"

¿Lo que da? ¿Es incorrecto el ejemplo del blog de msdn? ¿Por qué no funciona esto?


La publicación del blog ahora se ha actualizado para reflejar las últimas actualizaciones, pero aquí hay una captura de pantalla en caso de que el blog deje de funcionar:

Blog

Respuestas:


177

Parece que la sintaxis ha cambiado ligeramente desde que se escribieron esas publicaciones en el blog. Como sugiere el mensaje de error, agregue statica su declaración de inclusión:

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

Luego, su código se compilará.


Tenga en cuenta que, en C # 6.0, esto solo funcionará para miembros declarados como static.

Por ejemplo, considere System.Math:

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

Cuando using static System.Math, solo puedes usar Abs();.
Sin embargo, usted todavía tiene que prefijo PIporque no es un miembro estático: Math.PI;.

A partir de la versión 7.2 de C #, este no debería ser el caso, también se pueden usar constvalores como PI.


3
Tengo un problema similar, pero en cambio con System.Math, específicamente Math.PI. Cuando uso using static System.Math, métodos como Sqrt()funcionan pero no como constantes PI. Tengo que seguir escribiendo Math.PIo el código no se compila. Tengo curiosidad por saber por qué esto no funciona. ¿Debo enviar una nueva pregunta para esto?
skwear

5
@skwear: eso suena como material para una nueva pregunta, sí.
Cerbrus

1
Como respuesta rápida a la pregunta de @ skwear: "usar static es un nuevo tipo de cláusula using que te permite importar miembros estáticos <...>" . PIno es un miembro estático de la Mathclase. Es una constante. En pocas palabras: el miembro debe declararse como static.
Cerbrus

3
Suena como una oportunidad para una nueva sintaxis como: using const System.Math;:)
Filip Skakun

1
El ejemplo en la documentación de Microsoft afirma que PI se puede usar sin prefijo: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Guney Ozsan

1

La staticpalabra clave en una usingdeclaración importará solo el tipo especificado (y sus tipos anidados). Además, ya no debe dar el nombre del tipo. Así que solo agrega estática a tu uso.

Nota: Utilice esta función solo cuando las dos clases estén estrechamente relacionadas lógicamente; de ​​lo contrario, la lectura del código será bastante difícil.


"no debe dar el nombre del tipo" ¿Qué quiere decir con eso? ¿Dónde hice eso?
Cerbrus

Thobias, no voy a combinar las dos en ninguna parte.
Cerbrus

@Cerbrus Oh, el contexto del 'como lo hiciste' cambió accidentalmente, lo arreglará
Tobias Brohl
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.