string emptyString = string.Empty;
char[] emptyStringCharArr = emptyString.ToCharArray();
Это даст вам пустой массив символов.
Это потому, что String уже является массивом символов в памяти, а String.Empty не имеет значения.
Чтобы разбить его дальше, рассмотрим реализацию .ToCharArray ()
private Char[] toCharArray(String value)
{
var stringLength = value.Length;
var returningArray = new char[stringLength];
for(var i = 0; i < stringLength; i++)
{
returningArray[i] = value[i];
}
return returningArray;
}
Длина, конечно, будет равна нулю, и вы вернете пустой массив символов. Конечно, это не точная реализация, но вы можете видеть, как и почему она ничего не возвращает (и, следовательно, не разделяется на строку, как вы ожидаете)
Это не массив с единственным элементом String.Empty, потому что это не имеет смысла. Когда вы пытаетесь разделить пустой массив, он не знает, как и на что разделить, поэтому вы возвращаете исходную строку.
Что касается того, почему он возвращает 0 по умолчанию, рассмотрим:
private int IndexOf(String value, String searchFor)
{
for(var i = 0; i < value.Length; i++)
{
if(value.Substring(i, searchFor.Length) == searchFor)
{
return i;
}
}
return -1;
}
private int LastIndexOf(String value, String searchFor)
{
var searchLength = searchFor.Length;
for(var i = value.Length - searchFor.Length; i >= 0; i--)
{
if(value.Substring(i, searchLength) == searchFor)
return i;
}
return -1;
}
String.SubString (x, 0) ВСЕГДА возвращает String.Empty, независимо от того, что было передано (даже String.Empty). По этой причине гораздо быстрее добавить проверку и вернуть 0 независимо (как это было бы, даже если бы он выполнял цикл).