В C #, в чем разница между ToUpper ()
и ToUpperInvariant ()
?
Можете ли вы дать пример, где результаты могут отличаться?
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, где Я брал строку в верхний регистр и сравнивал ее с «ПОЧТОЙ». В Турции это не сработало ...
Начните с MSDN
http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx
Метод ToUpperInvariant является эквивалентен ToUpper(CultureInfo.InvariantCulture)
То, что заглавная i является 'I' в английском языке, не всегда делает ее таковой.
ToUpperInvariant использует правила из инвариантной культуры
в английском языке нет разницы. только в турецкой культуре можно найти разницу.
Ответ Джона идеален. Я просто хотел добавить, что 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
наследуется.
И еще несколько строк я сократил только потому, что мне нравится компактный (пример, а не производственный) код.
В данный момент мне действительно нечем было заняться.