J'ai un objet simple avec une propriété booléenne, quelque chose comme ceci:
Object obj;
if(obj != null) { obj.Prop = true; }
Je veux faire quelque chose comme ça:
public class Object
{
public bool Prop { get; set; }
}
mais en raison des règles stylecop, je ne peux pas avoir que si tout est sur une seule ligne, je dois le diviser sur plusieurs lignes et cela devient moins lisible pour moi. J'ai essayé obj?.Prop = true mais cela me donne un The left-hand side of an assignment cannot contain a null propagating operator erreur d' The left-hand side of an assignment cannot contain a null propagating operator , ce que je comprends. Un autre opérateur que je peux utiliser? Je ne suis pas vraiment expert en c # donc je ne suis pas sûr de celui que je devrais utiliser.
Voici un terrain de jeu rapide à utiliser pour tester si vous en avez besoin: https://ideone.com/LfjKFD
3 Réponses :
Vous ne pouvez pas le faire sans la déclaration if. À mon avis, la seule chose que vous pouvez faire est
if(obj != null) obj.Prop = true;
Dans ce cas, vous pouvez le faire en une seule ligne mais vous ne pouvez pas utiliser l'opérateur ternaire.
?. appelé aussi Elvis Operator n'est utile que pour accéder en toute sécurité à une propriété d'objet et non pour la définir.
Pour définir une propriété, vous devez vous assurer que l'objet est déjà initialisé et pour cela, le moyen le plus simple est de vérifier la valeur null en utilisant une instruction If
if(obj!=null) obj.Prop = someValue;
Je ne sais pas si, par votre question, vous essayez de le rendre plus simple et lisible que cela (pour moi, c'est le moyen le plus évident et le plus intuitif), mais vous pouvez utiliser une autre solution comme celle mentionnée dans cet article
C'est la seule façon de l'atteindre et vous n'avez besoin d'aucune ligne de code pour utiliser Prop. Bool Prop est false par défaut. Mais comme l'objet doit être créé avant d'assigner quoi que ce soit, nous pouvons utiliser un constructeur par défaut pour affecter Prop.
public class PlainObject
{
public bool Prop { get; set; }
public PlainObject()
{
Prop=true;
}
}
mais il n'a aucune utilité pratique puisque si vous essayez de vérifier plainObject.Prop et plainObject est nul, vous aurez déjà une erreur de compilation. L'objet est nul uniquement s'il n'est pas créé. Pourquoi ne pas vérifier si (plainObject == null) ou utiliser plainObject ?. Ce sera pareil. Vous n'avez besoin d'aucun drapeau supplémentaire.
obj = obj! = nul? obj.prop = true: null
s'il vous devient moins lisible, vous devrez peut-être en discuter avec votre équipe à ce sujet. Car à mon avis, votre version est moins lisible, et son débat vraiment basé sur l'opinion.
Pourquoi ne pas utiliser d' initialisation d'objet ici?