Метод .NET Substring таит в себе опасность. Я разработал методы расширения, которые обрабатывают широкий спектр сценариев. Приятно, что он сохраняет исходное поведение, но когда вы добавляете дополнительный «истинный» параметр, он затем обращается к методу расширения для обработки исключения и возвращает большинство логических значений, основанных на индексе и длине. Например, если длина отрицательна и считается в обратном направлении. Вы можете посмотреть результаты теста с различными значениями на скрипке по адресу: https://dotnetfiddle.net/m1mSH9 . Это даст вам четкое представление о том, как он разрешает подстроки.
Я всегда добавляю эти методы ко всем своим проектам, и мне никогда не нужно беспокоиться о взломе кода, потому что что-то изменилось и индекс недействителен. Ниже приведен код.
public static String Substring(this String val, int startIndex, bool handleIndexException)
{
if (!handleIndexException)
{ //handleIndexException is false so call the base method
return val.Substring(startIndex);
}
if (string.IsNullOrEmpty(val))
{
return val;
}
return val.Substring(startIndex < 0 ? 0 : startIndex > (val.Length - 1) ? val.Length : startIndex);
}
public static String Substring(this String val, int startIndex, int length, bool handleIndexException)
{
if (!handleIndexException)
{ //handleIndexException is false so call the base method
return val.Substring(startIndex, length);
}
if (string.IsNullOrEmpty(val))
{
return val;
}
int newfrom, newlth, instrlength = val.Length;
if (length < 0) //length is negative
{
newfrom = startIndex + length;
newlth = -1 * length;
}
else //length is positive
{
newfrom = startIndex;
newlth = length;
}
if (newfrom + newlth < 0 || newfrom > instrlength - 1)
{
return string.Empty;
}
if (newfrom < 0)
{
newlth = newfrom + newlth;
newfrom = 0;
}
return val.Substring(newfrom, Math.Min(newlth, instrlength - newfrom));
}
Я писал об этом в мае 2010 года по адресу: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html