7
votes

.NET: Quelle exception à lancer lorsque la propriété requise n'est pas définie?

suppose que j'ai une classe comme celle-ci:

var formatter = new HtmlCodeFormatter()
    {
        Parser = new CSharpParser();
        Formatter = new HtmlCodeFormatter();
    };
formatter.Format("Console.WriteLine(\"Hello, world!\"));


3 commentaires

Pourquoi ne les passez-vous pas dans le constructeur? Y a-t-il de nombreuses propriétés qui les transmettent au constructeur devient difficile à lire?


@Codeinchaos: bonne question. C'est une question de goût dans ce cas. Personnellement, je trouve des initialisateurs d'objets d'être beaucoup plus lisibles.


Les paramètres nommés en C # 4 peuvent ajouter beaucoup à la lisibilité.


3 Réponses :


14
votes

Je lancerais un InvalidOperationException . La définition MSDN est la suivante:

L'exception qui est lancée quand un L'appel de la méthode n'est pas valide pour le état actuel de l'objet.

Cependant, , je recommande d'utiliser l'injection de constructeur au lieu de l'injection de réglage. Cela garantit que vous disposez d'analyseurs et de formateurs valides. Si NULL est transmis dans le constructeur, lancez un argumentNullexception . < / p>


2 commentaires

Jon Skeet accepte. Je suis vendu. (Voir: Stackoverflow.com/questions/1903105/... ).


Spot sur alors, merveilleux!



1
votes

Vous pouvez lancer notinitializedException .


1 commentaires

Dans quel espace de noms est notinitializedException?



7
votes

En utilisant Injection de propanie forte> Vous racontez implicitement le compilateur, les collègues développeurs ainsi que les conteneurs DI que la dépendance est facultative forte>. C'est parce que personne ne vous oblige à attribuer une valeur de propriété forte>.

Si la dépendance est vraiment requise, vous devez refroidir à injection de constructeur forte>. Cela rendra efficacement la dépendance requise: p>

public class Foo
{
    private readonly Bar bar;

    public Foo(Bar bar)
    {
        if (bar == null)
        {
            throw new ArgumentNullException("bar");
        }

        this.bar = bar;
    }

    public Bar RequiredProperty
    {
        get { return this.bar; }
    }

    public void Baz()
    {
        // this.bar is now GUARANTEED to be initialized,
        // so no checks are required
    }
}


3 commentaires

Je peux certainement voir votre point, mais j'ai eu l'impression que c'est une très mauvaise idée ™ de jeter des exceptions dans un constructeur et qu'il devait être évité à tout prix ™.


Pas du tout. Le principe est appelé échec rapide. D'où tiens-tu cette idée?


Vous savez, je ne sais pas vraiment. Il est est la chance harcelante que je vais avoir une exception de typeInitialisationFaillation, ce qui pourrait masquer le problème réel. Mais je am Un fan d'échec rapide, j'ai donc corrigé mon code avec votre guidage à l'esprit.