Con el lanzamiento de .Net 5, no solamente trajo la unificación de los marcos de trabajo, si no también, nos trajo una nueva versión de C#, en este caso la 9.0. Microsoft tiene el foco mejorar el lenguaje continuamente para fortalecer la experiencia de los desarrolladores al crear sus aplicaciones en C#.
Las características más destacables en esta versión y que más notoriedad tienen son las siguientes:
- Init-only setters
- Records
- Top-Level statements
- Pattern matching
Init-only setters
Antes de esta versión , las instancias de los objetos con datos inmutables teníamos que hacerlo en el constructor pasando valores como parámetros. Ahora, se ha simplificado el uso de la sintaxis init. Podemos inicializar los datos inmutables durante la creación de objetos, lo que nos permite como desarrolladores crear propiedades inmutables. Veamos un ejemplo:
Forma Clásica:
class Customers { public int CustomerId { get; } public string CustomerName { get; set; } public Customers(int customerId) { CustomerId = customerId; } static void Main(string[] args) { var customers = new Customers(1045) { CustomerName = "Tyson" }; //customerid cannot be set as the property is immutable. customers.CustomerId = 1099; } }
La nueva forma
class Customers { public int CustomerId { get; init; } public string CustomerName { get; set; } static void Main(string[] args) { var customers = new Customers() { CustomerId = 1045, CustomerName = "Tyson" }; //customerid cannot be set as the property is immutable. customers.CustomerId = 1099; } }
Records
Esta nueva característica ha sido bastante polémica en la comunidad. Records nos permiten manejar un objeto como un valor en lugar de una colección de propiedades. Como los registros tratan principalmente con estados inmutables, son flexibles y también se utilizan mejor para datos, en lugar de funcionalidades.
Veamos en el siguiente ejemplo como en una expresión with podemos crear un nuevo registro que hereda valores de otro registro.
class SalesOrder { public int OrderId { get; init; } public string ProductName { get; init; } public int Quantity { get; init; } static void Main(string[] args) { SalesOrder order = new SalesOrder { OrderId = 1, ProductName = "Mobile", Quantity = 2 }; //now we need to change "ProductName" SalesOrder newOrder = new SalesOrder { OrderId = order.OrderId, ProductName = "Laptop", Quantity = order.Quantity }; } }
Usando records lo haremos de la siguiente manera:
public record SalesOrder { public int OrderId { get; init; } public string ProductName { get; init; } public int Quantity { get; init; } static void Main(string[] args) { SalesOrder order = new SalesOrder { OrderId = 1, ProductName = "Mobile", Quantity = 2 }; //using with expression SalesOrder newOrder = order with { ProductName = "Laptop" }; } }
Top-Level statements
Esta característica nos ayudará a los desarrolladores a excluir el código no deseado de un programa.Top-Level statements pueden reemplazar todo el código repetitivo (código repetido) con una sola línea. Veamos un ejemplo:
using System; namespace TopLevel { class Program { static void Main(string[] args) { Console.WriteLine("Welcome to Withoutdebugger.com!"); } } }
Usando la nueva característica
using System; Console.WriteLine("Welcome to Withoutdebugger.com!");
Para ser más exacto:
System.Console.WriteLine("Welcome to Withoutdebugger.com!");
Pattern matching
Si bien esta característica no es nueva, fue incorporada en la versión 7.0 de C#, nos ayuda a extraer información de un valor. C # 9.0 contiene muchos patrones nuevos, pero aquí vamos a ver los patrones lógicos y relacionales.
Debemos tener en cuenta, los patrones relacionales funcionan con los siguiente operadores como <, <=, > y >=. Los patrones lógicos funcionan con los operadores lógicos como and, or y not.
Veamos el ejemplo:
public class SalesOrder { public int OrderId { get; set; } public string ProductName { get; set; } public int Quantity { get; set; } public int TotalCost { get; set; } public double GetTotalCost() => TotalCost switch { 500 or 600 => 10, < 1000 => 10 * 1.5, <= 10000 => 10 * 3, _ => 10 * 5 }; } class CSharpFeatures { static void Main(string[] args) { SalesOrder newOrderforCustomer1 = new SalesOrder() { OrderId = 1, ProductName = "Camera", Quantity = 1, TotalCost = 5000 }; newOrderforCustomer1.GetTotalCost(); SalesOrder newOrderforCustomer2 = new SalesOrder() { OrderId = 2, ProductName = "Pen", Quantity = 1, TotalCost = 500 }; newOrderforCustomer2.GetTotalCost(); } }
Conclusión
Con estas nuevas características, podremos trabajar fácilmente con datos (registros), código de forma (coincidencia de patrones) y reducir código (declaraciones de nivel superior). Si quieres más información más información sobre las nuevas funciones de la versión oficial de C # 9.0, puede consultar la documentación .