(c#) Являются ли вложенные (внутренние) классы единственным способом ограничить доступ к классу одним классом?

#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 .

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