При создании простого класса контейнера данных, каким он должен быть?C#: Какой тип контейнеров данных предпочтительнее в целом?
- Класс или структура?
- Мощный или непреложный?
- С или без непустого конструктора?
Примеры выше:
struct MutableStruct
{
public string Text { get; set; }
public int Number { get; set; }
}
struct ImmutableStruct
{
public string Text { get; private set; }
public int Number { get; private set; }
public ImmutableStruct(string text, int number)
: this()
{
Text = text;
Number = number;
}
}
struct MutableStructWithConstructor
{
public string Text { get; set; }
public int Number { get; set; }
public MutableStructWithConstructor(string text, int number)
: this()
{
Text = text;
Number = number;
}
}
class MutableClass
{
public string Text { get; set; }
public int Number { get; set; }
}
class ImmutableClass
{
public string Text { get; private set; }
public int Number { get; private set; }
public ImmutableClass(string text, int number)
{
Text = text;
Number = number;
}
}
class MutableClassWithConstructor
{
public string Text { get; set; }
public int Number { get; set; }
public MutableClassWithConstructor(string text, int number)
{
Text = text;
Number = number;
}
}
Любые хорошие причины, мы должны выбрать один над другим? Или существуют ли в основном субъективные предпочтения, которые их разделяют? Или это сильно зависит от конкретных случаев использования? Если да, то в каких случаях следует выбирать, что и почему?
Кстати, ваши «ImmutableStruct» и «ImmutableClass» не являются поистине неизменными: свойства имеют частные сеттеры, но их состояние может быть изменено из самого struct/класса. (Это ярлык, который я часто использую сам, но было бы лучше избегать автоматического свойства и вместо этого использовать переменную-член только для чтения, открытую через публичный getter.) – LukeH
Хм, это на самом деле хороший момент, хотя я думаю Мне может быть слишком ленив, чтобы что-то сделать: p Особенно потому, что простой контейнер данных не должен ничего делать с его данными. То, как это изнутри, имеет для меня меньшее значение ... Хотя, возможно, публичное поле для чтения было бы лучше? Вид вроде свойств, хотя ...: p – Svish
Hmm ... 'public string Text {get; } 'должен создать поле для чтения только для чтения и включить настройку только в конструкторе, например, с полями readonly. На данный момент я думаю, что строка создает бесполезное свойство, возвращающее null ... – Svish