Можете ли вы создавать частные классы в C #?

Это вопрос к философам .NET:

Насколько я понимаю, Microsoft сознательно отрицает использование частных классов в C #. Почему они это сделали и каковы их аргументы для этого?

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

Отличное решение - создать отдельный проект в VS для этого инструмента, и я сделаю так, но мне интересно, что если я не смогу сделать это - например, наша архитектура была недостаточно хороша, и у нас есть большой отдельный проект.

За «закрытым классом» я имею в виду класс, который нельзя использовать ни в каком другом пространстве имен, кроме его собственного.

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

23
задан gonzobrains 28 November 2012 в 20:31
поделиться

5 ответов

Полагаю, вы хотите сделать это

namespace Baz
{
    private class foo
    {
        private int _bar;
    }
}

Если да. Тогда с какой целью foo будет server. В пространстве имен вы можете быть более строгими, чем внутренние, и использовать класс. Если бы я мог это сделать, где бы я это использовал.

Вот почему у вас есть эта проверка времени компиляции.

Теперь внутри общедоступного класса имеет смысл иметь приватный класс. Я не могу лучше объяснить это Внутренние классы в C# — почему они не используются чаще? .

1
ответ дан 29 November 2019 в 01:32
поделиться

Вы можете создать закрытый класс как член другого типа:

public class Outer {
  // ...
  private class Inner {
    // ...
  }
}

и Внутренний виден только членам Внешнего.

На самом внешнем уровне (т.е. в пространстве имен) private в соответствии с его определением не имеет смысла (поскольку нет ничего, что могло бы быть приватным). Вместо этого используйте internal (видимый только для членов содержащей сборки).

11
ответ дан 29 November 2019 в 01:32
поделиться

Вы можете определить частный класс, но он может использоваться только содержащим его классом.

Если вам нужен класс, который виден только внутри определенной сборки (DLL/EXE/и т. д.), вам следует объявить его как внутренний (Друг в VB)

2
ответ дан 29 November 2019 в 01:32
поделиться

Верно, но вы можете довольно точно смоделировать это с помощью внутренних классов и internalsvisibletoAttribute, если пространство имен разделено на несколько сборок.

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

1
ответ дан 29 November 2019 в 01:32
поделиться

Разрешение классам быть закрытыми для пространства имен не обеспечит значимого уровня защиты.

Любая сборка в мире может просто сослаться на вашу dll и начать писать код в вашем пространстве имен, который обращается к вашим якобы закрытым классам.

Я думаю, что это, возможно, ответ, который вы получите от Microsoft.

21
ответ дан 29 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: