C #: System.Object vs Generics

Взгляните на GROUP_CONCAT, если Ваша версия (4.1) MySQL поддерживает его. См. документация для получения дополнительной информации.

Это посмотрело бы что-то как:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';

26
задан foreyez 12 December 2010 в 21:09
поделиться

5 ответов

Многие люди рекомендуют использовать дженерики, но похоже, что все они упускают суть. Часто речь идет не о падении производительности, связанном с упаковкой примитивных типов или приведениях, а о том, как заставить компилятор работать на вас.

Если у меня есть список строк, я хочу, чтобы компилятор доказал мне, что он всегда будет содержать список строк. Generics делает именно это - я указываю намерение, и компилятор доказывает это для меня.

В идеале, я бы предпочел систему с еще более богатым типом, в которой, например, можно сказать, что тип (даже если это был ссылочный тип) не может содержать нулевые значения, но, к сожалению, в настоящее время C # этого не предлагает.

8
ответ дан 28 November 2019 в 06:55
поделиться

Хотя бывают случаи, когда вы захотите использовать неуниверсальную коллекцию (например, кеширование), у вас почти всегда есть коллекции однородных объектов, а не гетерогенных объектов. Для однородной коллекции, даже если это набор вариантов базового типа или интерфейса, всегда лучше использовать дженерики. Это избавит вас от необходимости приводить результат к реальному типу, прежде чем вы сможете его использовать. Использование обобщений делает ваш код более эффективным и читабельным, потому что вы можете опустить код для выполнения приведения.

6
ответ дан 28 November 2019 в 06:55
поделиться

Используйте дженерики, когда хотите, чтобы ваша структура обрабатывала один тип. Например, если вам нужна коллекция строк, вам нужно создать экземпляр строго типизированного списка строк, например, так:

List<string> myStrings = new List<string>();

Если вы хотите, чтобы он обрабатывал несколько типов, вы можете обойтись без шаблонов, но вы понесете небольшой удар по производительности для операций упаковки / распаковки.

1
ответ дан 28 November 2019 в 06:55
поделиться

Все зависит от того, что вам нужно в долгосрочной перспективе.

В отличие от большинства ответов здесь, я не буду говорить «всегда используйте дженерики», потому что иногда вам нужно смешивать кошек с огурцами.

Во что бы то ни стало, старайтесь придерживаться дженериков по всем причинам, уже указанным в других ответах, например, если вам нужно объединить кошек и собак, создайте базовый класс млекопитающих и получите Stack<Mamal>.

Но когда вам действительно нужно поддерживать все возможные типы, не бойтесь использовать объекты, они не кусаются, если вы не обращаетесь с ними плохо. :)

2
ответ дан 28 November 2019 в 06:55
поделиться

Иногда вы просто не можете использовать дженерики для этой цели. Например:

public ConstructorName(object defaultObject = null) {}

Если вы измените параметр по умолчанию на generics, это приведет к ошибке компиляции.

-1
ответ дан 28 November 2019 в 06:55
поделиться
Другие вопросы по тегам:

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