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 Réponses :
Je lancerais un InvalidOperationException . La définition MSDN est la suivante: p>
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. P> blockQuote>
Cependant, strong>, 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>
Jon Skeet accepte. Je suis vendu. (Voir: Stackoverflow.com/questions/1903105/... ).
Spot sur alors, merveilleux!
Vous pouvez lancer notinitializedException code>. p>
Dans quel espace de noms est notinitializedException?
En utilisant Si la dépendance est vraiment requise, vous devez refroidir à 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
}
}
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 i> la chance harcelante que je vais avoir une exception de typeInitialisationFaillation, ce qui pourrait masquer le problème réel. Mais je am i> Un fan d'échec rapide, j'ai donc corrigé mon code avec votre guidage à l'esprit.
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é.