Я подумал, что мне нужно быстро это измерить, поэтому запустил быстрое консольное приложение.
Он в основном использует все 3 метода (конструктор, LINQ и foreach), чтобы получить CultureInfo из строки 10000 раз в цикле. Для краткости я снял секундомер и вывод на консоль.
string culture = "en-GB";
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
for (int i = 0; i < 10000; i++)
{
try
{
CultureInfo c = new CultureInfo(culture);
}
catch
{
}
}
for (int i = 0; i < 10000; i++)
{
CultureInfo c = cultures.FirstOrDefault((x) => x.Name == culture);
}
for (int i = 0; i < 10000; i++)
{
foreach (CultureInfo c in cultures)
{
if (c.Name == culture)
break;
}
}
Результаты следующие ...
Try Catch: 00:00:00.0023860
LINQ: 00:00:00.0542459
ForEach: 00:00:00.0238937
Если вы удаляете переменную культур и называете ее каждую итерацию, то циклы LINQ и ForEach занимают около 2,5 секунд.
Таким образом, использование конструктора выгодно, если вы ожидаете получить много допустимых входных данных и только нечетный недопустимый. Но если вы измените значение, если ввод с en-GB
на TEST
, то все сильно изменится.
Invalid Culture Try Catch: 00:00:39.7163513
Invalid Culture LINQ: 00:00:00.0791752
Invalid Culture ForEach: 00:00:00.0291480
Очевидно, что мое тестовое приложение не является сценарием реального мира, но, поскольку OP сказал, что он вызывается для каждого запроса, я могу себе представить, что в большом веб-приложении этот код может вызываться много. Возможно, это вектор отказа или обслуживания, занимающий весь ЦП путем рассылки веб-серверу спама запросами, которые имеют недопустимый параметр культуры.