2014-12-18 4 views
5

Я рассматриваю эти два сценария:пространство имен против класса вложенности

class StructuralCase 
{ 
    class Structure 
    { 
     ... 
    } 
    class Material 
    { 
     ... 
    } 
    class Forces 
    { 
     ... 
    } 
} 

и

namespace StructuralCase 
{ 
    class Structure 
    { 
     ... 
    } 
    class Material 
    { 
     ... 
    } 
    class Forces 
    { 
     ... 
    } 
} 

Дело в том, что внутри «StructuralCase» Я не буду объявить переменные экземпляра, например, это будет функционировать как «родительский» для остальных классов.

Это заставило меня рассмотреть возможность преобразования StructuralClass в пространство имен. Что ты об этом думаешь? Есть ли какое-то жесткое правило?

+1

Вы пытаетесь ограничить видимость вложенных классов? Почему вы даже рассматриваете гнездование? – BradleyDotNET

+0

Родительский класс? Вы имеете в виду класс с внутренними классами? Я думал, что это возможно только на Java ... – nbro

+0

@nbro вложенные классы действительны в C# слишком –

ответ

4

У вас есть две разные вещи.

Первый сценарий class example:

У вас есть внутренний класс с 3-х вложенных частных классов

В вашем втором сценарии namespace example:

У вас есть 3 внутренних независимых классов с не вложенности.

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

+1

Простой и эффективный. Я знал это, но не учитывал это. Я пойду на «пространство имен», поскольку эти кланы не связаны друг с другом. –

2

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

Класс имеет больше структуры, переменных и методов и предлагает уровни наследования, но если они вам не нужны, не используйте Class.

+1

Добро пожаловать в stackoverflow! Я вижу, что вы сначала ответили, плюс один для этого, но другие ответы были более подробными. Но это был хороший первый ответ. Ура! –

2

Как правило, вы хотите использовать namespace, хотя бы потому, что он включает операторы using - в противном случае вы должны обращаться к классу всеми вложенными классами (за исключением самого родительского класса, конечно). Таким образом, в случае 1, за пределами ссылка будет есть сказать

StructuralCase.Structure s = ... 

вместо

using StructuralCase; 
// ... 
Structure s = ... 

Функционально единственная реальная причина, чтобы сделать вложенный класс

  • Так что вложенная type имеет доступ к непубличным членам родительского типа (и вы почему-то ненавидите internal)
  • Чтобы подкласс не был доступен за пределами родительского класса (например, конкретный struct, используемый для получения результатов конкретного запроса)
  • Чтобы дочерний класс мог совместно использовать некоторые общие параметры из родительского класса (например, фабричные классы для общие типы.)
Смежные вопросы