Aunque muchos de nosotros trabajamos a diario con C#, siempre hay algo nuevo por aprender o formas de utilizar algunas características que nunca se nos habían ocurrido. Siempre.
En un nuevo capítulo de la serie de C# bizarro, hoy os planteo un reto sobre este código:
var sum = (int a, int b) => a + b;
var sub = (int a, int b) => a - b;
var mul = (int a, int b) => a * b;
var result = sum - sub + mul;
Console.WriteLine("Resultado: " + result(3, 2));
¿Compila? Y si es así, ¿qué aparece por consola? ¡No sigáis leyendo! Echad un vistazo al código e intentad averiguarlo antes de ver la solución pulsando aquí :)
Pues sí, este código es totalmente válido y compilará sin problema. Y al ejecutarlo, por consola veremos lo siguiente.
Resultado: 6
En primer lugar el código compila correctamente porque las variables sum
, sub
y mult
, que hemos definido usando expresiones lambda de tipo Func<int, int, int>
, a la postre son simplemente delegados.
Además, los tres delegados tienen la firma idéntica (reciben dos valores int
y retornan un int
), podemos utilizar los operadores de combinación suma "+
" y resta "-
", lo que da lugar a un delegado de multidifusión (multicast delegate).
En nuestro código, creamos el nuevo delegado de multidifusión result
combinando sum
y mult
, que son los dos delegados que se suman. Por otra parte, la resta de sub
es simplemente una maniobra de distracción, pues se intentará eliminar de la combinación un delegado que no existía previamente, por lo que la operación será ignorada.
var result = sum - sub + mul;
Tras ejecutar esta línea, result
será un Func<int, int, int>
cuya invocación provocará que se ejecuten secuencialmente, y por orden de llegada, los delegados que han sido combinados.
Por tanto, cuando se evalúa la expresión result(3, 2)
, se ejecutará primero la función sum(3, 2)
y luego mul(3, 2)
, y será el resultado de esta última la que se retorne finalmente. De ahí obtenemos el 6
que va a la consola.
¿Qué, habías acertado?
Publicado en Variable not found.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Crear componentes de forma dinámica en Blazor
José María Aguilar - 20 desastres famosos relacionados con el software
José María Aguilar
.NET Core / .NET
- Upgrading your .NET projects with Visual Studio
Olia Gavrysh - How to Return a Default Value From a Dictionary in C#
Code Maze - What is .NET, and why should you choose it?
.NET Team - Thoughts on 'What is .NET, and why should you choose it?'
Andrew Lock - Exploring the New Features and Improvements in .NET 7
Vinoth Kumar Sundara Moorthy - How to Get Formatted JSON in .Net Using C#
Code Maze - Async EventHandlers – A Simple Safety Net to the Rescue
Nick Cosentino - Wolverine’s New HTTP Endpoint Model
Jeremy D. Miller - Creating a circuit breaker health check using Polly CircuitBreaker
Jürgen Gutsch - What's On Tap for .NET 8 (Preview 1 Coming this Month)
David Ramel - Digging Into Nullable Reference Types in C#
Shawn Wildermuth - Multipart Form-Data in HttpClient with ASP.NET Core
Code Maze - Prevent accidental disclosure of configuration secrets
Gérald Barré - Removing Manually Installed .NET SDKs from Linux
Bryan Hogan - Creating Visual Studio extensions using Roslyn analyzers
Thomas Ardal - A (performance) quirk with JsonSerializer
Steven Giesel - Getting Started with Generics in .NET
Assis Zang
Hace poco, un alumno de mi curso de Blazor en CampusMVP me preguntaba si, para seguir con las viejas costumbres, desde Blazor Server era posible escribir en la consola del navegador.
Aunque no tiene demasiado sentido hacerlo dado que disponemos de buenas herramientas de depuración, me pareció un ejemplo interesante para aplicar los mecanismos de interoperación de Blazor con JavaScript. Además, quizás interese a alguien más, así que vamos a ver por aquí cómo hacerlo.
Pero antes de meternos en faena, vale la pena decir que lo que veremos no es específico de Blazor Server, sino que también podremos usarlo en Blazor WebAssembly. Los mecanismos básicos de interoperación con JavaScript son idénticos, por lo que en este post veremos cómo implementar un código válido para ambos tipos de hosting.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: blazor, blazorinterop, blazorserver, blazorwasm
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo tomar el control en el momento de la instanciación de componentes Blazor con IComponentActivator
José María Aguilar - Métodos genéricos en C#
José María Aguilar
.NET Core / .NET
- C# Language Mind map
Steven Giesel - Update to the .NET language strategy
Kathleen Dollard - Simple Secrets for Access to the .NET Record Type
Nick Cosentino - Refactoring Bloated Code in C#
Code Maze - Explicit validation in C# just got simpler!
Oskar Dudycz - Asynchronous Programming Patterns in .NET
Code Maze - Must follow C rules, no exceptions
Eric Sink
Me gusta estar atento a las novedades que van apareciendo el lenguajes y frameworks que nos ayudan a mejorar la forma de hacer las cosas. Lamentablemente, en este mundo tan cambiante no es fácil estar al día en todo, y hay muchas veces que sigo haciendo cosas como siempre aunque existan fórmulas más modernas y mejores para conseguirlo.
Un ejemplo lo he encontrado hace poco, cuando, trabajando con JavaScript, una vez más he tenido necesidad de parsear la URL de la página actual en busca de los valores de los parámetros suministrados en la query string al cargar una página. Lo habitual en estos casos era tirar de Google o StackOverflow y acabar implementado una función parecida a la siguiente:
function getParameterValue(name, url = window.location.href) {
name = name.replace(/[\[\]]/g, '\\$&');
var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, ' '));
}
Casualmente, en este caso recordé haber leído de pasada sobre la existencia de un "nuevo" objeto de JavaScript que actualmente nos permite hacerlo de forma más sencilla, así que aproveché para ponerme un poco al día al respecto ;)
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo convertir clases en diccionarios clave/valor
José María Aguilar - 12 novedades destacables de Blazor 5.0 (bueno, y algunas más)
José María Aguilar
.NET Core / .NET
- C# HTML Parser
Manthan Koolwal - How to Get Value by Key from JObject in C#
Code Maze - C# All string escape sequences
Metadata consulting - Hot-reload any Serilog sink
Nicholas Blumhardt - C# Tip: do NOT use nameof to give constants a value
Davide Bellone - Basic Windows Machine Hardware information from WMI for Exception Logging from .NET
Rick Strahl - C# ValueTuple
Patrick Smacchia - C# 11.0 new features: raw string literals
Ian Griffiths - Thread Safe Lazy Initialization Using C# Notes
Ken Dale