C#: Различие между Списком <T> и Набором <T> (CA1002, не выставляйте универсальные списки) [дубликат]

Спросите Ваш сам сначала, как Вы разыменовали бы пустой указатель?

void *p = /*something*/ ;
cout << *p << endl;

вышеупомянутый код бессмыслен, одна из причин, которые мы имеем пусто, так, мы можем сказать, что "Я должен сделать некоторую универсальную работу указателя здесь и меня ни знать, ни заботиться о том, на что я указываю". По определению компилятор не знает то, на что указывает пустота *, поэтому это не может разыменовать его. Вы можете - путем кастинга - но компилятор не может.

ссылка А на пустоту страдает от той же проблемы, по определению данные указали, не имеет типа, поэтому на это нельзя сослаться никаким значимым способом.

Для ссылки на него Вы - программист - должен бросить его к другому типу, тогда у Вас может быть типизированная ссылка на него.

Не уверенный, если я объяснил это, а также я хотел.

Ruben, какие-либо мысли?

РЕДАКТИРОВАНИЕ: Для ответа на редактирование.

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

logger << data;

и Вы поймете мысли адресных сведений к. При попытке разыменовать данные, компилятор даст Вам ошибку (не имейте компилятора C++ удобным в настоящее время, таким образом, не уверенный в фактической ошибке). например,

void* data = /* some assignment */;
logger << *data; // compiler error.

Теперь, компилятор не позволит Вам разыменовать пустоту* по любой причине (это не имеет смысла), то же выдерживает за ссылку освободить & данные, за исключением того, что, потому что это - ссылка , они неявно разыменовываются все время . Компилятор не позволит Вам разыменовать пустоту* на одной операции, он не собирается позволять Вам постоянно разыменовывать его.

void& data = /* some assignment *.;
logger << data; // means same as logger << *data above

Вы не можете сделать , ЧТО-НИБУДЬ к данным КРОМЕ [1 120] берет, это - адрес, и существует совершенно хорошее - и безопасно - метод, встроенный в languge, чтобы сделать это, т.е.

void* data;

это имеет еще смысл?

95
задан Svish 18 October 2010 в 12:12
поделиться

2 ответа

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

Следовательно, открывая сам список, вы никогда не сможете расширить свою коллекцию для отслеживания операций добавления или удаления (например), не нарушая публичный контракт класса.

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

137
ответ дан 24 November 2019 в 05:51
поделиться

Коллекция предоставляет некоторые виртуальные члены (вставить, удалить, установить, очистить), которые можно переопределить и предоставить дополнительные функции (например, события уведомления) при изменении коллекции.

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

List , с другой стороны, разработан с учетом производительности в виду, поэтому следует использовать только в особых случаях, когда производительность очень важна. Поскольку это не расширяемое, будущие изменения чего-либо с использованием списка сломают все остальное, зависящее от него. Обычно Список должен использоваться только внутри классов очень низкого уровня и не подвергаться никакому воздействию, чтобы уменьшить вероятность будущих критических изменений.

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

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

24
ответ дан 24 November 2019 в 05:51
поделиться
Другие вопросы по тегам:

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