2009-05-18 14 views
0

Je suis assez nouveau pour C# et essayer de comprendre les insertions de chaîne (c.-à-"some {0} string", toInsert) et couru à travers un problème que je ne m'y attendais pas ...C# insertions de chaînes confondues avec des paramètres facultatifs

Dans le cas où vous avez deux constructeurs:

public MyClass(String arg1) { ... } 

public MyClass(String arg1, String arg2) { ... } 

Est-il possible pour moi d'utiliser le premier constructeur avec une insertion de chaîne?

... 
toInsert = "def" 
myClass = new MyClass("abc{0}ghi", toInsert) 
... 

Ou va C# interpréter cela comme le deuxième constructeur et passer un "abc{0}ghi" littéral comme premier argument?

Répondre

9

Oui, cela sera interprété comme un second paramètre. Le comportement que vous décrivez est appelé formatage de chaîne et tout ce qui accepte les chaînes dans ce style utilise string.Format() en arrière-plan. Voir la documentation de cette méthode pour plus de détails.

Pour obtenir le comportement souhaité, utilisez ce code:

myClass = new MyClass(string.Format("abc{0}ghi", toInsert)); 
+0

En fait, String.Format() appelle à StringBuilder.AppendFormat() –

+0

Alors, devrais-je toujours envelopper mon formatage dans string.Format() pour éviter les bugs sur la route où les classes avec un constructeur en obtenir un nouveau? – tgray

+0

Non, c'est une conclusion injustifiée. new MyClass (A) appelle le ctor qui accepte un param, et new MyClass (A, B) appelle le ctor qui accepte 2 params, indépendamment de ce que vous substituez à A et B. Vous avez remplacé "abc {0} ghi" par A Cela ne change rien au fait que vous avez passé 2 params. – Cheeso

5

Il suffit de faire:

public MyClass(string format, params object[] args) 
{ 
    this.FormattedValue = string.Format(format, args); 
} 
2

Ou va C# interpréter cela comme le deuxième constructeur et passer un littéral « abc {0} ghi "comme premier argument?

C'est la bonne réponse. Je pense que si vous utilisez String.Format ("abc {0} ghi", toInsert), il prendra le premier constructeur