У меня есть простой метод, который возвращает Nullable Int32 из DataReader, а не созданного в GetInt32.
Я называю этот метод многими много раз и имею одну ситуацию, где любое время, которое я могу сбрить его, было бы выгодно.
Кто-либо может предложить какие-либо альтернативные и более быстрые способы вытащить nullable Int32 из DataReader?
private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
return !dataReader.IsDBNull(fieldIndex) ?
dataReader.GetInt32(fieldIndex) : (Int32?)null;
}
Мне кажется , что иногда можно быстрее получить значение как объект, а затем проверить, является ли это DBNull.
private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
object value = dataReader.GetValue(fieldIndex);
return value is DBNull ? (Int32?) null : (Int32) value;
}
По крайней мере, стоит попробовать. Обратите внимание, что это предполагает, что вы можете распаковать прямо в int
... Я не знаю наверняка, правильно ли это, но это будет легко увидеть.
Теперь есть другой подход, который несколько менее безопасен - он вернет null для любого нецелого значения, даже если поле на самом деле является строкой, например:
private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
return dataReader.GetValue(fieldIndex) as Int32?;
}
Я ранее писал об «as» с допускающим значение null типы не так быстры, как я ожидал, но это может быть немного другой случай ... опять же, стоит попробовать.
Однако я был бы очень удивлен, если это действительно узкое место ... конечно, получение данных из базы данных в первую очередь будет намного дороже. У вас есть тесты для этого?
Код, который вы хотите оптимизировать (?:
), будет незначительным по сравнению с окружающим вводом-выводом.
Так что быстрее не будет.