Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 25 de octubre de 2022
.NET

Modificadores de visibilidad habituales como internal, public o private nos acompañan desde los inicios de C#, permitiéndonos definir desde dónde queremos permitir el acceso a los tipos que definimos en nuestras aplicaciones. Así podemos indicar, por ejemplo, que una clase pueda ser visible sólo a miembros definidos en su mismo ensamblado, que pueda ser utilizada desde cualquier punto, o que un tipo anidado sólo pueda verse desde el interior de su clase contenedora.

Pues bien, C# 11 traerá novedades al respecto ;)

Disclaimer: lo que vamos a ver aquí es válido en la RC2 de .NET 7, pero aún podría sufrir algún cambio para la versión final, prevista para noviembre de 2022.

La nueva versión de nuestro lenguaje favorito introduce el nuevo modificador file con objeto de cubrir un escenario que anteriormente no estaba contemplado: que un tipo sea visible exclusivamente en el archivo en el que ha sido definido.

Como podemos ver en la propuesta de diseño de esta característica, los objetivos que se pretenden lograr introduciéndola en C# son principalmente dos:

  • Permitir a los generadores de código (source generators) generar código que no sea visible para el resto de la aplicación, minimizando así la posibilidad de que surjan conflictos con código ya existente o insertado por otros generadores.

  • Permitir que los desarrolladores escribamos código completamente aislado del resto del mundo, asegurando así que no va a ser utilizado para otros propósitos que los pretendidos y que no colisionarán con otros elementos.

Veámoslo en la práctica. Supongamos el siguiente archivo Test.cs:

public class Test
{
    public void Run()
    {
        TestHelpers.SayHello();
    }
}

file static class TestHelpers
{
    public static void SayHello()
    {
        Console.WriteLine("Hello");
    }
}

La clase Test, al ser pública, podrá ser utilizada desde cualquier punto sin problema. En cambio, la clase TestHelpers solo será visible desde el interior del archivo Test.cs. Desde otros archivos del proyecto u otros ensamblados, esta clase es como si no existiera, por lo que podemos estar seguros de que no será utilizada desde otros puntos y de que no entrará en conflicto con otros tipos del mismo nombre.

Obviamente, al tener una visibilidad tan reducida, los tipos de datos que usen el modificador file no pueden formar parte de la firma de métodos o propiedades de otros tipos que no tengan la misma visibilidad y se encuentren en el mismo archivo. Es decir:

// Test.cs:

public class Test
{
    private Number _number; // Fallará en compilación porque, aunque 'Number' es visible, 
                            // el tipo 'Test' no tiene visibilidad 'file'
}

file class AnotherTest
{
    private Number _number; // Compila: el tipo 'Number' es visible y 
                            // el tipo 'AnotherTest' tiene visibilidad "file"
}

file enum Number { One, Two }

Los tipos file, como otros, pueden implementar interfaces, heredar de clases existentes, sobrescribir métodos o realizar cualquier otra de las operaciones habituales. Este modificador sólo afectará a la visibilidad del tipo, no a su comportamiento.

En fin, nada que nos vaya a cambiar la vida radicalmente, pero se trata de una pequeña pero interesante novedad para el lenguaje :)

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!