142 votes

En C #, quelle est la différence entre ToUpper () et ToUpperInvariant ()?

En C #, quelle est la différence entre ToUpper() et ToUpperInvariant() ?

Pouvez-vous donner un exemple où les résultats pourraient être différents?

167voto

Jon Skeet Points 692016

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...

28voto

Tergiver Points 8636

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' Forms' 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.

16voto

CaffGeek Points 10925

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.

3voto

KrisTrip Points 1435

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.

3voto

taylonr Points 7195

ToUpperInvariant utilise les règles de la culture invariante

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