Который является лучшим для Структуры/Классов хранилища данных?

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

Вы можете использовать this.textContent в обработчике событий вместо Image.textContent . Или вы можете использовать let вместо var в цикле for. Другой способ решить эту проблему с помощью IIFE

function hello(d) {
    alert("" + d);
}

var Images = document.querySelectorAll('.block-image_carousel-single > figcaption');
for (var i = 0; i < Images.length; i++) {
    var Image = Images[i];
    Image.addEventListener('click', function (event) {
        event.preventDefault();
        hello(this.textContent);
    }, false);
}

//
// ...loop using let
//
for (let i = 0; i < Images.length; i++) {
    var Image = Images[i];
    Image.addEventListener('click', function (event) {
        event.preventDefault();
        hello(Images[i].textContent);
    }, false);
}

29
задан Matthew Murdoch 15 April 2013 в 09:15
поделиться

7 ответов

Я бы сделал выбор на основе следующих критериев

  • тип ссылки против семантики типа значения. Если 2 объекта равны только в том случае, если они являются одним и тем же объектом, то это указывает на семантику типа ссылки => класс. Если значение его членов определяет равенство (например, 2 DateTimes равны, если оба представляют одну и ту же точку во времени, даже если это 2 разных объекта), то семантика типа значения => struct
  • След памяти объекта. Если объект огромный и часто выделяется, то, сделав его структурой, я бы намного быстрее потреблял стек, поэтому я бы предпочел, чтобы он был классом. Напротив, я бы предпочёл избежать GC штрафов за небольшие типы значений, а значит, сделать их структурой.
  • Можете ли вы сделать объект неизменяемым? Я нахожу отличные структуры для "объектов-значений" - из книги DDD.
  • Вам грозит некоторое штрафное наказание за отказ от бокса, основанное на использовании этого объекта? Если да, то идите в класс.
54
ответ дан 28 November 2019 в 00:46
поделиться

Довольно классное, не очень хорошо известное преимущество Structs по сравнению с классами заключается в том, что в структурах есть автоматическая реализация GetHashcode и Equals.
Это очень полезно, когда ключи требуются для словарей

Реализация структуры GetHashcode и Equals основана на двоичном содержимом экземпляров структуры + отражение для ссылочных членов (таких как члены String и другие экземпляры классов)

Таким образом, следующий код работает для GethashCode / Equals:

public struct Person
{
    public DateTime Birthday { get; set; }
    public int Age{ get; set; }
    public String Firstname { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        Person p1 = new Person { Age = 44, Birthday = new DateTime(1971, 5, 24), Firstname = "Emmanuel" };
        Person p2 = new Person { Age = 44, Birthday = new DateTime(1971, 5, 24), Firstname = "Emmanuel" };
        Debug.Assert(p1.Equals(p2));
        Debug.Assert(p1.GetHashCode() == p2.GetHashCode());
    }
}

Оба утверждения выполняются успешно, когда Person является структурой. Оба утверждения не выполняются, если Person является классом вместо struct

: https://msdn.microsoft.com/en-Us/library/2dts52z7%28v=vs.110%29.aspx

С уважением, лучшее кодирование

14
ответ дан Emmanuel DURIN 28 November 2019 в 00:46
поделиться

Я никогда не могу вспомнить, насколько разные структуры, но они есть. Тонкими способами. На самом деле, иногда они приходят и кусают тебя.

Итак. Если вы не знаете, что делаете, просто придерживайтесь уроков.

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

Если я правильно помню, одной из самых больших проблем является семантика значений структур: их передача приведет к созданию различных объектов (поскольку они передаются по значению). Если вы затем измените какое-либо поле в одном месте, имейте в виду, что во всех других местах поле не изменилось! Вот почему все рекомендуют неизменность для структур!

РЕДАКТИРОВАТЬ: Для случая, который вы описываете, структуры не будут работать !

5
ответ дан Daren Thomas 28 November 2019 в 00:46
поделиться

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

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

3
ответ дан Dennis Sellinger 28 November 2019 в 00:46
поделиться

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

.
7
ответ дан 28 November 2019 в 00:46
поделиться

Помню один совет на MSDN о том, что структура не должна быть larget больше 16 или 21 байта. Ищу ссылку, но пока не могу ее найти.

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

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

Я думаю, у тебя есть правильная идея. Структуры сделаны для имитации типов данных. Они основаны на значениях, а не на ссылках. Если вы посмотрите в документации MSDN на большинство классов базовых данных (int, double, decimal, и т.д.), то все они основаны на структурах. При этом, однако, не следует злоупотреблять структурами по той же самой причине. Место для хранения всего в этой структуре выделяется как только она инстанцируется, где в качестве классов просто выделяется место для ссылки на все, что находится внутри. Если данные находятся в достаточно маленьких кусочках, где это не является проблемой, то структуры - это то, что нужно. Если это проблема, используйте классы. Если вы не знаете, то, возможно, лучше придерживаться того, что вам знакомо

.
2
ответ дан 28 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

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