В C # в чем разница между ToUpper () и ToUpperInvariant ()?

В C #, в чем разница между ToUpper () и ToUpperInvariant () ?

Можете ли вы дать пример, где результаты могут отличаться?

122
задан Nelson Reis 3 June 2016 в 15:16
поделиться

5 ответов

ToUpper использует текущий язык и региональные параметры. ToUpperInvariant использует инвариантный язык и региональные параметры.

Канонический пример - Турция, где верхний регистр «i» не является «I».

Пример кода, показывающий разницу:

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);
    }
}

Подробнее о турецком см. В этом сообщении в блоге Turkey Test .

Я не удивлюсь, если узнаю, что существуют различные другие проблемы с заглавными буквами вокруг пропущенных символов и т. Д. Это всего лишь один пример, который я знаю с головы до ног ... отчасти потому, что он укусил меня много лет назад на Java, где Я брал строку в верхний регистр и сравнивал ее с «ПОЧТОЙ». В Турции это не сработало ...

143
ответ дан 24 November 2019 в 01:25
поделиться

Начните с MSDN

http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx

Метод ToUpperInvariant является эквивалентен ToUpper(CultureInfo.InvariantCulture)

То, что заглавная i является 'I' в английском языке, не всегда делает ее таковой.

15
ответ дан 24 November 2019 в 01:25
поделиться

ToUpperInvariant использует правила из инвариантной культуры

3
ответ дан 24 November 2019 в 01:25
поделиться

в английском языке нет разницы. только в турецкой культуре можно найти разницу.

2
ответ дан 24 November 2019 в 01:25
поделиться

Ответ Джона идеален. Я просто хотел добавить, что ToUpperInvariant — это то же самое, что и вызов ToUpper(CultureInfo.InvariantCulture).

Это немного упрощает пример Джона:

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 }, 
            }
        });
    }
}

Я также использовал New Times Roman, потому что это более крутой шрифт.

Я также установил свойство Form Font вместо двух элементов управления Label, поскольку свойство Font наследуется.

И еще несколько строк я сократил только потому, что мне нравится компактный (пример, а не производственный) код.

В данный момент мне действительно нечем было заняться.

27
ответ дан 24 November 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: