Это код, который вы найдете в .NET Framework. Это довольно важно, исходный код (был) не был доступен. Если проверка аргументов не была включена, вы получите исключение, которое трудно диагностировать. Он бомбит невидимый код, заключая, что аргумент был неверным, не совсем просто.
Это меньше касается кода, который вы пишете. Но не отсутствует, это зависит от того, кто будет конечным пользователем кода. Если это вы, и вы поддерживаете код, у вас не возникнет проблем с диагностикой причины. Если это кто-то другой, тогда становится важным, чтобы у них был свободный доступ к точной копии исходного кода. Если это вообще запутано, не стесняйтесь включить чек.
Еще одним соображением является то, что происходит при развертывании сборки Release вашего кода. Без оператора throw вполне вероятно, что этот конкретный код будет встроенным. Другими словами, вы не увидите метод GetItem () в верхней части стека. Это может затруднить поиск истинного источника исключения, особенно из-за того, что у трассировок стека выпуска нет номеров строк.
Тогда стоимость актуальна. В этом случае он достаточно низкий, может быть наносекунда или две, если свойство Count достаточно дешево. Но фактическая работа, проделанная этим методом, также очень дешева. Ваш тест делает его на 20% медленнее. Это метод, который вполне может жить глубоко на критическом пути программы. Чем больше метод делает, тем менее актуальным становится дополнительный тест.