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