Необходимо поместить весь тот код где-нибудь.
, Если Вы собираетесь иметь хранимые процедуры вообще (я лично делаю одолжение их, но многие не делают), тогда Вы могли бы также использовать их так, как Вы должны. По крайней мере, вся логика базы данных находится в одном месте. Оборотная сторона - то, что обычно нет большого количества структуры к блоку, полному сохраненного procs.
Ваш вызов!:)
Вы можете рассматривать шаблоны C ++ как интерпретируемый функциональный язык программирования, замаскированный под систему обобщений. Если это вас не пугает, то следует:)
Дженерики C # очень ограничены; вы можете параметризовать класс по типу или типам и использовать эти типы в методах. Итак, чтобы взять пример из MSDN , вы можете сделать:
public class Stack<T>
{
T[] m_Items;
public void Push(T item)
{...}
public T Pop()
{...}
}
И теперь вы можете объявить Stack
или Stack
и он будет безопасно хранить объекты этого типа (т. е. не беспокойтесь о том, что по ошибке поместите SomeOtherObject
).
Внутренне среда выполнения .NET будет специализировать его на варианты для основных типов, таких как int, и вариант для типов объектов. Это позволяет, например, представлять Stack
намного меньше, чем представление Stack
.
Шаблоны C ++ допускают аналогичное использование:
template<typename T>
class Stack
{
T *m_Items;
public void Push(const T &item)
{...}
public T Pop()
{...}
};
This на первый взгляд выглядит похоже, но есть несколько важных отличий. Во-первых, вместо одного варианта для каждого фундаментального типа и одного для всех типов объектов существует один вариант для каждого типа, для которого создается экземпляр . Типов может быть много!
Следующее важное отличие (в большинстве компиляторов C ++) заключается в том, что он будет компилироваться в каждой единице трансляции, в которой он используется. Это может сильно замедлить компиляцию.
Еще одним интересным атрибутом шаблонов C ++ является то, что они могут применяться к вещам, отличным от классов, и когда это так, их аргументы могут быть автоматически обнаружены. Например:
template<typename T>
T min(const T &a, const T &b) {
return a > b ? b : a;
}
Тип T будет автоматически определяться контекстом, в котором используется функция.
Эти атрибуты могут быть использованы с хорошими целями за счет вашего здравомыслия. Поскольку шаблон C ++ перекомпилируется для каждого типа, с которым он используется, а реализация шаблона всегда доступна компилятору, C ++ может выполнять очень агрессивную встраивание в шаблоны. Добавьте к этому автоматическое определение значений шаблона в функциях, и вы сможете сделать анонимными псевдофункциями в C ++, используя boost :: lambda . Таким образом, выражение вроде:
_1 + _2 + _3
создает объект с серьезно пугающим типом, в котором есть оператор (), который суммирует свои аргументы.
Существует множество других темных уголков системы шаблонов C ++ - это чрезвычайно мощный инструмент, но об этом может быть больно думать, а иногда трудно использовать, особенно когда это дает вам сообщение об ошибке длиной в двадцать страниц. Система C # намного проще - менее мощная, но более понятная и трудная для злоупотребления.
Подробный ответ о переполнении стека: В чем разница между универсальными шаблонами в C # и Java ... и шаблонами в C ++?
http://blogs.msdn.com/csharpfaq/archive/ 2004/03/12 / 88913.aspx
Грубо говоря, большая часть различий связана с тем фактом, что шаблоны разрешаются во время компиляции, а обобщенные шаблоны разрешаются во время выполнения.
Этот блог запись Эрика Ганнерсона довольно хорошо освещает эту тему.
Самым большим непосредственным отличием является то, что шаблоны являются функцией времени компиляции, тогда как универсальные шаблоны - функцией времени выполнения.