176 votes

Pourquoi utiliser String.Format?

Pourquoi quelqu'un utiliserait-il String.Format en C # et VB .NET, par opposition aux opérateurs de concaténation ( & en VB et + en C #)?

Quelle est la différence principale? Pourquoi tout le monde est-il si intéressé à utiliser String.Format ? Je suis très curieux.

410voto

Moo-Juice Points 22190

Je peux voir un certain nombre de raisons:

La lisibilité

string s = string.Format("Hey, {0} it is the {1}st day of {2}.  I feel {3}!", _name, _day, _month, _feeling);

vs:

string s = "Hey," + _name + " it is the " + _day + "st day of " + _month + ".  I feel " + feeling + "!";

Les Spécificateurs De Format (et cela inclut le fait que vous pouvez écrire des formateurs personnalisés)

string s = string.Format("Invoice number: {0:0000}", _invoiceNum);

vs:

string s = "Invoice Number = " + ("0000" + _invoiceNum).Substr(..... /*can't even be bothered to type it*/)

Modèle De Chaîne De Persistance

Que faire si je veux stocker la chaîne de modèles dans la base de données? Avec la mise en forme de chaîne:

_id         _translation
  1         Welcome {0} to {1}.  Today is {2}.
  2         You have {0} products in your basket.
  3         Thank-you for your order.  Your {0} will arrive in {1} working days.

vs:

_id         _translation
  1         Welcome
  2         to
  3         .  Today is
  4         . 
  5         You have
  6         products in your basket.
  7         Someone
  8         just shoot
  9         the developer.

92voto

doobop Points 1267

En plus d'être un peu plus facile à lire et l'ajout d'un peu plus d'opérateurs, il est également utile si votre application est internationalisée. Beaucoup de fois les variables sont des nombres ou des mots clés qui seront dans un ordre différent pour les différentes langues. Par l'aide de la Chaîne.Format, votre code peut rester inchangé tandis que les différentes chaînes d'aller dans les fichiers de ressources. Donc, le code est

String.Format(resource.GetString("MyResourceString"), str1, str2, str3);

Alors que vos chaînes de ressource à la fin

Anglais: "bla bla {0} bla bla {1} bla {2}"

Russe: "{0} laissez laissez laissez {2} laissez {1}"

Où les russes peuvent avoir des règles différentes sur la façon dont les choses sont résolus si l'ordre est différent ou de la structure de la phrase est différente.

27voto

Jason Points 125291

Tout d'abord, je trouve

string s = String.Format(
    "Your order {0} will be delivered on {1:yyyy-MM-dd}. Your total cost is {2:C}.",
    orderNumber,
    orderDeliveryDate,
    orderCost
);

beaucoup plus facile à lire, à écrire et à entretenir que les

string s = "Your order " +
           orderNumber.ToString() +
           " will be delivered on " +
           orderDeliveryDate.ToString("yyyy-MM-dd") +
           "." +
           "Your total cost is " +
           orderCost.ToString("C") + 
           ".";

Regardez comment beaucoup plus facile à gérer ce qui suit est

string s = String.Format(
    "Year = {0:yyyy}, Month = {0:MM}, Day = {0:dd}",
    date
);

sur le alternative où vous auriez à répéter date trois fois.

Deuxièmement, les spécificateurs de format que String.Format offre vous donne une grande flexibilité sur la sortie de la chaîne de caractères dans une manière qui est plus facile à lire, à écrire et à maintenir que la simple utilisation de vieux concaténation. En outre, il est plus facile d'obtenir de la culture préoccupations droit avec String.Format.

Troisièmement, lorsque la performance n'est pas anodin, String.Format sera mieux que la concaténation. Derrière les coulisses, il utilise un StringBuilder et évite le Schlemiel le Peintre problème.

17voto

Joel Coehoorn Points 190579

Plusieurs raisons:

  1. Chaîne de caractères.Format() est très puissant. Vous pouvez utiliser le format de fournisseurs et de simples indicateurs de format (comme à largeur fixe) à droite dans la chaîne de format.
  2. Vous pouvez faire des choses puissantes en mettant les chaînes de format des fichiers de configuration.
  3. Chaîne de caractères.Format() est souvent plus rapide, car il utilise un StringBuilder et l'efficacité de l'état de la machine, derrière les coulisses, alors que la concaténation de chaîne .Net est relativement lente. C'est d'autant plus vrai que la taille de la chaîne et le nombre de valeurs substituées augmente.
  4. Chaîne de caractères.Format() est plus familier à de nombreux programmeurs, en particulier ceux qui viennent d'un milieu qui utilise une variante de l'ancien C printf() fonction.

Enfin, ne pas oublier StringBuilder.AppendFormat(). Chaîne de caractères.Format() utilise cette méthode derrière les scènes, et passe à l'objet StringBuilder directement, peut vous donnent une approche hybride: utiliser de manière explicite .Append() (analogue à la concaténation) pour certaines parties d'une chaîne de grande taille, et de les utiliser .AppendFormat() dans d'autres.

5voto

Reed Copsey Points 315315

Chaîne de caractères.Format ajoute de nombreuses options en plus des opérateurs de concaténation, y compris la possibilité de spécifier le format spécifique de chaque élément ajouté dans la chaîne.

Pour plus de détails sur ce qui est possible, je vous recommande la lecture de l'article sur MSDN intitulé Composite de mise en forme. Il explique l'avantage de la Chaîne.Format (ainsi que xxx.WriteLine et d'autres méthodes qui prennent en charge composite de mise en forme) au cours normal des opérateurs de concaténation.

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