
Seguramente muchos coincidiremos en que una de las novedades más interesantes de la última versión del compilador de C# es lo que oficialmente han denominado C# Source Generators, o generadores de código fuente de C#.
Muy resumidamente, esta característica añade un nuevo paso en la compilación en el cual los desarrolladores podemos introducir componentes propios (generadores) que inspeccionen el código de la aplicación que está siendo compilada y generen nuevos archivos, que a su vez pueden ser compilados e incluidos en los ensamblados resultantes. Su objetivo, tal y como se declara en su documento de diseño, es posibilitar la metaprogramación en tiempo de compilación.
Veámoslo con un ejemplo donde, además de explicarlo mejor, se puede mostrar su utilidad. Imaginad que en nuestra aplicación tenemos clases que representan operadores matemáticos como SumOperator
, MultiplyOperator
, DivideOperator
, SubtractOperator
, y todos ellos heredan de una clase base Operator
. Imaginad también que nos interesa tener un tipo enumerado enum Operators
donde aparezca un miembro por cada operador disponible, algo como:
public enum Operators
{
Sum,
Multiply,
Divide,
Subtract
}
Muy probablemente os habéis encontrado alguna vez con un escenario similar y habéis sufrido la dificultad de mantener sincronizada la enumeración con las clases que heredan de Operator
: cada vez que aparezca un operador nuevo e implementemos la clase operador que lo representa, tendremos que acordarnos de ir a Operators
y añadir el miembro.
Pues bien, aunque simple, esto sería un caso de uso bastante claro para los generadores de código fuente de C#. Gracias a ellos, podríamos crear un componente generador que examine nuestro código en busca de herederos de Operator
y genere al vuelo, siempre en tiempo de compilación, un archivo de código con la enumeración Operators
.
A todos los efectos, es como si esa enumeración la hubiéramos escrito a mano, porque podremos usarla con normalidad, aparecerá en intellisense, etc., pero la diferencia es que será generada cada vez que compilemos el proyecto, asegurando así que siempre será correcta y completa.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: .net, c#, generadores, metaprogramación, novedades
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Extendiendo claims de usuarios en ASP.NET Core
José María Aguilar - Cómo invocar métodos de instancia C# desde Javascript con Blazor (interop 3/3)
José María Aguilar
.NET Core / .NET
- Ofuscación: cómo proteger el código de tus aplicaciones .NET
José Manuel Alarcón - How to Scan NuGet Packages for Security Vulnerabilities
Drew Gillies - TasKCompletionSource for I/O-Bound Operations
Mehdi Hadeli - Generate iCal calendar with .NET using iCAL.NET
Kristoffer Strube - State of the NuGet Ecosystem
Jiachen Jiang - Strongly-typed Ids using C# Source Generators
Gérald Barré - ICYMI C# 8 New Features: Prevent Bugs with Static Local Functions
Jason Roberts - Refactoring with reflection
Michał Białecki - The 8 most missing features in C#
Konrad Kokosa - C# Coding Standards – Updated
Jesse Liberty
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo solucionar el error "Unable to connect to web server 'IIS Express'" en Visual Studio
José María Aguilar - Renderizar una vista Razor a un string en ASP.NET Core MVC
José María Aguilar
.NET Core / .NET
- Free eBook: How to use Dapr for .NET Developers
Scott Hanselman - ICYMI C# 8 New Features: Simplify Array Access and Range Code
Jason Roberts - Experimenting with .NET 5 and 6 using Docker containers
Elton Stoneman - Multi-targeting a Roslyn analyzer
Gérald Barré - Generating HTTP API clients using Visual Studio Connected Services
Jon Galloway - How can I prevent a Windows Runtime WebView from loading any content beyond the initial request?
Raymond Chen - .NET 6 – Single file apps improved for Windows and Mac!
Bruno Capuano - How to create faster and smarter apps with .NET 5
Michael Crump - C#'s Functional Journey
Mads Torgersen - Using Streams with HttpClient to Improve Performance and Memory Usage
Marinko Spasojevic - Internals of the POH
Maoni Stephens - How to Debug Live .NET Application
Hasan Hasanov - C# 9.0: Pattern Matching in Switch Expressions
Thomas Claudius Huber

Ya hace tiempo que se lanzó .NET 5, pero seguro que algunos os habéis dado cuenta de que cuando desde Visual Studio creamos determinados tipos de proyecto, como bibliotecas de clases o proyectos de consola, por defecto éstos utilizan como target .NET Core 3.1 en lugar de .NET 5.
No se trata de un error; desde Microsoft justifican esta decisión porque .NET 5 no es una versión LTS, y prefieren que por defecto los proyectos sean creados usando una versión con mayor tiempo de soporte, como .NET Core 3.1.
Esto tiene fácil solución, porque tras crearlo simplemente deberíamos acceder a las propiedades del proyecto o editar el archivo .csproj
y modificar ajustar el target framework a nuestro antojo, pero, ¿cómo podríamos evitar tener que hacer esto cada vez?
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo invocar métodos estáticos C# desde Javascript con Blazor (interop 2/3)
José M. Aguilar - ¡Mi pantalla se ha puesto gris!
José María Aguilar
.NET Core / .NET
- Announcing .NET 6 Preview 1
Richard Lander - Cómo obtener el código fuente de cualquier programa o DLL escrita para .NET (C#)
José Manuel Alarcón - DotNet Boxed includes prescriptive templates for .NET Core
Scott Hanselman - ICYMI C# 8 New Features: Nested Switch Expressions
Jason Roberts - Correctly converting a character to lower/upper case
Gérald Barré - Packaging a Roslyn Analyzer with NuGet package references
Gérald Barré - .NET 5 Deterministic Builds & Source Linking
Mitchel Sellers - Pure functions and unused return values
Cezary Piątek - Cake Frosting: More Maintainable C# DevOps
Lee P Richardson - Introducing Spreadsheet Rich Cell Data Types for .NET Objects
Mackenzie Albitz - C# 9.0: Improved Pattern Matching
Thomas Claudius Huber - My Favorite C# Features - Part 1: Strong-types, Implicit-types, Anonymous-types, and Target-types
Jeffrey T. Fritz - Porting versus interop for .NET
Mark Heath

Es frecuente que alumnos de mi curso de Blazor en CampusMVP me pregunten sobre la existencia de bibliotecas de componentes que les ayuden a desarrollar aplicaciones profesionales más rápidamente, por lo que no podía pasar por alto la noticia que publicaban hace unos días los amigos de Radzen en su cuenta de Twitter:
En efecto, ¡los componentes para Blazor de Radzen han pasado a ser open source y distribuidos bajo licencia MIT!
Para los que no los conozcan, Radzen es uno de los referentes en el mundo de las herramientas y componentes visuales para el desarrollo rápido de aplicaciones web, pero lo que nos ocupa ahora son el conjunto de más de 60 componentes visuales para Blazor Server y WebAssembly que ahora podremos utilizar de forma totalmente gratuita (bueno, aunque existen opciones para pagar por servicios de soporte profesional).
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: blazor, blazorserver, blazorwasm, componentes