Есть ли проблема с использованием этой структуры? - PullRequest
1 голос
/ 30 августа 2011

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

List<Summarized> SummarizedList = new List<Summarized>();
    Summarized SumInfo;
    struct Summarized
    {
        public string sBrand;
        public string sModel;
        public string sCustomer;
        public int sline;
        public string sLeader;            
        public int sDesire;
        public int sReal;               
    } 

Как видите, я использую общий список элементовТип SumInfo, который является типом данных struct.всякий раз, когда мне нужно обновить элемент списка, я просто делаю следующее:

SumInfo = (Summarized)SummarizedList[CurrentPos];
            SumInfo.sDesire = DesireProd;
            SumInfo.sReal = RealProduced;                
            SummarizedList[CurrentPos] = SumInfo;

, где CurrentPos - это позиция элемента, который я хочу обновить.может ли быть такая проблема в будущем?Эта структура одна из изменчивых?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 30 августа 2011

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

Да, это изменяемая структура.Да, это будет работать.

Однако я бы сказал, что эта структура должна быть классом.Подробнее о том, почему, смотрите Выбор между классами и структурами .В этом случае вы нарушаете 3 случая, которые всегда должны быть верны для структур:

  • Логически представляет одно значение, подобное примитивным типам (целое, двойное и т. Д.).
  • Размер экземпляра меньше 16 байт.
  • Неизменен.

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


Кстати - примечание: приведенный выше код не требуется.Вы должны быть в состоянии просто написать:

SumInfo = SummarizedList[CurrentPos];
3 голосов
/ 30 августа 2011

Проблемы:

  • Это изменчивая структура, и они почти всегда являются плохой идеей (ищите «изменяемые структуры зла», и вы получите множество попаданий)
  • Есть открытые поля - поэтому нет инкапсуляции;нет разделения между API типа и его реализацией
  • У него есть открытые члены, которые не следуют обычным .NET соглашениям об именах
  • Логически не представляетодно значение в соответствии с .NET руководящими принципами проектирования
  • Это больше, чем 16 байтов, рекомендованных теми же руководящими принципами (хотя я бы не стал уделять слишком много вниманияк этому, если бы все остальное было в порядке)

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

1 голос
/ 30 августа 2011

Лично я не имею ничего против использования этой структуры.Это может зависеть в большей степени от того, как вы его используете, инкапсулируете ли вы методы List и т. Д.

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

Я бы согласился, что класс, вероятно, является лучшим вариантом для этого.

1 голос
/ 30 августа 2011

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

SumInfo = SummarizedList[CurrentPos];
SumInfo.sDesire = DesireProd;
SumInfo.sReal = RealProduced;  
// you're done! no need to insert it back in, you're referring to the same item
0 голосов
/ 30 августа 2011

Выпуск 1:

Да, структура изменчива. И это страдает от всех проблем, связанных с этим.

SummarizedList[CurrentPos].sDesire=DesireProd;

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

Выпуск 2:

У вас есть открытые изменяемые поля. Это считается плохим стилем, и вы должны вместо этого использовать свойства.

Выпуск 3:

Вы используете (Системную) Венгерскую нотацию. При разработке в C # следуйте соглашениям об именах .net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...