Ответ 1
Совершенно верно. В MSDN (http://msdn.microsoft.com/en-us/library/d93tkzah.aspx),
Этот метод выполняет слово (чувствительный к регистру и чувствительный к культуре). поиск с использованием текущей культуры.
Таким образом, вы можете получить разные результаты, если вы запускаете его под другой культурой (через региональные и языковые настройки на панели управления).
В этом конкретном случае у вас, вероятно, не будет проблемы, но введите i
в строке поиска и запустите его в Турции, и это, вероятно, испортит вам день.
См. MSDN: http://msdn.microsoft.com/en-us/library/ms973919.aspx
Эти новые рекомендации и API существуют для устранения ошибочных предположений о поведении стандартных API-интерфейсов по умолчанию. Канонический пример ошибок, возникающих там, где нелингвистические строковые данные интерпретируется лингвистически как проблема "турецкого-I".
Для почти всех латинских алфавитов, в том числе английского языка, характер я (\ u0069) является строчной версией символа я (\ u0049). Эта правило обкатки быстро становится стандартным для тех, кто программирует в такой культуры. Однако на турецком ( "tr-TR" ) существует капитал "i с точкой", символ (\ u0130), который является капитальной версией я. Точно так же на турецком языке есть строчный "я без точки" или (\ u0131), который капитализирует на I. Это поведение происходит на азербайджанском культуры ( "az" ).
Поэтому предположения, обычно сделанные об капитализировании я или нижняя шкала Я недействительна среди всех культур. Если значение по умолчанию используются перегрузки для процедур сравнения строк, они будут при условии различия между культурами. Для нелингвистических данных, как в в следующем примере это может привести к нежелательным результатам:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
Console.WriteLine("Culture = {0}",
Thread.CurrentThread.CurrentCulture.DisplayName);
Console.WriteLine("(file == FILE) = {0}",
(String.Compare("file", "FILE", true) == 0));
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
Console.WriteLine("Culture = {0}",
Thread.CurrentThread.CurrentCulture.DisplayName);
Console.WriteLine("(file == FILE) = {0}",
(String.Compare("file", "FILE", true) == 0));
Из-за разницы в сравнении я результаты сравнения изменяются при изменении культуры потока. Это Выход:
Culture = English (United States)
(file == FILE) = True
Culture = Turkish (Turkey)
(file == FILE) = False
Вот пример без случая:
var s1 = "é"; //é as one character (ALT+0233)
var s2 = "é"; //'e', plus combining acute accent U+301 (two characters)
Console.WriteLine(s1.IndexOf(s2, StringComparison.Ordinal)); //-1
Console.WriteLine(s1.IndexOf(s2, StringComparison.InvariantCulture)); //0
Console.WriteLine(s1.IndexOf(s2, StringComparison.CurrentCulture)); //0