Наличие в вашем коде try-catch имеет минимальные, но незначительные для IMO издержки производительности: в диапазоне <0.001 мкс </strong> за попытку "try-that-didnt-catch" (с использованием сборки .NET 4.6.1 Release на моей машине Core i7 x64).
Но , если он должен поймать , тогда он стоит немного больше: в диапазоне 12,5 мкс за попытку-то-чтобы-поймать ( с использованием сборки .NET 4.6.1 Release на моей машине с Core i7). Тем не менее, вы можете не заметить, пока не доберетесь до уровня 10 тысяч обнаруженных исключений.
В общем, гораздо лучше избегать метания и ловли, если вы можете, и вы можете сделать это здесь, используя decimal.TryParse .
Теперь вам нужно выполнить проверку на ноль отдельно, иначе .ToString()
может все равно привести к сбою.
Переписанный код:
var v = dr[dc.ColumnName];
var s = v?.ToString(); // or you might use: var s = v as string;
if (s != null && decimal.TryParse(s, out decimal d))
cell.Value = d;
else
cell.Value = v;