string name = "HECHT, WILLIAM";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name.ToLower());
(обратите внимание, что он работает только с нижнего регистра, отсюда начинается нижний регистр)
Это потому, что разыменование всегда происходит, когда имя недоступно. Значение загружается в стек операндов, а затем передается одному из кодов операций JRE, который разыменовывает его. Однако у стека операндов нет имени, которое можно было бы связать с нулевым значением. Все, что у него есть, это «ноль». С помощью некоторого умного кода отслеживания времени выполнения можно получить имя, но это добавит накладных расходов с ограниченным значением.
Из-за этого нет опции JRE, которая включала бы дополнительную информацию для исключений нулевого указателя.
В этом примере ссылка сохраняется в локальном слоте 1, который отображается на имя локальной переменной. Но разыменование происходит в инструкции invokevirtual, которая видит в стеке только «нулевое» значение, а затем выдает исключение:
public static string CamelCase(this string s)
{
if (String.IsNullOrEmpty(s))
s = "";
string phrase = "";
string[] words = s.Split(' ');
foreach (string word in words)
{
if (word.Length > 1)
phrase += word.Substring(0, 1).ToUpper() + word.Substring(1).ToLower() + " ";
else
phrase += word.ToUpper() + " ";
}
return phrase.Trim();
}
Я проголосовал за ответ Марка, но это тоже сработает:
string s = Microsoft.VisualBasic.Strings.StrConv("HECHT, WILLIAM", VbStrConv.ProperCase,0);
Вам нужно будет добавить соответствующие ссылки, но я почти уверен, что он работает со всеми верхними входами.