Лучший ресурс для изучения дженериков.NET? [закрытый]

A .raw(..) - это , а не , выполняются с нетерпением, как и большинство запросов Django ORM, выполняемых лениво. Таким образом, он возвращает объект RawQuerySet с запросом в объекте. Например:

>>> User.objects.raw('BLA BLA BLA', [])

Такой запрос, как BLA BLA BLA, не имеет никакого смысла: база данных выдаст ошибку, но мы все равно получим RawQuerySet.

Вы можете форсировать оценку, например, перебирая ее, и тогда мы получим:

>>> list(User.objects.raw('BLA BLA BLA', []))
Traceback (most recent call last):
  File "/djangotest/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/djangotest/env/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 71, in execute
    return self.cursor.execute(query, args)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/cursors.py", line 247, in execute
    res = self._query(query)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/cursors.py", line 412, in _query
    rowcount = self._do_query(q)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/cursors.py", line 375, in _do_query
    db.query(q)
  File "/djangotest/env/lib/python3.6/site-packages/MySQLdb/connections.py", line 276, in query
    _mysql.connection.query(self, query)
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BLA BLA BLA' at line 1")

Таким образом, list(..) вычисляет силу, и теперь база данных, конечно, выдает ошибку. Однако даже если это был действительный запрос DELETE , он все равно вызовет ошибку, поскольку такой запрос не возвращает никакой записи.

Чтобы сделать DELETE вызовы, в руководстве по Django указано, что вы должны использовать курсор [Django-doc] :

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute(
        "DELETE FROM mydb_mymodel WHERE s_type = '%s' AND barcode = '%s' AND shopcode = '%s' AND date = '%s'" ,
        [d.s_type,d.barcode,d.shopcode,d.date]
    )

Но я думаю, что это, вероятно, намного проще определить его, например:

MyModel.objects.filter(
    s_type=d.s_type,
    barcode=d.barcode,
    shopcode=d.shopcode,
    date=d.date
).delete()

Это создаст запрос DELETE и правильно сериализует параметры. Запрос .delete() выполняется с энтузиазмом, поэтому вероятность совершения вышеупомянутых ошибок намного ниже: если ORM реализован правильно, нам не нужно об этом беспокоиться.

13
задан BKimmel 17 September 2008 в 16:40
поделиться

8 ответов

Очевидный выбор..

MSDN Дженерики C#

10
ответ дан 1 December 2019 в 23:33
поделиться

CLR через C# Jeffrey Richter входит в глубину о дженериках и является одним из бесценных ресурсов, которыми каждый разработчик.NET должен владеть и считать.

5
ответ дан 1 December 2019 в 23:33
поделиться

Если Вы когда-либо использовали шаблоны C++, то дженерики .NET являются почти тем же самым. Они даже используют подобный < синтаксис T>.

, Даже если Вы не знаете C++, в котором Вы, вероятно, заставляете это тяжелее, чем Вы нуждаться к, особенно относительно наборов. Они точно так же, как любой другой набор, но когда Вы создаете их, Вы предоставляете имя типа в < <>, таким образом, компилятор знает, какой объект они содержат.

1
ответ дан 1 December 2019 в 23:33
поделиться

C# 3.0 вкратце является фантастическим справочником с примерами, просто достаточно большими для схватывания понятия, не чувствуя себя чрезмерно увеличенным в размере.

0
ответ дан 1 December 2019 в 23:33
поделиться

Я нашел Профессиональную.NET WROX 2.0 Дженериками очень полезный, поскольку она содержит много примеров реального мира. Дженерики могли сбивать с толку новичка, но они могли быть очень полезным/мощным/экономящим время инструментом в руках опытного разработчика. Лично, я нахожу Дженерики.NET самыми полезными в упрощении определения и использования наборов. Также использование дженериков могло привести к более эффективному коду, поскольку это могло минимизировать хит производительности, обычно связываемый с упаковкой/распаковыванием преобразований типов.

0
ответ дан 1 December 2019 в 23:33
поделиться

Лучше следовать за некоторым обучением Microsoft на предмете. При поиске книг следующее было бы идеально:

http://www.microsoft.com/MSPress/books/9469.aspx

0
ответ дан 1 December 2019 в 23:33
поделиться

Мой голос - главным образом можно просто избежать их:)

основное преимущество для дженериков состоит в том, чтобы сохранить кастинг, если Вы заканчиваете тем, что делали кастинг внутренне, который не имеет никакого смысла. При попытке изучить эту проблему, Вы были бы найденный, что главным образом кандидаты на дженерики являются действительно теми наборами/наборами, которые могли создать собственное устройство хранения данных внутренне для такого преимущества. Большинство других компонентов, с другой стороны, усиление мало/нет производительность, и значительно ухудшает гибкость по сравнению с интерфейсной реализацией наследования.

, Если кастинг раздражает Вас так, возможно, время для Вас для рассмотрения динамических языков как IronPython:)

И - при реальной случайной встрече со сценарием, Вы думаете универсальные, имеют смысл, отправляют его как другой вопрос, мозги здесь могли выглядеть вместе и решить его индивидуальный:)

Обновление: Да проверка компилятора хороша, но источник Проекта Замка проверки, Вы видите много ситуаций, где универсальный тип входит в путь, потому что Вы не можете сделать кастинга - создание вещей как IBusinessObject намного более гибко, чем BusinessObject-, потому что Вы не можете бросить что-то, наследовались BusinessObject назад к BusinessObject, и ожидает получать доступ к наследованной функции. Обычно я видел, что код закончился как BusinessObjectBase-> BusinessObject-> Ваш фактический класс. Вот почему я вид чувства не всегда выгодный для использования дженериков - и я был одним из тех, кто действительно злоупотреблял такой реализацией и заканчивал тем, что имел тонны забавной функции с универсальным вводом, не хорошим вообще.

Обновление № 2: упаковка/Распаковывание просто означает требование бросать объект при использовании абстрактного типа (как объект), чтобы сохранить значение и использовать сильное введенное значение для хранения его назад снова (который требует кастинга), не, много различия I видит кроме ситуации с набором, которую я заявил. И код как это все еще делает упаковку:

public T GetValue<T>() {
  return (T) ...;
}

Thats универсальное злоупотребление я чаще всего видел. Люди думают, что они имеют дело с собственным типом здесь, на самом деле они не. Вместо этого они просто превращают кастинг в универсальный синтаксис. То, что действительно имеет смысл, является этим:

public class MyList<T>
{
  private List<T> _list;
...
public T GetValue(int index)
{
  return _list[index];
}

Тогда это снова вернулось к нашему устройству хранения данных набора. Вот почему я сказал после устройства хранения данных набора я не вижу, что много случайного дженерика помогает. Отнесенный из этого учебного руководства: http://en.csharp-online.net/Understanding_Generics— Revisiting_Boxing_and_Unboxing

-4
ответ дан 1 December 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: