Разница между пространством имен в С# и пакете в Java

В чем разница (с точки зрения использования) между пространствами имен в С# и пакетах на Java?

Ответ 1

От: http://www.javacamp.org/javavscsharp/namespace.html


Джава

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

system.security.cryptography.AsymmetricAlgorithm aa;

может быть заменено:

import system.security.Crypography; 
class xxx { ...
AsymmetricAlgorithm aa;

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

package n1.n2;
    class A {}
    class B {}

или же

package n1.n2;
   class A {}

Другой исходный файл:

package n1.n2;
   class B {}

Пакет не может быть вложенным. Один исходный файл может иметь только одну инструкцию пакета.

С#

Пространства имен используются для организации программ как в качестве "внутренней" организационной системы для программы, так и в качестве "внешней" организационной системы.

System.Security.Cryptography.AsymmetricAlgorithm aa;

может быть заменено:

using System.Security.Crypography; 
AsymmetricAlgorithm aa;

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

using myAlias = System.Security.Crypography; 

а затем обратиться к классу с

myAlias.AsymmetricAlgorithm 

namespace N1.N2
{
    class A {}
    class B {}
}

или же

namespace N1
{
    namespace N2
    {
        class A {}
        class B {}
    }
}

Ответ 2

Есть несколько деталей, которые отличаются.

В Java структура каталогов должна соответствовать структуре пакета. нет такое ограничение в С#.

В С# вы можете иметь несколько пространств имен в одном файле. В Java один файл принадлежит одному пакету (см. предыдущий).

Java имеет доступ по умолчанию/пакет. Внутренняя доступность С# в сборках.

Если вы используете VS и Eclipse и пусть они структурируют проект, то вы не почувствуете различий много.

Ответ 3

В Java нет такого термина, как "пространство имен" - пакет действует как пространство имен в Java, но с точки зрения предоставления области имен. Это также часть модели доступности.

Из раздела 7 Спецификации языка Java:

Программы организованы в виде наборов пакетов. Каждый пакет имеет свой собственный набор имен для типов, что помогает предотвратить конфликты имен. Тип верхнего уровня доступен (§6.6) вне пакета, который объявляет его только в том случае, если тип объявлен публичным.

EDIT: Хорошо, после разъяснения: пакет Java похож на пространство имен С#, за исключением того, что он влияет на доступность, тогда как в пространствах имен С# и доступности полностью ортогональны.

Ответ 4

В С++/С# пространства имен используются только для разделения имен, чтобы избежать коллизий, случайно используя одно и то же имя для переменной в разных местах.

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

Ответ 5

В java вы можете применять различные спецификаторы доступа к классам, которые будут влиять на ваши пакеты.

protected: доступен для одного и того же пакета и его подклассов в другом пакете, default: доступно для одного и того же пакета, общественность: общедоступная, private: даже не доступен для одного и того же пакета.

Эти типы спецификаторов доступа не применимы к пространству имен в c sharp

Ответ 6

Пространство имен похоже на новую папку, все подпапки являются подпространствами имен. Если мы рассматриваем пространство имен как функцию, подобную рекламе в пространстве имен в рамках маркетингового пространства имен, то мы используем marketing.advertising.adsclass.adsmethod. Очень легко решить проблему. Java имеет тот же метод через пакет, но сложный для новичков.

В С#

'' 'маркетинг пространства имен {

           class admissions{
                     int admissions_method(){
                     }
           }
     namespace advertising{
           class  advertisement{
                    void ad_in_newspaper( int no_of_lines){
                    }
                    void ad_on_tv(int seconds){
                    }

     }

}

Использовать в классе клиента

using marketing;
using marketing.advertising;

"В Java вы используете тот же метод. Вы упаковываете несколько классов в один пакет и используете его много раз. Это увеличивает уникальность. Вы пишете один раз и используете много раз. Связанные классы в одном пакете. Не нужно много раз кодировать.