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
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: enlaces
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.