La fonctionnalité Record pourrait arriver dans C# 8.x

Par:
fredericmazue

mar, 05/03/2019 - 15:12

Ceci selon un billet publié sur Developers Anonymous. La fonctionnalité Record est un sucre syntaxique pour les classes POCO.

Une classe POCO, pour Plain Old CLR Object, est une classe tout ce qu'il y a de rudimentaire. Une telle classe encapsule des propriétés accessibles uniquement en lecture via des accesseurs (getters) et elle ne comporte pas de logique métier. Déclarer et écrire le code d'une telle classe est juste fastidieux. C'est la que la fonctionnalité Record intervient :-) Avec elle, le code d'une telle classe est réduit à à sa plus simple expression : juste une déclaration.

public class Person(string Name, string Surname, string Address, DateTime DateOfBirth);

C'est alors le compilateur qui va générer pour nous toute la plomberie sans aucun intérêt :

public class Person: IEquatable<Person>
{
    public string Name { get; }
    public string Surname { get; }
    public string Address { get; }
    public DateTime DateOfBirth { get; }
 
   public Person(string Name, string Surname, string Address, DateTime DateOfBirth)
    {
        this.Name = Name;
        this.Surname = Surname;
        this.Address = Address;
        this.DateOfBirth = DateOfBirth;
    }
 
   public bool Equals(Person other)
    {
        return Equals(Name, other.Name) && Equals(Surname, other.Surname) && Equals(Address, other.Address) && Equals(DateOfBirth, other.DateOfBirth);
    }
 
   public override bool Equals(object other)
    {
        return (other as Person)?.Equals(this) == true;
    }
 
   public override int GetHashCode()
    {
        return (Name.GetHashCode() * 17 + Surname.GetHashCode() + Address.GetHashCode() + DateOfBirth.GetHashCode());
    }
 
   public void Deconstruct(out string Name, out string Surname, out string Address, out DateTime DateOfBirth)
    {
        Name = this.Name;
        Surname = this.Surname;
        Address = this.Address;
        DateOfBirth = this.DateOfBirth;
    }
 
   public Person With(string Name = this.Name, string Surname = this.Surname, string Address = this.Address, DateTime DateOfBirth = this.DateOfBirth) => new Person(Name, Surname, Address, DateOfBirth);
}

Nous avons alors une classe qui implémente l'interface IEquatable et qui est capable de fournir sa valeur hash (HashValue) et qui fournit un déconstructeur permettant de récupérer les champs dans un Tuple :

var (name, surname, address, dateOfBirth) = person;

A remarquer enfin la méthode With, qui est une nouveauté du langage C# 8.x permettant d'obtenir une nouvelle instance de la classe avec des propriétés modifiées :

var bornYesterday = person.With(DateOfBirth: DateTime.Now.AddDays(-1));

Commentaires

Qu'est-ce que ça veut dire cette remarque désagréable ? la source est donnée au début de l'article.