Ценность создания исключений здесь заключается в том, что вместо получения исключения с нулевой разыменовью вы получите исключение аргумента, которое наиболее важно сообщает вам недопустимый аргумент. Исключение также более явно указывает на причину, чем общее значение nure deref, которое может быть чем угодно.
Учитывая, что это метод расширения, который уже имеет один уровень косвенности, я думаю, что, вероятно, более полезно быть полным и включать исключения. Особенно с учетом того, что вы, очевидно, уже написали это, но даже в рамках политики. Если бы это не был метод расширения, я мог бы пойти в любую сторону. Я мог бы также использовать assert вместо этого в зависимости от того, как похоронен код.
В настоящее время я не знаю, но в .Net 1.1 и 1.0 Frameworks JIT-компилятор никогда не вставлял бы вызов, в который был брошен вызов. Чтобы избежать этого, часто подразумевается создание другого метода, который будет вызывать само исключение.
Кстати, у вас есть одна ошибка с startIndex + 1> value.Length; это должно быть> = вместо.