Структуры внутри класса С#, а точнее, какой эквивалент им?
Есть у меня некая привычка, создавать структуры внутри классов. Нужно это для моего удобства, чтобы я мог спокойно структурировать код и логику, собственно. Грубо говоря, нужно именовать блок данных и обращаться к нему через имя. Типа: Unit -> Attributes -> Str. Есть ли эквивалент какой-то? Пример того, как я это вижу и хочу:
public class NewUnit
{
struct Attributes
{
byte Str;
byte Dex;
byte Int;
}
struct Traits
{
enum PositiveTraits {HEALTHY, SPEEDY, SMARTY}
enum NegativeTraits {WEAKY, SLOWLY, UNBRAINED}
}
}
Ответы (3 шт):
Возможно, вы неправильно сформулировали вопрос. Вас может беспокоить наличие возможных отрицательных эффектов в плане производительности. Их нет, несколько я пониманию. Поэтому для вашего удобства вы можете организовывать поля класса с помощью структур.
Ещё вас может беспокоить то, что вы такого нигде не видели. Посмотрите на WinForms, например - там полно структур внутри классов.
Если речь идёт не только об использовании внутри класса, но и об объявлении, то вам нужно учитывать область действия этого объявления. Или структура используется только в этом классе, или в нескольких.
Кстати, у такого подхода есть одно преимущество. Из вложенного класса или структуры видны все члены главного класса, в том числе и приватные.
Класс может быть большой (конечно, желательно такого избегать) и иметь много логики внутри. Вы можете сделать внутренние структуры внутри класса. Как минимум, язык это позволяет - читаем тут
Но, желательно все типы создавать в отдельных файлах и заниматься структурированием самих файлов, а не типов внутри типов.
Лучше структурировать в подпапку Enums. Это мой выбор
Я бы использовал подход, когда вы держите все типы на том уровне, где они используются. Если у вас тип используется исключительно внутри другого типа, позволительно создать его как вложенный тип.
Если у вас есть enum, который может быть аргументом метода, возвращаемым значением или свойством, его лучше вынести на уровень папки сервиса, где он используется.
Если таких типов несколько, желательно под них создать подпапку на том же уровне сервиса.
Если у вас глобальный тип, который используется во многих частях программы, его, желательно, вынести максимально низко по инфраструктуре проекта. Это нужно, что бы он был доступен по всех библиотеках и проекта через project dependencies.
Если вы хотите доступ к типам вроде такого:
Blah.blah.blah.blah.MyType
Тогда можете использовать для этого namepsaceы. Это стандартная практика. Каждый тип должен находиться внутри namespaced для его локализации (англ. - locale (местонахождение)). namespaced типа будет сгенерирован автоматически при создании типа и будет подчиняться следующему паттерну:
имяПроекта.подпапка.подпапка...подпапка.тип.вложенныйТип
Важно!
Вложенность типов нарушает правило CA1034. Иными словами, если следовать правилу, ваши вложенные типы не должны быть доступны извне
Если вы хотите логическую группировку данных и возможность обращаться к этим данным через точку, делайте так:
public class UnitAttributes
{
public byte Str { get; set; }
public byte Dex { get; set; }
public byte Int { get; set; }
}
public class UnitTraits
{
public enum PositiveTraits { HEALTHY, SPEEDY, SMARTY }
public enum NegativeTraits { WEAKY, SLOWLY, UNBRAINED }
}
public class NewUnit
{
public UnitAttributes Attributes { get; } = new UnitAttributes();
}