62 votes

Existe-t-il un moyen de renvoyer des valeurs pouvant être nulles?

Comment puis-je écrire un raccourci du scénario suivant?

 get
{
    if (_rows == null)
    {
        _rows = new List<Row>();
    }

    return _rows;
}
 

81voto

user3185569 Points 22924

Utilisation de l'opérateur de coalescence nulle (??):

 get 
{ 
     _rows = _rows ?? new List<Row>(); 
     return _rows; 
}
 

OU (moins lisible):

 get { return _rows ?? (_rows = new List<Row>()); }
 

Le ?? opérateur est appelé l'opérateur null-coalescing. Il retourne l'opérande de gauche si l'opérande n'est pas nul; sinon, il retourne l'opérande de droite.

41voto

Roman Reiner Points 153

Il s’agit du modèle d’initialisation paresseux. La méthode la plus simple consiste à utiliser la classe Lazy <T> .

 class Foo
{
    Lazy<List<Row>> _rows;

    public Foo()
    {
        _rows = new Lazy(() => new List<Row>());
    }

    public List<Row> Rows
    {
        get { return _rows.Value; }
    }
}
 

Cela a l’avantage supplémentaire de ne pas "polluer" le getter avec la logique d’initialisation.

20voto

Dmitry Bychenko Points 17719

Je suggère l'opérateur ternaire

 get {
  return _rows == null ? _rows = new List<Row>() : _rows;
}
 

Ou puisque les valeurs List<Row> vides n'entraînent pas beaucoup de charge supplémentaire, pourquoi ne pas supprimer le champ _row explicite et mettre en œuvre une propriété en lecture seule (syntaxe C # 6.0 ):

 public IList<Row> Rows {get;} = new List<Row>();
 

18voto

jpmc26 Points 3364

Voici une meilleure idée: Prévenir _rows d'être null.

Faites votre constructeur initialise la variable:

public MyClass()
{
    this._rows = new List<Row>();
}

et puis, votre propriété est à seulement

get
{
    return this._rows;
}

Assurez-vous que si vous avez besoin de "vider" la variable, vous pouvez toujours appeler sa Clear méthode ou attribuer une nouvelle liste vide au lieu d'attribuer null. Peut-être encoder cette opération dans une méthode si vous avez vraiment besoin de la rendre claire et cohérente dans l'ensemble de la classe.

C'est beaucoup plus logique. Si votre variable ne doit jamais être null, il ne devrait jamais être null. Il a également soigneusement évite à la fois la condition et la question d'avoir un getter modifier l'état.

12voto

Sinatr Points 2499
List<Row> _rows;
public List<Row> Rows => _rows ?? (_rows = new List<Row>());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X