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

98

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

Mazzy
источник

Ответы:

75

От: 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 {}

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

C #

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

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 {}
    }
}
РуудВанНистелрой
источник
3
отличный ответ, но импорт java не будет работать, я думаю. Так и должно быть import system.security.crypography.AsymmetricAlgorithm;. Поскольку в java вам нужно импортировать класс, а не пакет. Можно импортировать все классы в пакете с import package.*но, который тоже импортирует классы, а не пакет.
Imus
есть ли способ создать пространство имен в Java без использования такого количества папок? namespaceКлючевое слово в Java было бы хорошо.
42

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

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

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

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

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

Acaz Souza
источник
35

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

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

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

РЕДАКТИРОВАТЬ: Хорошо, после уточнения: пакет Java похож на пространство имен C #, за исключением того, что он влияет на доступность, тогда как в C # пространства имен и доступность полностью ортогональны.

Джон Скит
источник
12

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

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

кба
источник
0

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

protected: доступен для того же пакета и его подклассов в другом пакете, по умолчанию: доступен для того же пакета, public: доступен для всех, private: недоступен даже для одного пакета.

Этот тип спецификаторов доступа не применим к пространству имен в c-Sharp.

dasumohan89
источник
-2

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

В C #

'' 'namespace marketing {

           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 вы используете тот же метод. Вы упаковываете несколько классов в один пакет и используете его много раз. Это увеличивает уникальность. Вы пишете один раз и используете много раз. Связанные классы в одном пакете. Не нужно кодировать много раз.

Рашид Иршад
источник
2
Вопрос в разнице между пространствами имен в C # и пакетами в Java. Этот ответ вообще не касается этого.
Йохан