Mis indispensables de C#. Parte 1

Esta es una serie de 3 artículos cortos sobre características de C# que uso en todas mis aplicaciones... aunque este en particular empieza con una nueva.

Switch expressions


Las switch expressions son mi característica favorita de C# 8. Ayudan a asignar valores rápidamente y las uso mucho para renderizar la interfaz gráfica.

Supongamos una Partial View que muestra el nombre de una empresa, consultor o institución, y un botón de color distinto para cada caso.

@model MyViewModel

@{
    var (title, color) = Model.RoleType switch
    {
        RoleType.Company => ("Empresa", "info"),
        RoleType.Institution => ("Institución", "primary"),
        RoleType.Mentor => ("Consultor", "warning"),
        _ => ("?", "danger")
    };
}

<h3>
    @Model.Name
</h3>

<button class="btn btn-@color">
    @title
</button>

También funciona con métodos, si no tenemos una partial para cada item.

@model MenuViewModel

@{
    string GetLinkIcon (string linkPage) => linkPage switch
    {
        MenuViewModel.PageIndex => "fe fe-home",
        MenuViewModel.PageTools => "fe fe-box",
        MenuViewModel.PagePrograms => "fe fe-arrow-up-right",
        MenuViewModel.PageConnections => "fe fe-users",
        MenuViewModel.PageRequests => "fe fe-bell",
        _ => ""
    };

    string GetLinkCls (string linkPage) => linkPage == Model.Current ? "active" : "";
}

<ul class="nav flex-column d-none d-md-block">
    @foreach (var p in Model.Pages)
    {
        <li class="nav-item @GetLinkCls(p)">
            <a class="nav-link" asp-action="@p">
                <span class="@GetLinkIcon(p)"></span>
            </a>
        </li>
    }
</ul>

Propiedades de sólo lectura


Nos acostumbramos tanto a las propiedades con get y set públicos, que las escribimos de forma automática y se nos olvida que las clases son el primer filtro para evitar errores en capas inferiores.

Podemos usar un set privado si la propiedad es de sólo lectura.

public string Name { get; private set; }

Pero yo prefiero quitar el set para que se asigne únicamente desde el constructor y forzar la regla de negocio.

public string Name { get; }

public MyClass(string name)
{
    Name = name;
}

Comentarios

Entradas más populares de este blog

Ampliar el sistema de archivos de una máquina virtual Ubuntu

Adviento C# 2020: Diario de ASP.NET

C#: Registrar las dependencias de un módulo usando extensiones