C # - Объявление типов в пространстве имен - PullRequest
4 голосов
/ 26 февраля 2010

что может быть возможным использованием объявления типов в пространстве имен, но не в классе.

Например:

namespace Test
{
    public delegate void Ispossible();
}

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

Ответы [ 4 ]

6 голосов
/ 26 февраля 2010

Пространство имен - это высокоуровневая единица организации в .NET.

Объявление типов в классах обычно не одобряется (но, как и во всем, это не правило 100%), потому что это может сделать типы более тесно связанными и труднее найти.

Модули VB.NET являются чем-то вроде исключения ( edit : на самом деле это скорее трюк компилятора / синтаксический сахар), но обычно все в экосистеме .NET содержится в пространстве имен.

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


Обновление: при работе только с несколькими типами пространств имен кажется не слишком полезным, но без них проект любого размера был бы организационной катастрофой. Представьте себе .NET Framework без пространств имен, один (вероятно, давно устаревший) счетчик устанавливает для платформы 3500 типов.

Пространства имен похожи на папки или ящики для документов; с несколькими простыми бумагами легко работать, но если у вас много страниц, то найти нужную вам становится больно.

Прочитайте документацию, она короткая и не очень сложная (как и пространства имен), но имеет пару приличных точек MSDN - Пространство имен (c #)

4 голосов
/ 26 февраля 2010

Если это многоцелевой делегат, такой как Func<TResult>, EventHandler, который не связан с конкретным классом, то вы должны объявить его непосредственно в пространстве имен.

2 голосов
/ 26 февраля 2010

Ваша формулировка («что может быть возможным при объявлении типов в пространстве имен, но не в классе.») Указывает, что вы проводите различие между «типами» и «классами». Здесь ничего нет. Класс это тип.

Итак, при каких условиях вы хотите объявить класс непосредственно в пространстве имен (то есть, как это обычно делается)? Эти же причины относятся и к другим типам.

0 голосов
/ 26 февраля 2010

Пространства имен и классы могут использоваться для организации информации в иерархии. Однако пространства имен позволяют распределять определение через границы dll, а классы - нет. Классы также должны указывать имя класса перед именем типа, но пространства имен позволяют использовать ключевое слово «using».

Таким образом, если вы хотите определить делегатов в одном пространстве имен в разных библиотеках, вы используете пространства имен.

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

...