#c# #class #nested #inner-classes
Вопрос:
Для хранения данных, которые я читаю из XML-файла, я создал структуру данных, как показано на рисунке выше. Все поля с нумерацией от 1 до n являются экземплярами класса.
Первый вопрос:
Каждый класс, который может содержать несколько экземпляров других классов, делает это с помощью элемента списка, например, FundamentalNamingConvention хранит множество типов единиц в
List<UnitType>
Является ли это правильным способом сделать это?
Второй вопрос:
Все классы (FundamentalNamingConvention, UnitType, UnitName) доступны только классу NameGenerator. Чтобы гарантировать это, я мог бы просто сделать все эти классы внутренними классами генератора имен, но тогда этот файл будет состоять из нескольких сотен строк кода.
Есть ли способ сохранить классы в их отдельных файлах (например, UnitType.cs), но по-прежнему быть доступными только для генератора имен?
Комментарии:
1. Вопрос 2: Вы могли бы поместить все свои классы в отдельную сборку и пометить внутренние классы как, ну,
internal
. Тогда к ним нельзя получить доступ извне сборки.
Ответ №1:
Каждый класс, который может содержать несколько экземпляров других классов, делает это с помощью элемента списка (например, FundamentalNamingConvention хранит множество типов единиц в списке). Является ли это правильным способом сделать это?
Да, все в порядке. Скорее всего , любой ICollection
, IList
или IEnumerable
сработал бы. Но List
все в порядке. Обратите внимание: List
позволяет также добавлять элементы. Иногда это нежелательно.
Все классы (FundamentalNamingConvention, UnitType, UnitName) доступны только классу NameGenerator. Чтобы гарантировать это, я мог бы просто сделать все эти классы внутренними классами генератора имен, но тогда этот файл будет состоять из нескольких сотен строк кода.
Есть ли способ сохранить классы в их отдельных файлах (например, UnitType.cs), но по-прежнему быть доступными только для генератора имен?
Да, вы можете использовать частичный класс для разделения файлов. Например.:
//file1.cs
public partial class Foo
{
//normal definition
}
//file1.cs
public partial class Foo
{
private class InnerBar
{
//private inner class definition
}
}
Ответ №2:
C# позволяет разделить определение класса на несколько частей с помощью partial
ключевого слова:
// Parent.cs
using System;
public partial class Parent
{
public static void WriteLine()
{
Console.WriteLine(Nested.Value);
}
}
// Nested.cs
using System;
public partial class Parent
{
private class Nested
{
public static int Value { get => 123; }
}
}
Вы обнаружите, что Parent.WriteLine()
правильно выводит значение 123
Ответ №3:
Другой способ управления доступом к классам-использование проектов. Создайте новый проект со всеми классами, сделайте NameGenerator
общедоступными и все остальные классы internal
.
Использование подобных мелкозернистых проектов имеет различные преимущества и недостатки. Многие проекты могут по-разному снижать производительность, а зависимости могут быть более громоздкими в управлении. С другой стороны, это может улучшить повторное использование кода, поскольку пользователи могут зависеть только от того, что им нужно.