
Hace unos días hablábamos de las directivas using
globales, un interesante añadido a C# 10 que permite importar espacios de nombres en todos los archivos de código del proyecto, sin necesidad de repetir cientos de veces las mismas líneas en sus encabezados. Simplemente, si un namespace es interesante para nuestro proyecto, lo declaramos como global en algún punto y será lo mismo que si lo hubiéramos hecho en cada uno de los archivos .cs:
global using System;
global using System.Text;
global using System.Text.Json;
global using MyProject.Model;
...
Bien podían haberlo dejado aquí porque ya es una mejora sustancial respecto a lo que tenemos, pero no, el equipo de diseño de C# sigue introduciendo detalles que pueden hacernos la vida más sencilla. Es el caso de los implicit usings que, de la misma forma, acompañan a .NET 6 y C# 10.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- 3 formas de saber si un componente se está ejecutando en Blazor Server o WebAssembly
José María Aguilar - Registro y obtención de múltiples implementaciones de servicios en ASP.NET Core, y un caso práctico
José María Aguilar
.NET Core / .NET
- Announcing .NET 6 Release Candidate 2
Richard Lander - CQRS Validation Pipeline with MediatR and FluentValidation
Marinko Spasojevic - Downloading a SSL/TLS certificate in .NET
Gérald Barré - World's Smallest C# Program (featuring
N
)
Niels Rasmussen - Updating NuGet packages from command-line
Thomas Ardal - The Problem with C# 10 Implicit Usings
Muhammad Rehan Saeed - Hot Reload in .NET 6- An Overview
Mohamed Yasir Kader Sha - Bite-Size .NET 6 - Chunk() in LINQ
Matthew Jones - Dotnet could not execute because the application was not found or a compatible .NET SDK is not installed
Scott Hanselman - Enable .NET CLI Tab Completion
Cody Merritt Anhorn
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- La interfaz IMiddleware: Middlewares tipados per request en ASP.NET Core
José María Aguilar - Un vistazo a los patrones relacionales y combinadores, lo nuevo de C# 9 para exprimir el pattern matching
José María Aguilar
.NET Core / .NET
- Code Coverage in .NET
Marinko Spasojevic - WebView2 Flashing when changing TabControl Tabs
Rick Strahl - Bite-Size .NET 6 - DateOnly and TimeOnly
Matthew Jones - Everything That Every .NET Developer Needs To Know About Disposable Types
David Mccarter - Exploring C# 10: Save Space with File-Scoped Namespaces
Dave Brock - Unit Testing Legacy Applications with JustMock
Peter Vogel - 6 Tips for Writing Elegant C# Code
Assis Zang
Seguro que estáis acostumbrados a ver y escribir las, a veces extensas, listas de directivas
using
encabezando vuestros archivos de código fuente C#. Aunque ciertamente los entornos de desarrollo actuales son de bastante ayuda a la hora de introducirlos e incluso a veces nos permiten colapsarlos, son unos grandes consumidores del valioso espacio vertical de nuestros monitores:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// ... (muchos using más)
namespace MyApplication
{
public class MyClass
{
...
}
}
Pero si habéis trabajado con Razor, ya sea para crear vistas MVC/Razor Pages o bien desde Blazor, seguro que os habrán encantado los archivos tipo _ViewImports.cshtml
o _Imports.razor
, pues permiten introducir directivas que se apliquen a todos los archivos Razor del proyecto.
¿No sería buena idea llevar esto mismo a nivel del lenguaje?
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo saber si un objeto no es nulo (edición C# 9)
José María Aguilar - El hosting in-process de ASP.NET Core 2.2
José María Aguilar
.NET Core / .NET
- Is C# Getting Too Complex?
Michael Moreno - J4JLogger: A Serilog Wrapper that Provides Source Code Information
Mark Olbert - Grouping Assertions in Tests
Steve Smith - Events in C#
Marinko Spasojevic - Compress Strings With .NET and C#
Khalid Abuhakmeh - Remove all event handlers from an event in C#
Rod Stephens - C# 10.0: Global Using Directives – Make Important Namespaces Available in Your Whole Project
Thomas Claudius Huber - Differences between Hashtable vs Dictonary vs ConcurrentDictionary vs ImmutableDictionary
Scott Hanselman

Como en otras ocasiones, seguro que debía ser de los pocos que quedaban en este planeta sin saber esto, pero me lo he encontrado mientras pululaba por internet y me ha parecido de lo más curioso. Y como con toda probabilidad habrá por ahí algún despistado más, me ha parecido interesante comentar por aquí mi último gran descubrimiento ;)
La cuestión es que en nuestro mundillo solemos utilizar frecuentemente los términos uppercase y lowercase para referirnos a mayúsculas y minúsculas. Pensaba, erróneamente, que los prefijos upper y lower tenían que ver con el tamaño de los caracteres, y jamás me había dado por preguntarme el por qué de este sufijo "case" tan caprichoso que estas palabras comparten.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Crear bloques de código Razor reutilizables en Blazor con Render Fragments
José María Aguilar - Crear y utilizar librerías multiplataforma con C++ y .NET Core (Parte 2)
Jorge Turrado
.NET Core / .NET
- Adiciones a LINQ en .NET 6.0
Octavio Hernandez - 6 Essential Tools to Detect and Fix Performance Issues in .NET
Michael Shpilt - Generate PDF files using an html template and Playwright
Gérald Barré - How to sign XML using RSA in .NET & ECDSA and Custom XML Signatures in .NET
Scott Brady - Source Generator For INotifyPropertyChanged
Anu Viswan - A look at the upcoming improvements to LINQ in .NET 6
Matt Eland - C# tip: define Using Aliases to avoid ambiguity
Davide Bellone - C# XML Comments in Visual Studio Code
Dennes Torres - C# 10.0 implicit global using directives
Ian Griffiths - C# 10.0: File Scoped Namespaces – Get More Space For Your Code
Thomas Claudius Huber - .NET 6 / C# 10 Top New Features Recap
Wade Gausden - Implicit Usings in .NET 6
Scott Hanselman
Si trabajáis con ASP.NET Core MVC, seguro que con frecuencia implementaréis acciones que reciben como argumento objetos complejos, que normalmente vendrán serializados en el cuerpo de la petición como JSON.
Y probablemente, lo habréis hecho esperando que el binder obre su magia y sea capaz de transformar esas secuencias de caracteres procedentes de la red en flamantes instancias de objetos del CLR, listas para ser consumidas desde las aplicaciones. Un ejemplo de acción de este tipo es la siguiente (aunque no funcionaría, luego vemos por qué):
public class FriendsController: Controller
{
[HttpPost]
public string Hello(Friend friend)
{
return $"Hola {friend.Name}, tienes {friend.Age} años";
}
}
public class Friend
{
public int Age { get; set; }
public string Name { get; set; }
}
Sin embargo, a veces nos encontramos con que, a pesar de que la petición contiene en su body los datos JSON esperados, el objeto que recibimos es nulo o tiene todas sus propiedades sin inicializar.
¿Por qué ocurre esto? En este post vamos a ver distintos motivos que podrían llevar a este comportamiento, y cómo solucionar cada caso.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo mostrar por consola las líneas que se van añadiendo a logs o archivos de texto, en tiempo real
José María Aguilar - ¿Se pueden introducir directivas o lógica de inicialización en todas las vistas y páginas sin duplicar código?
José María Aguilar
.NET Core / .NET
- Announcing .NET 6 Release Candidate 1
Richard Lander - Introduction to System.Text.Json Through Examples
Marinko Spasojevic - Investigating an infinite loop in Release configuration
Gérald Barré - Getting Started Tweetinvi .NET Twitter
Bradley Wells - Looking inside ConfigurationManager in .NET 6: Exploring .NET Core 6
Andrew Lock - CoreWCF 0.3.0 Release
Matt Connew - Deep C#: Strong Typing
Mike James - Using .NET To Validate JSON with JSON Schema
Khalid Abuhakmeh - What I Like About C# 9
Joseph Guadagno - Introducing Package Source Mapping
Nikolche Kolev - Debugging a .NET App on Linux from Windows Visual Studio with WSL
Patrick Smacchia - HTTP/3 support in .NET 6
Sam Spencer
El timeout que dejé programado semanas atrás ya ha finalizado, por lo que hay que ponerse de nuevo las pilas. Y sin duda, ningún día mejor para hacerlo que el Día Internacional del Programador, celebrado de forma más o menos consensuada el día 13 de septiembre (12 si el año es bisiesto), al ser el día 256º de cada año :)
Así que, para iniciar la temporada con buen pie, ahí va una colección de enlaces, que espero os resulten interesantes :-)
Por si te lo perdiste...
- Syncfusion Blazor UI components library: un primer vistazo
José María Aguilar - Otras formas de obtener dependencias en controladores ASP.NET Core MVC
José María Aguilar
.NET Core / .NET
- Launching Visual Studio Code cleanly from a .NET Application
Rick Strahl - File IO improvements in .NET 6
Adam Sitnik - How not to read a string from an UTF-8 stream
Gérald Barré - IntelliSense for Hosted C# Script
Phil Haack - C# static constructor called multiple times & Going deeper into static constructors hole
Jiří Činčura - Favorite improvements in .NET 6
Mark Downie - A neat Trick to Debug Exceptions in C#
Simon Sutoris - Manually Parsing a Json String Using System.Text.Json
Paul Michaels - C# Namespace Declarations
Steve Fenton - DateOnly And TimeOnly Types In .NET 6
Wade Gausden - How To Desktop in 2022
Sam Basu
Como es habitual por estas fechas, me complace (seriamente) informaros de que a partir de la semana el blog quedará en "modo verano" y dejaré de publicar nuevos contenidos hasta ya entrado septiembre.
Durante este periodo procuraré desconectar totalmente durante un par de semanas, y el resto del tiempo al menos poder bajar un poco el ritmo, a ver si puedo disfrutar un poco de esas cosas que dicen que existen fuera de las pantallas ;)
¡Nos vemos a la vuelta!

Publicado en Variable not found.
Semanas atrás echamos un vistazo por encima a Blazor UI Components, los componentes profesionales para Blazor de Syncfusion, y algún tiempo después revisamos más en detalle uno de los grandes protagonistas en el mundo de los componentes, los de creación de gráficas estadísticas o Charts.
Sin embargo, si hay un tipo de componentes que todos usamos de forma frecuente en nuestras aplicaciones profesionales son, sin duda alguna, los grids o rejillas de datos. Por esa razón, los componentes que de alguna forma simplifican su creación son probablemente los más populares en todas las suites profesionales o gratuitas, sea cual sea la tecnología en la que trabajemos.
En este post centraremos el foco en Blazor DataGrid, la propuesta de Syncfusion para crear interfaces de rejillas de datos de forma sencilla y eficaz para Blazor Server y WebAssembly.
Pero antes de empezar, recordad que, aunque se trata de un producto comercial, dispone de una licencia community bastante permisiva, que permite que en muchos casos podamos utilizar los componentes de forma totalmente gratuita.
Nota: lo que estás leyendo es un post patrocinado por Syncfusion, pero en ningún momento han revisado previamente o condicionado de alguna forma su contenido.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: blazor, blazorserver, blazorwasm, sponsored, syncfusion
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- ¿Cuánto pesa realmente una aplicación Blazor WebAssembly recién creada?
José María Aguilar - Mi controlador tiene muchos parámetros en el constructor, ¿estoy haciendo algo mal?
José María Aguilar
.NET Core / .NET
- .NET 6 LINQ New Features
Satish Yadav - ICYMI C# 9 New Features: Adding foreach Support To Any Type
Jason Roberts - How Does the StringBuilder Work in .NET? Part 1 & Part 2
Steve Gordon - Supporting Hot Reload in your .NET application
Gérald Barré - C# 10 - Top 5 New Features in the Upcoming C# Version
Nikola M. Zivkovic - Taking Your Brain To Another Dimension - A C# library for physical units
Keith Barrett - C# tip: String.IsNullOrEmpty or String.IsNullOrWhiteSpace?
Davide Bellone - Rediscovering implicit casting
Ken Bonny - Zero to Hero: Containerizing .NET 5.0 WebApis
David Kröll - Thoughts on Async/Await Conversion in a Desktop App
Rick Strahl - How to Use Custom Comparers in NUnit
Sean Killeen

Como sabéis, a no ser que se especifique lo contrario mediante la directiva @inherits
, los componentes Blazor heredan de Microsoft.AspNetCore.Components.ComponentBase
. Esta clase abstracta proporcionada por el framework hace que podamos centrarnos en escribir nuestro código, al encargarse de gestionar aspectos básicos de los componentes como su creación, inicialización, renderizado, el ciclo de vida u otros aspectos de infraestructura.
Pero aunque heredar de ComponentBase
es la inmensa mayoría de las veces la mejor opción, no tiene por qué ser así necesariamente. Blazor reconoce como componente cualquier clase que implemente IComponent
, una pieza mucho más pequeña.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Ver el código fuente generado por source generators
José María Aguilar - Establecer textos por defecto y localizados en validaciones de ASP.NET Core MVC
José María Aguilar
.NET Core / .NET
- ¿Qué es la carpeta "ref" que hay en los resultados de compilar un proyecto con .NET?
José Manuel Alarcón - Cost of exceptions
Gunnar Peipman - ICYMI C# 9 New Features: Reducing Code with Target-typed New Expressions
Jason Roberts - Test Your .NET HttpClient Based Strongly Typed Clients Like a Boss
Adam Storr - How to Compare Performance between .NET 5 and .NET Framework Controls
Denis Zmitrichenko - Functional monads in C#
Camilo Reyes - Conditional compilation for ignoring method calls with the ConditionalAttribute
Andrew Lock - Stop Saving to Disk with C# Asynchronous Streams
Lee Richardson - C sharp or B flat? Experiments in self-contained native executables in .NET
Scott Hanselman - A Practical Guide to Higher Order Functions in C#
Sam Walpole - Why is there a difference between decimal 0 and 0.0?
Colin Mackay
Es una gran alegría poder compartir con todos vosotros que Microsoft me ha reconocido por undécimo año consecutivo como Most Valuable Professional (MVP) en la comunidad de tecnologías para desarrolladores.
En esta ocasión, la notificación del nombramiento me pilló completamente desprevenido, apagando un fuego de los gordos provocado por un error en un servidor de producción, por lo que el fragor de la batalla no me dejó celebrar apropiadamente el momento, ni disfrutar la tensa espera que lo precede. Pero ya al llegar la calma, sí que he podido sentir de nuevo la emoción y orgullo que supone seguir perteneciendo un año más a este selecto grupo de locos por el software y la tecnología. ¡Once años ya, uau!
Muchas gracias a todos los que hacéis esto posible: a los que me estáis leyendo, porque sois los que día a día me dais motivos para continuar con este proyecto. No dudéis que sin vuestras visitas, comentarios y mensajes esto no tendría sentido.
Muchas gracias también al equipo del programa MVP, por su incansable labor en beneficio de la comunidad y su inestimable ayuda a los miembros del programa.
Y como no podía ser de otra forma, un agradecimiento infinito para mi mujer e hijas, por cederme el tiempo y espacio que necesito para desarrollar mi pasión.
Por último, me gustaría aprovechar la ocasión para felicitar a los MVP que renuevan este año y animarlos a continuar regalándonos tanto conocimiento y entusiasmo. Y también, por supuesto, una afectuosa bienvenida a los que acabáis de recibir vuestro primer reconocimiento; disfrutad el momento, porque no lo vais a olvidar jamás :)
¡Nos vemos!
Publicado en Variable not found.

Me encanta que el lenguaje C# vaya introduciendo características que consiguen que cada vez tengamos que escribir menos para conseguir lo mismo, y, sobre todo, si la legibilidad posterior del código no se ve comprometida.
Uno de estos casos son los recientes target-typed new expressions, o expresiones new con el tipo del destino, que básicamente permite evitar la introducción del tipo de datos al usar el constructor de una clase, siempre que el compilador sea capaz de inferirlo por su contexto.
Vamos a echarle un vistazo en este post.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Analiza tu código a fondo y desde distintas perspectivas con NDepend
José María Aguilar - Localizar errores de validación del binding en ASP.NET Core MVC
José María Aguilar
.NET Core / .NET
- What's new in Windows Forms in .NET 6.0 Preview 5
Igor Velikorossov - C# Type Conversion (and Coffee!) • Programming is Fun
Janell Baxter - What is the difference between Reflection and dynamic keyword in C#?
Shivprasad Koirala - Default Your FirstOrDefault in .NET 6.0
Adam Storr - Exploring Fluent Assertions
Gérald Barré - Abusing C# binding redirects for fun and profit - Injecting custom code without modifying files
Bill Wilson - Customized JSON formatting with Serilog
Nicholas Blumhardt - ICYMI C# 9 New Features: More Pattern Matching Features
Jason Roberts - Package Validation
Anirudh Agnihotry - Understanding async/await State Machine in .NET
Mykhailo Konovalov - CompactExifLib: Access to EXIF Tags in JPEG, TIFF and PNG Files
Hanns-Peter Kalb

Hace algunas semanas echamos un vistazo rápido a Blazor UI Components, la suite de componentes profesionales para Blazor proporcionada por Syncfusion.
Como vimos, se trata de una completa colección que soluciona las necesidades más habituales durante la creación de la interfaz de usuario de aplicaciones Blazor, tanto Server como WebAssembly. Más de 70 componentes que incluyen controles de entrada de datos, botones, calendarios, layouts, rejillas de datos o gráficas estadísticas, entre otros. Y lo mejor es que, aunque se trata de un producto comercial, su generosa licencia community permite que muchos podamos utilizarlos de forma totalmente gratuita.
Hoy vamos a profundizar un poco en los componentes de presentación de datos estadísticos, o Chart Components, que por su potencia, versatilidad y calidad del resultado merece un post en sí mismos.
Nota: lo que estáis leyendo es un post patrocinado por Syncfusion, pero en ningún momento han revisado previamente o condicionado de alguna forma su contenido.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: blazor, blazorserver, blazorwasm, componentes, sponsored, syncfusion
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- C# Source generators: metaprogramación en tiempo de compilación
José María Aguilar - Cargar automáticamente objetos del modelo en acciones ASP.NET Core MVC
José María Aguilar
.NET Core / .NET
- Announcing .NET 6 Preview 5
Richard Lander - Making Your Life Easier with C# Scripting
Peter Vogel - Caching Enum.ToString to improve performance
Gérald Barré - Conversation about diagnostics
Richard Lander - Setting Content for HttpClient Testing with JSON.NET and System.Text.Json
Adam Storr - Hot Reload for .NET Developers
Daniel Gomez Jaramillo - Migration of Bing’s Workflow Engine to .NET 5
Ben Watson - dotnet repl
Scott Hanselman - Running .NET Core Apps on a Framework other than Compiled Version?
Rick Strahl - ICYMI C# 9 New Features: Top-level Statements
Jason Roberts - C# Pattern Matching Quick Guide And Examples
Khalid Abuhakmeh - Conversation about networking
Richard Lander - Show a name and profile photo with .NET and Gravatar
Thomas Ardal - Quick Noda Time Conversions
Simon Timms - C# 10 -
record struct
Deep Dive & Performance Implications
Niels Rasmussen

No hace demasiado tiempo he descubierto en el framework la clase ActivatorUtilities
, una pequeña joyita disponible en Microsoft.Extensions.DependencyInjection
, que puede resultar interesante para implementar fácilmente factorías o cualquier tipo de código donde tengamos que instanciar manualmente clases con dependencias hacia servicios registrados en el contenedor de nuestra aplicación.
La clase estática ActivatorUtilities
ofrece básicamente tres métodos públicos:
CreateFactory()
, para crear factorías de objetos.CreateInstance()
/CreateInstance<T>()
, para crear instancias de objetos.GetServiceOrCreateInstance()
/GetServiceOrCreateInstance<T>()
, para obtener una instancia desde el inyector, o bien crearla manualmente conCreateInstance()
.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo crear bibliotecas de clases o proyectos de consola .NET 5 en lugar de .NET Core 3.1
José María Aguilar - Quizás no estés comparando con null de forma totalmente correcta
José María Aguilar
.NET Core / .NET
- Date, Time, and Time Zone Enhancements in .NET 6
Matt Johnso - Debugging C# Source Generators with Visual Studio 2019 16.10
Steve Collins - Different ways to check if a value is null in C#
Gérald Barré - Extending HttpClient Testing With Templating
Adam Storr - A Closer Look at 5 New Features in C# 10
Matthew MacDonald - Build apps for Microsoft Teams with .NET
John Miller - C# tip: how to get the index of an item in a foreach loop
Davide Bellone - In the Jungle of .NET Obfuscator Tools
Patrick Smacchia - Rediscovering implicit casting
Ken Bonny - Command Line Arguments and C# 9.0 Top Level Statement
Abhijit Jana - Show dotnet: Running my .NET nanoFramework for 8 years on a battery
Laurent Ellerbach - A C# Library to Implement Array Tries
Jorge Luis Orejel

Blazor permite crear componentes que son ignorantes respecto al modelo de hosting que están utilizando en tiempo de ejecución. Es decir, si lo diseñamos apropiadamente, un componente podría funcionar indistintamente en Blazor Server y Blazor WebAssembly, lo cual sería ideal desde el punto de vista de su reutilización.
Sin embargo, desde el interior de estos componentes, a veces necesitaremos distinguir cuándo están siendo ejecutados en Blazor Server y cuándo en Blazor WebAssembly. ¿Cómo podemos conseguir esto? Pues tenemos muchas maneras...
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- ¿Aplicar [Authorize] a todos los controladores MVC de una carpeta?
José María Aguilar - Radzen Blazor Components: ¡ahora open source!
José María Aguilar
.NET Core / .NET
- New LINQ extensions in .NET 6 and benchmarks
Kristoffer Strube - Benchmarking 4 reflection methods for calling a constructor in .NET
Andrew Lock - Conversation about .NET interop
Richard Lander - Working With .NET 6’s PriorityQueue
Khalid Abuhakmeh - Quick Tip - Compiler Directives and Using Aliases to Ignore Tests
Adam Storr - Migrate or Port Your Old Legacy .net Projects to the .NET5
Sibeesh Venu - Interpreting async code in CPU traces
Mark Downie - Conversation about the .NET type system
Richard Lander - Customizing Serilog text output
Nicholas Blumhardt - The Roslyn analyzers I use in my projects
Gérald Barré - .NET 6: Collections Improvements
Jonathan Allen

Desde C# 7 podemos emplear patrones en expresiones is
o bloques switch
para especificar las condiciones que deseamos comprobar, y cada nueva versión del lenguaje sigue introduciendo novedades al pattern matching, haciéndolo cada vez más sencillo y cómodo de utilizar.
En particular, C# 9 ha añadido un montón de características interesantes destinadas a facilitar el uso de patrones, pero en este post vamos a centrarnos en las dos más importantes: los combinadores de patrones y los patrones relacionales.
Ahí van los enlaces recopilados durante la semana pasada, con muchas novedades de la Build 2021. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Si usas [EmailAddress] y [Url] para validar datos de entrada, ojo: ¡que hace tiempo que ya no validan mucho!
José María Aguilar - BenchmarkDotNet: Arañando microsegundos en proyectos .NET Core o .NET Framework
José María Aguilar
.NET Core / .NET
- Announcing .NET 6 Preview 4
Richard Lander - Introducing the .NET Hot Reload experience for editing code at runtime
Dmitry Lyalin - How to Easily Create Telegram Bot using C#
Uladzislau Baryshchyk - C# 9 init accessors and records
Tom Deseyn - .NET Basics
Dustin Morris - How to use MediatR Pipeline Behaviours
Gary Woodfine - Finding concurrency bugs in a .NET application using Coyote
Gérald Barré - Simple Example of Calling REST API with HttpClient in .NET 5.0
Adam Storr - OData In .NET 5
Jay Krishna Reddy - Running a .NET application as a service on Linux with Systemd
Maarten Balliauw - Using DateOnly and TimeOnly in .NET 6 - Steve Gordon
Steve Gordon - The Difference Between HTML and URL Encode In .NET
Khalid Abuhakmeh - Building a Source Generator for C#
Jonathan Allen

Hace algunos años hablábamos de que la forma más correcta de determinar si un objeto es nulo en C# era utilizando el operador is
:
var invoice = _invoiceRepository.GetById(18);
if(invoice is null)
{
// Hacer algo
}
Como vimos en su momento, esta opción era mejor que utilizar una comparación directa como invoice == null
porque el operador de igualdad podía ser sobrecargado y, por tanto, su comportamiento podría ser modificado, mientras que el operador is
no es sobrecargable.
Sin embargo, al comenzar al usar esta fórmula, encontrábamos un pequeño inconveniente cuando queríamos determinar justo lo contrario, es decir, saber cuándo un objeto no es nulo, pues la sintaxis se volvía algo más pesada:
var invoice = _invoiceRepository.GetById(18);
if(!(invoice is null))
{
// Hacer algo
}
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Trimming de espacios no significativos en Blazor 5
José María Aguilar - Problem Details: una forma estándar de retornar errores desde APIs HTTP (y cómo usarlo desde ASP.NET Core)
José María Aguilar
.NET Core / .NET
- Referencias anulables en C# 8.0 y posteriores (IV): el operador ! y las propiedades anulables
Octavio Hernandez - Async/Await Calls Gotcha with the CSharp ? Null Propagator
Rick Strahl - C# 9.0 Features and Expectations of C# 10
Dotnetsafer - CoreWCF Reached Its First GA Release
Almir Vuk - Introducing: C# Pipe Extensions!
Winston Puckett - Conversation about PGO
Richard Lander - Extending the calculator implementation: Creating a Simple Moving Average calculator in C#
Andrew Lock - Working With .NET Console Host Lifetime Events
Khalid Abuhakmeh - Defining HttpClient Test Requests by Using a Bundle
Adam Storr - Create a colored CLI with System.CommandLine and Spectre
Thomas Ardal - .NET - Personal Extensions
Cody Merritt Anhorn - Building an Event Driven .NET Application: Setting Up MassTransit and RabbitMQ – Wrapt
Paul DeVito - Conversation about ready to run
Richard Lander - Why should you care about .NET GC…?
Konrad Kokosa - Authenticated Encryption in .NET with AES-GCM
Scott Brady - Obtaining network usage information from the Windows Runtime & Obtaining attributed network usage information from the Windows Runtime
Raymond Chen - Show dotnet: Investigating Alpine Linux CVEs in .NET container images
Richard Lander - On replacing Thread.Abort() in .NET 6, .NET 5 and .NET Core
Patrick Smacchia

Durante la implementación de páginas o componentes Blazor en archivos .razor
, es relativamente frecuente encontrarse con casos en los que nos interesa reutilizar un bloque de código Razor en más de un punto.
Por ejemplo, observad el siguiente ejemplo:
<h1>Todo list</h1>
<h2>Pending tasks</h2>
<ul>
@foreach (TodoItem item in TodoItems.Where(i=>!i.IsDone).OrderBy(i=>i.Priority))
{
<li>@item.Task, owned by @item.Owner and created at @item.CreatedAt</li>
}
</ul>
<h2>Finished tasks</h2>
<ul>
@foreach (TodoItem item in TodoItems.Where(i=>i.IsDone).OrderBy(i=>i.DateFinished))
{
<li>@item.Task, owned by @item.Owner and created at @item.CreatedAt</li>
}
</ul>
En este componente, podemos ver claramente que estamos repitiendo los dos bloques de código encargados de mostrar los elementos de cada una de las listas, por lo que, si en el futuro quisiéramos cambiar la forma de mostrar un TodoItem
, tendríamos que modificar el interior de los dos bloques. Es frecuente en estos casos optar por crear un nuevo componente que se encargue de ello, por ejemplo, llamado TodoListItem
:
<li>@Item.Task, owned by @Item.Owner and created at @Item.CreatedAt</li>
@code {
[Parameter]
public TodoItem Item { get; set;}
}
De esta forma ya tendremos el código de renderización del TodoItem
centralizado y podremos simplificar el bloque anterior eliminando la duplicidad:
<h1>Todo list</h1>
<h2>Pending tasks</h2>
<ul>
@foreach (TodoItem item in TodoItems.Where(i=>!i.IsDone).OrderBy(i=>i.Priority))
{
<TodoListItem Item="item" />
}
</ul>
<h2>Finished tasks</h2>
<ul>
@foreach (TodoItem item in TodoItems.Where(i=>i.IsDone).OrderBy(i=>i.DateFinished))
{
<TodoListItem Item="item" />
}
</ul>
Aunque conceptualmente la solución que hemos implementado es correcta, introduce un problema en nuestra aplicación: por el mero hecho de querer evitar la duplicación de código, estamos introduciendo en la página un número indeterminado de componentes, lo cual podría afectar drásticamente a su rendimiento.
Por llevarlo al extremo, imaginad que esas listas tienen miles de elementos. En este caso, en nuestra página estaríamos introduciendo miles de componentes, con lo que esto implica:
- Deberían instanciarse miles de componentes (objetos).
- Deberían ejecutarse los eventos del ciclo de vida de cada componente al crearlos, inicializarlos, renderizarlos, etc.
- Mientras se encuentren en la página cada componente ocuparía memoria, ya sea en cliente (Blazor WebAssembly) o en servidor (Blazor Server).
Esto podría llegar incluso a hacer una página inutilizable, por lo que es importante disponer de otros métodos para crear y reutilizar bloques de código HTML sin necesidad de crear componentes. Esta es una de las utilidades de los render fragments.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- El filtro [ApiController] en ASP.NET Core MVC 2.1
José María Aguilar - Actualización de EF6.TagWith (versión 1.2.1)
José María Aguilar
.NET Core / .NET
- .NET 6: DateOnly y TimeOnly, las nuevas estructuras para almacenar fechas y horas aisladas
José Manuel Alarcón - Put a DPAD on that GC!
Maoni Stephens - Using the new PriorityQueue from .NET 6
Kristoffer Strube - Catching all the Requests while Testing with HttpClient
Adam Storr - Using C# Named Arguments to Declutter Complex Tests
Matthew Jones - Understanding the impact of Roslyn Analyzers on the build time
Gérald Barré - Controlling my Sinclair AC using .NET and C# (from Raspberry Pi)
Jiří Činčura - 5 Ways to Improve the Performance of C# Code for Free
Sasha Mathews - Introducing C# 10
Ken Bonny - Making the calculator thread-safe: Creating a Simple Moving Average calculator in C#
Andrew Lock - Solve For The Next DayOfWeek From DateTime
Khalid Abuhakmeh - POLAR - Creating a Virtual Machine in .NET
Paulo Zemek - My Favorite C# Features - Part 4: Project Structure
Jeffrey T. Fritz - Streaming JSON Objects (NDJSON) With HttpClient
Tomasz Pęczek - C# serialization with JsonSchema and System.Text.Json
Matthew Adams

Pues sí, que se dice pronto, pero hace unos días Variable Not Found cumplió quince años y, como cada aniversario, no quería faltar a la tradición de celebrarlo con vosotros.
Unas 800 semanas, 5.600 días (exceptuando vacaciones, que también las hay), intentando volcar por aquí parte de lo que voy viendo o descubriendo sobre esta profesión que tanto nos gusta. Esto ha dado para cerca de 1300 posts, que han sido consultados más de cuatro millones y medio de veces, y que cuentan con seguidores de todo el mundo, y seguimos fieles los mismos objetivos: aprender y echar una mano al que por aquí se acerque.
Y como de costumbre, aprovecharemos para comentar un poco qué tal fueron las cosas por aquí los últimos 365 días.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- ¿Dónde está la directiva @helper de Razor en ASP.NET Core?
José María Aguilar - Iterar con foreach sobre cualquier tipo de objeto con C#9
José María Aguilar
.NET Core / .NET
- A Simple Moving Average calculator: Creating a Simple Moving Average calculator in C#
Andrew Lock - Implement log monitoring with Seq and Serilog in .net Core
Gary Woodfine - C# 9: Value Objects and Simpler Code
Peter Vogel - Beginning to Make Testing with HttpClient Easier
Adam Storr - Building a supply chain attack with .NET, NuGet, DNS, source generators, and more!
Maarten Balliauw - The future of gRPC in C# belongs to grpc-dotnet
Jan Tattermusch - Covariance and Contravariance in C# Explained
Patrick Smacchia - C# Based Text Template Transformation Engine
Ryan S White - Add a README to Your NuGet Package
Christopher Gill - Experimental Dotnet Monitor Tool Now Fully Supported
David Ramel

Hace unos días pasaba a un amigo una instrucción de PowerShell para visualizar en tiempo real el contenido que iba añadiéndose al final de un archivo de log en Windows, y pensé que igual podía ser útil para alguien más, así que aquí va :)
El asunto es tan simple como abrir un terminal o consola PowerShell en la carpeta donde tengamos el archivo y ejecutar la siguiente orden:
Get-content log.txt -Tail 0 -Wait
A partir de ese momento, la consola quedará bloqueada e irá mostrando en tiempo real las últimas líneas añadidas al archivo:

Esta idea tan sencilla podría ser combinada en scripts que nos simplifiquen alguna tarea más; por ejemplo, si estamos en una carpeta con archivos de trazas de distintos días, es sencillo conseguir que se abra el fichero de log más reciente, de forma que no tengamos que introducir su nombre cada vez que queramos utilizarlo:
# File: ViewLog.ps1
$file = Get-ChildItem -Filter *.txt | Sort-Object LastAccessTime -Descending | Select-Object -First 1
if($file)
{
Get-content $file -Tail 0 -Wait
}
¡Espero que os sea útil!
Publicado en Variable not found.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- El nuevo tipo de retorno ActionResult<T> en ASP.NET Core 2.1
José María Aguilar - Cómo tomar el control en el momento de la instanciación de componentes Blazor con IComponentActivator
José María Aguilar
.NET Core / .NET
- .NET Framework 4.5.2, 4.6, 4.6.1 will reach End of Support on April 26, 2022
Jamshed Damkewala - How to create project templates in .net core
Gary Woodfine - LINQ: Beware of deferred execution
Sam Walpole - C# 9 Record: Compiler Created ToString() Code can Lead to Stack Overflow and Worse
Peter Huber - Scheduling tons of orchestrator functions concurrently in C#
Chris Gillum - Read and Write Excel Spreadsheets With C#
Khalid Abuhakmeh - Convert SVG files to PNG or JPEG using .NET
Gérald Barré - Implementing Floyd-Warshall algorithm for solving all-pairs shortest paths problem in C#
Oleg Karasik - Using the Win32 Api in a C# program with C#/Win32
Bruno Sonnino - Survey Reveals Bigger C# Community, Most and Least Popular Uses
David Ramel - Some more C# 9 - Red Hat Developer
Tom Deseyn - How To Change the Behavior of a C# Record Constructor
Christian Findlay - Nullable Reference types in C# – Best practices
Damir Arh - .NET 6 LINQ Improvements
Jonathan Allen - Some scenarios for deserializing a JSON to a type with read-only properties by "System.Text.Json"
Jsakamoto - C#: Make your delegates asynchronous from synchronous delegates
Anthony Giretti - What's the Top App Model Used by .NET Developers?
David Ramel
En el mundo de las suites profesionales de componentes, seguro que todos habéis oído hablar de Syncfusion. Esta compañía lleva desde 2001 ofreciendo componentes y marcos de trabajo para todo tipo de entornos, con el fin de hacer la vida más sencilla a los desarrolladores: ASP.NET Core, ASP.NET MVC, Web Forms, Angular, React, Vue, Xamarin, Flutter, WinForms o WPF son sólo algunas tecnologías en las que tenemos a disposición sus soluciones.
Y claro, no podía faltar Blazor :) La biblioteca Syncfusion Blazor UI ofrece más de setenta componentes para Blazor Server y WebAssembly que cubren sobradamente las necesidades más habituales en la construcción de aplicaciones profesionales.
Aunque se trata de una solución comercial y las licencias tienen coste, la buena noticia es que existe una generosa licencia community gratuita, mediante la cual podemos tener acceso a todos los componentes siempre que seamos desarrolladores independientes o una empresa con menos de seis trabajadores e ingresemos anualmente menos 1 millón de dólares brutos.
En este post vamos a dar un primer vistazo a esta biblioteca, para tener una idea de su alcance y forma de uso.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: blazor, blazorserver, blazorwasm, componentes, syncfusion
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Implementando más fácilmente background tasks en ASP.NET Core 2.1 (bueno, y 2.0)
José María Aguilar - 12 novedades destacables de Blazor 5.0 (bueno, y algunas más)
José María Aguilar
.NET Core / .NET
- Conversation about crossgen2
Richard Lander - Meet the .NET Upgrade Assistant, Your .NET 5 Moving Company
Dave Brock - Easily Create and Manipulate Mock Anonymous Data for Unit Tests
Adam Storr - Fixing build warning NETSSDK1138 when building projects with end-of-life .NET frameworks
Andrew Lock - Task vs ValueTask: When Should I use ValueTask?
Brian Lagunas - Building .NET projects using the Microsoft.Build.Traversal SDK
Gérald Barré - What's new in dotnet monitor
Sourabh Shirhatti - New .NET Guide Tutorials – From Visual Studio to Rider, ReSharper Essentials, Docker, and more!
Maarten Balliauw - C# 9 init accessors and records
Tom Deseyn - Why you shouldn't compare Blazor to other JavaScript SPA frameworks
Ali Bahraminezhad - The Int Betweeners (or… An Extension Method for Numbers)
Steve Fenton

Cuando empezamos a estudiar Blazor WebAssembly e interiorizamos que para ejecutar .NET en el navegador es necesario llevar hasta éste el runtime y bibliotecas, tanto del propio framework como las de nuestra aplicación, una de las primeras dudas que nos asaltan es que cuánto peso tendrá eso. O dicho de otra forma, qué recursos tendrán que descargar los usuarios y qué tiempo tendrán que esperar hasta tener la aplicación en funcionamiento.
En este post vamos a intentar dar respuesta a esta pregunta, aunque con matices. Obviamente, parte de ese peso dependerá de la aplicación; si se trata de un proyecto grande, con muchos ensamblados o que usen muchos componentes externos (p.e. paquetes NuGet), el número de archivos y el tamaño de la descarga crecerá inexorablemente. Por esa razón, no podremos ver aquí números absolutos, sino los mínimos, es decir, lo que pesará una aplicación Blazor WebAssembly recién creada, con los contenidos proporcionados por la plantilla por defecto usando .NET 5.
Tampoco hablaremos de tiempos, pues son totalmente dependientes de las condiciones de red, la infraestructura en la que despleguemos la aplicación y las posibilidades del cliente. Simplemente tendremos en consideración que a más peso, mayor tiempo será necesario para llevarlo al navegador y ejecutarlo.
Ojo: lo que vamos a ver son los datos aproximados obtenidos en mi máquina de desarrollo y con la versión actual de Blazor (5.0.4). Los números exactos variarán si hacéis pruebas en vuestro entorno, aunque seguro que el espíritu de las conclusiones seguirá siendo el mismo.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Usar Razor desde una aplicación de consola .NET Core (1 de 2)
José María Aguilar - Error 404 cargando páginas Blazor Server con parámetros que contienen un punto
José María Aguilar
.NET Core / .NET
- Getting started with .net core microservices with dapr
Gary Woodfine - My Favorite C# Features - Part 3: Nullability
Jeffrey T. Fritz - .NET 6: Date and Time Structures
Jonathan Allen - Subscribe users to a Mailchimp newsletter from .NET/C#
Thomas Ardal - C# 9 new features for methods and functions
Tom Deseyn - Testing Exceptions with xUnit and Actions
Steve Smith - Top Level Statement in C# 9.0
Abhijit Jana - .NET 6: Async Improvements
Jonathan Allen - Show dotnet: Build your own unit test platform? The true story of .NET nanoFramework.
Laurent Ellerbach - WebView2: Forwarding Alt Keys to a Host WPF Window
Rick Strahl - Deep C# - Casting the Escape from Strong Typing
Mike James

A raíz de los posts sobre generadores de código (como éste y éste), un amigo del blog me escribió para ver si de alguna forma era posible examinar el código fuente generado para poder depurarlo con mayor facilidad.
Y en efecto, es posible. Pero en vez de responderle directamente, he pensado que sería mejor compartirlo por aquí, de forma que pueda resultar de utilidad para alguien más :)
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Detectar la prerenderización en Blazor
José María Aguilar - Desordenar un array en C# y VB.NET
José María Aguilar
.NET Core / .NET
- Announcing .NET 6 Preview 3
Richard Lander - Announcing Open Source C# standardization
Bill Wagner - Migrando desde Net Core 2.2 a Net 5.0 y/o 6.x
Juan Luis Guerrero - Back to Basics: What Is a Delegate?
Hasan Hasanov - Performance Improvements in NuGet
Nikolche Kolev - What's Cool in C# 8 and .NET Core 3
Peter Vogel - Async/Await Explained with Diagrams and Examples
David Deley - C# 9 - Making your code simpler
Damir Arh - The pain points of C# source generators
James Turner - Announcing Facteur, a mailing kit for .NET
Hendrik Bulens - C# 9 pattern matching
Tom Deseyn
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Generar redirecciones HTTP 307 y 308 en ASP.NET Core MVC
José María Aguilar - Cómo personalizar los mensajes de error de conexión en Blazor Server
José María Aguilar
.NET Core / .NET
- Announcing Project Reunion 0.5!
Andrew Clinick - Serilog.Expressions 2.0 update
Nicholas Blumhardt - Viewing app configuration using Oakton's Describe command and Spectre.Console
Andrew Lock - The .NET Stacks #43: DateTime might be seeing other people
Dave Brock - Be careful when mixing ValueTask and Task.Run
Gérald Barré - C# 9 (Two Decades of C#: A Reference)
Ben Bowen - The Future of Windows Apps, Demystified
Matthew MacDonald - C# .NET - How to get the proper length of a Unicode string
Metadata Consulting - .NET Standard 1.3 is no longer supported in AWS SDK for .NET version 3.7
Alex Shovlin - Jump-starting Migration to .NET Core with Upgrade Assistant
Richard Reedy - C# 9 top-level programs and target-typed expressions
Tom Deseyn - 8 Books to Improve as a .NET Developer
Patrick Smacchia
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Valores y parámetros en cascada con Blazor
José María Aguilar - ¿Aún usas ToString() para obtener el nombre de los elementos de un enum?
José María Aguilar
.NET Core / .NET
- ICYMI C# 8 New Features: Asynchronous Streams
Jason Roberts - Debugging .NET Core memory issues (on Linux) with dotnet dump
Tess Ferrandez - Cloud-Native learning resources for .NET developers
Nish Anil - Creating Resilient Microservices in .NET with Polly
Marinko Spasojevic - Fusing await using and await foreach and await
Jiří Činčura - Rewriting git history using C# (git filter-branch alternative)
Gérald Barré - Two Decades of C#: A Reference: C# 5 and C# 6 & C# 7
Ben Bowen - Getting Started with the Roslyn APIs: Writing Code with Code - Steve Gordon
Steve Gordon - Testing Web Applications with PlayWright and C#
Anuraj Parameswaran - Easy generation of fake/dummy data in C# with Faker.Net
Kristoffer Strube - Easily Perform LINQ Mocking to Unit Test ASP.NET Core Application
Priyanka - Practical differences between C# vs Vb.Net
Michał Białecki - Loop alignment in .NET 6
Kunal Pathak - 4 Features Every Developer Must Know in C# 9.0
Prasanth R - Using Tuples in C# to Initialize Properties in the Constructor and to Deconstruct Your Object
Thomas Claudius Huber

Como probablemente ya sabréis, NDepend es una de esas herramientas que están ahí de siempre, ayudando a desarrolladores y arquitectos a mejorar la calidad de nuestro software gracias a sus potentes y flexibles herramientas de análisis de proyectos.
Hace tiempo ya echamos por aquí un vistazo, pero creo que es interesante darle otra vuelta y refrescar conocimientos.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: arquitectura, buenas prácticas, calidad, herramientas
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo detectar navegadores que no soportan Blazor WebAssembly
José María Aguilar - Cómo incluir scripts en la página desde vistas parciales ASP.NET Core MVC con DynamicSections
José María Aguilar
.NET Core / .NET
- Referencias anulables en C# 8.0 y posteriores (II): el operador ! & Referencias anulables en C# 8.0 y posteriores (III): aplicaciones del operador !
Octavio Hernandez - .NET News Roundup - Week of Mar 8th, 2021
Arthur Casals - Unit Testing 101: Write your first unit test in C# with MSTest
Matthew Jones - Exploring the async/await State Machine – Concrete Implementation
Vasil Kosturski - CompactExifLib: Access to EXIF Tags in JPEG Files
Hans-Peter Kalb - Fix me!
Stéphane Gay - Use C# to upload files to a GitHub repository
Dave A. Brock - HelpMate.Core 2.1.0 Released!
Vincent Maverick Durano - Real Time WinUI Dashboard with SignalR Backend
Sam Basu - Visual Basic 16.9 in .NET 5
Jonathan Allen - OpenTelemetry .NET reaches v1.0
Sourabh Shirhatti - C# 9 records as strongly-typed ids - Part 5: final bits and conclusion
Thomas Levesque - C# 10 — 3 Candidate Features That Could Make the Final Cut
Matthew MacDonald - Strings Contain Empty Strings
Steve Fenton - The .NET Stacks #41: Your monthly preview fix has arrived
Dave Brock - C# 2, 3 and 4 (Two Decades of C#: A Reference) • Ben Bowen's Blog
Ben Bowen