2014-10-23 3 views
0

У меня есть список из 50 атрибутов, которые может иметь объект. Этот объект может иметь разные категории свойств - категории 1, категории 2 и категории 3. Категория 1 является подмножеством категории 2, категория 2 является подмножеством категории 3, а категория 3 является полным списком. Я изначально использовал структуру, но теперь мне интересно, следует ли мне использовать класс, или если я ошибаюсь в первую очередь. Ради давайте обрезаем его до 5 атрибутов и всего 2 категории.Моделирование большого списка свойств в C#

C1: A1, A2, A3 
C2: A1, A2, A3, A4, A5 

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

Category category; 
... 
category = new Category1(); 
category = new Category2(); 

Так как я имею дело с 10, 25, 50 атрибутов в категория, определение класса - это просто большой список свойств, который выглядит как структура, лучше подходит. Но если я использую struct, похоже, мне нужно сохранить его как тип объекта? Это похоже на клочья.

Что было бы правильным путем?


Позвольте мне пробраться по второму вопросу здесь. :) Итак, поскольку у меня есть большой список свойств для класса (или структуры), было бы лучше использовать инициализатор объекта вместо конструктора с параметрами 10, 25, 50?

+1

Как правило, не используйте структуру, если у вас нет веской причины. По умолчанию классы. Структуры представляют собой типы значений, которые могут вызывать неожиданное поведение, особенно если вы сделаете их изменчивыми. Кроме того, поскольку они являются типами значений, они должны быть небольшими; 50 членов слишком много для структуры. – Blorgbeard

+0

@Blorgbear - Спасибо. Вот почему я хотел получить обратную связь. Эти поля будут неизменными в готовом продукте, но структуры являются типами значений ... но 50 полей слишком много. и т.д. и т.п. Ха-ха. Похоже, я буду придерживаться классов. – blissfool

ответ

2

Вы должны только определение структуры, когда:

  • Он представляет собой одно значение (подобно INT, двойное, длинное, ...)
  • Это меньше, чем 16 байт
  • Это не изменяемое
  • вы не ожидаете, что он будет часто боксировал

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

+0

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

0

Что вы собираетесь делать с этой переменной категории?

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

class Category1 { 
    public int A1 { get; set; } 
    public int A2 { get; set; } 
    public int A3 { get; set; } 
} 

class Category2 : Category1 { 
    public int A4 { get; set; } 
    public int A5 { get; set; } 
} 

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

+0

Ну, как только поле будет установлено, я просто сделаю их доступными для экземпляра класса анализатора. Поля не будут меняться после их установки, но я не уверен, что я сделаю setter приватным, поскольку это означало бы, что я не могу использовать инициализатор объекта. Это все еще экспериментальный код, поэтому я не слишком беспокоюсь об этом уровне семантики. Просто хочу, по крайней мере, моделировать данные, а также, возможно. – blissfool

+0

Просто чтобы добавить, у меня есть классы, которые в настоящее время настроены в качестве вашего примера, но у меня также был собственный сеттер и конструктор. И к тому моменту, когда я настраивал конструктор класса 3, список параметров стал настолько длинным, что я остановился, думая, что это не так. Прежде чем вопрос был отправлен, я изменил свой код, чтобы выглядеть как ваш пример, и начал использовать инициализатор объекта. Затем я решил попросить какое-то предложение по другому подходу. – blissfool

0

Вы можете создать класс или структуру, это зависит от того, как вы собираетесь их использовать, но в целом вы должны просто использовать классы. Выезд: http://msdn.microsoft.com/en-us/library/ms173109.aspx для более подробной информации.

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

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

+0

Спасибо. Большинство полей являются просто примитивными, поэтому я считаю, что они имеют хорошее значение по умолчанию. Как я уже упоминал в комментарии для ответа Кеннета: «В настоящее время я пишу какой-то экспериментальный код, который анализирует грубо отформатированные данные, и я пытаюсь создать на нем модель. В настоящее время я не уверен, как иначе логически структурировать их в момент ». – blissfool

0

Во многих случаях может быть полезно объединить многие поля класса в частный тип структуры открытого поля. Цель этого полностью отличается от сценария использования, предусмотренного автором часто цитируемого документа «правила для структур», поэтому предложения здесь не имеют смысла. Если, например, вы инкапсулируете большинство первичных полей в тип PrimaryFieldStruct, и ваш класс имеет поле такого типа, которое называется pf, тогда доступ к любому полю этой структуры будет иметь такую ​​же стоимость, как и если бы это поле было членом класса а не часть структуры. Однако, если поля, агрегированные как тип PrimaryFieldStruct, предоставят вам возможность копировать все поля из одного экземпляра класса в другой.