Новият API за общ параметър наистина има проблем - трябва да приема обикновен .NET null
(а не DBNull.Value
), отворих този проблем
за да проследите това, то ще бъде коригирано в 4.0.3.
Имайте предвид, че както бележката към документацията
казва, че целият смисъл на общия API е да се избягва използването на Value
свойство, което е от тип object
. Ако използвате общия NpgsqlParameter<int>
но задайте Value
, вашият int ще бъде поставен в кутия, нарушавайки целта на API. Трябва да присвоявате на TypedValue
, който е от тип int
и няма да се боксира. Ето защо не можете да присвоите DBNull.Value
за указване на нулева стойност (това е различен тип .NET).
Някои бележки относно това дали трябва да се използва този нов общ API:
- Ако пишете много типове стойности (напр.
int
,DateTime
...) това ще премахне всички разпределения на боксове. Дали това ще бъде значително зависи от вашето приложение – профилирайте внимателно. - Общите API винаги трябва да се предпочитат пред негенеричните, когато типът е известен по време на компилиране. Това позволява на компилатора да проверява коректността на типа рано и прави кода ви по-ясен - използваме
List<string>
вместоArrayList
като въпрос на добро кодиране, дори когато производителността не е проблем - Основният (единствен?) недостатък на генеричния API е, че той е специфичен за Npgsql, което прави вашия код непреносим към други драйвери на бази данни (въпреки че има проблем за превръщането на това (или нещо подобно) в част от ADO.NET).