En C #, quelle est la différence entre ToUpper()
et ToUpperInvariant()
?
Pouvez-vous donner un exemple où les résultats pourraient être différents?
En C #, quelle est la différence entre ToUpper()
et ToUpperInvariant()
?
Pouvez-vous donner un exemple où les résultats pourraient être différents?
ToUpper
utilise la culture actuelle. ToUpperInvariant
utilise l'invariant de la culture.
L'exemple canonique est celui de la Turquie, où la majuscule de "je" n'est pas "je".
Exemple de code montrant la différence:
using System;
using System.Drawing;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;
public class Test
{
[STAThread]
static void Main()
{
string invariant = "iii".ToUpperInvariant();
CultureInfo turkey = new CultureInfo("tr-TR");
Thread.CurrentThread.CurrentCulture = turkey;
string cultured = "iii".ToUpper();
Font bigFont = new Font("Arial", 40);
Form f = new Form {
Controls = {
new Label { Text = invariant, Location = new Point(20, 20),
Font = bigFont, AutoSize = true},
new Label { Text = cultured, Location = new Point(20, 100),
Font = bigFont, AutoSize = true }
}
};
Application.Run(f);
}
}
Pour en savoir plus sur le turc, voir ce la Turquie Test post de blog.
Je ne serais pas surpris d'entendre qu'il y a de divers autres problèmes de casse autour de élidés personnages ... C'est juste un exemple que je connais sur le dessus de ma tête... en partie parce qu'il m'a mordu il y a des années en Java, où j'étais partie supérieure du corps d'une chaîne, et de le comparer avec "MAIL". Qui ne fonctionne pas si bien en Turquie...
Jon réponse est parfait. Je voulais juste ajouter que ToUpperInvariant
est le même que l'appel à la ToUpper(CultureInfo.InvariantCulture)
.
Qui fait de Jon exemple un peu plus simple:
using System;
using System.Drawing;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;
public class Test
{
[STAThread]
static void Main()
{
string invariant = "iii".ToUpper(CultureInfo.InvariantCulture);
string cultured = "iii".ToUpper(new CultureInfo("tr-TR"));
Application.Run(new Form {
Font = new Font("Times New Roman", 40),
Controls = {
new Label { Text = invariant, Location = new Point(20, 20), AutoSize = true },
new Label { Text = cultured, Location = new Point(20, 100), AutoSize = true },
}
});
}
}
J'ai aussi utilisé New Times Roman parce que c'est un refroidisseur de police.
J'ai aussi mis l' Form
s' Font
de la propriété au lieu de les deux Label
des contrôles parce que l' Font
de la propriété est héréditaire.
Et j'ai ramené quelques autres lignes juste parce que j'aime compact (exemple, pas de production) du code.
Je n'avais vraiment rien de mieux à faire pour le moment.
Commencez avec MSDN
http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx
La méthode ToUpperInvariant est équivalente à ToUpper (CultureInfo.InvariantCulture).
Tout simplement parce que i le capital est « je » en anglais, ne fait pas toujours ainsi.
http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx
La documentation de Microsoft explique les différences et donne des exemples de résultats différents.
ToUpperInvariant utilise les règles de la culture invariante
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.