Исправить исключение NullReferenceException можно с помощью Null-условных операторов в c # 6 и написать меньше кода для обработки нулевых проверок.
Он используется для проверки нуля до выполнения доступа к члену (?. ) или index (? [).
Пример
var name = p?.Spouse?.FirstName;
эквивалентен:
if (p != null)
{
if (p.Spouse != null)
{
name = p.Spouse.FirstName;
}
}
В результате имя будет нулевым когда p равно null или когда p.Spouse имеет значение null.
В противном случае имени переменной будет присвоено значение p.Spouse.FirstName.
Для получения дополнительной информации: Операторы с нулевым условием
Да, decimal
предназначен именно для этого.
Однако помните, что диапазон десятичного типа меньше, чем двойной. Это двойное значение может иметь большее значение, но оно делает это, теряя точность. Или, как указано в MSDN:
Ключевое слово decimal обозначает 128-битный тип данных. По сравнению с типами с плавающей запятой десятичный тип имеет большую точность и меньший диапазон, что делает его пригодным для финансовых и денежных расчетов. Примерный диапазон и точность для десятичного типа показаны в следующей таблице.
blockquote>Основное различие между
decimal
иdouble
заключается в том, чтоdecimal
является фиксированной точкой иdouble
- плавающая точка . Это означает, что десятичное значение сохраняет точное значение, аdouble
представляет значение, представленное дробью, и является менее точным. Adecimal
- 128 бит, поэтому для сохранения требуется два места. Вычисления наdecimal
также медленнее (measure!).Если вам нужна еще большая точность, тогда
BigInteger
можно использовать из .NET 4. (Вам нужно будет обрабатывать десятичные точки самостоятельно). Здесь вам следует знать, что BigInteger неизменен, поэтому любая арифметическая операция на нем создаст новый экземпляр - если числа большие, это может привести к искажению производительности.Я предлагаю вам точно посмотреть, как точно вам нужно быть. Возможно, ваш алгоритм может работать с нормализованными значениями, которые могут быть меньше? Если производительность является проблемой, один из встроенных типов с плавающей запятой, вероятно, будет быстрее.
В .NET Framework 4 представлена структура System.Numerics.BigInteger, которая может содержать числа с произвольной большой точностью.
Проверьте BigInteger (.NET 4), если вам нужна еще большая точность, чем Decimal
.