Ya tenemos disponibles las primeras novedades que incluirá C# 12 en el lanzamiento de .NET 8. A continuación revisamos algunas de ellas.

Puedes encontrar el código fuente de los ejemplos en repositorio: https://github.com/fjvela/csharp-12

Primary constructors for classes and structs

Los Primary constructors nos permiten definir una lista de parámetros en la definición de la clase, en lugar de tener que crear un constructor por separado. De esta manera, se puede definir una clase en una sola línea de código.

En C# 9 permitió la utilización de Primary constructors para las estructuras de datos record. C# 12 extiende esta funcionalidad a todas las clases, permitiendonos definir constructures de manera más concisa a tráves de Primary constructors.

Definición Primary constructors en clases

    public abstract class Figure(double x, double y)
    {
        public double X { get; } = x;
        public double Y { get; } = y;
    }

    public class Rectangle(double x, double y, double width, double height) : Figure(x, y)
    {
        public double Width { get; } = width;
        public double Height { get; } = height;
    }

    public class Circle(double x, double y, double radius) : Figure(x, y)
    {
        public double Radius { get; } = radius;
    }

Resultado binario decompilado, Primary constructors -Rectangle Resultado binario decompilado, Primary constructors -Rectangle Resultado binario decompilado, Primary constructors -Rectangle

Using directives for additional types

Actualmente la directiva using no nos permite crear alias para cualquier tipo de dato como por ejemplo: tuplas o arrays. Con C# 12 podemos crear alias para cualquier tipo como (string, int) o int[];.

Definición alias para cualquier tipo de datos

    using Address = (string city, string postalCode);
    using PathOfPoints = int[];
    using DatabaseInt = int?;
    using Measurement = (string units, int distance);

    using Person = (string name, int age);

    void Method(Measurement x) 
    {
        Console.WriteLine($"Method! {x.units} {x.distance} ");
    }


    Console.WriteLine("Hello, human!");

    Person person = new Person("Javier", 22);
    Address address = new Address("My home", "ES-50105");
    PathOfPoints points = new int[] { 2, 5, 5 };

    Method(new Measurement("meters", 23));

Resultado binario decompilado, Using directives for additional types

Default values for lambda expressions

C# 12 incluye nuevas mejoras en la utilización de expresiones lambda. Con C# 12 podemos definir valores por defecto en los parámetros de las expresiones lambda.

Definición valores por defecto

    var  sum = (int x = 0, int y = 0) => x + y;
    Console.WriteLine(sum()); // Output: 0
    Console.WriteLine(sum(1)); // Output: 1
    Console.WriteLine(sum(1, 2)); // Output: 3


    var greet = (string name = "World", int times = 1) =>
    {
        string greeting = $"Hello, {name}!";
        if (times > 1)
        {
            greeting += $" ({times} times)";
        }
        return greeting;
    };
    Console.WriteLine(greet()); // Output: Hello, World!
    Console.WriteLine(greet("Alice")); // Output: Hello, Alice!
    Console.WriteLine(greet("Bob", 3)); // Output: Hello, Bob! (3 times)

Resultado binario decompilado, Default values for lambda expressions

Referencias