Jaka jest różnica (w zakresie użytkowania) między przestrzeniami nazw w C # a pakietami w Javie?
Odpowiedzi:
Od: http://www.javacamp.org/javavscsharp/namespace.html
Pakiety służą do organizowania plików lub typów publicznych w celu uniknięcia konfliktów typów. Konstrukcje pakietu można odwzorować na system plików.
system.security.cryptography.AsymmetricAlgorithm aa;
można wymienić:
import system.security.Crypography;
class xxx { ...
AsymmetricAlgorithm aa;
Nie ma aliasu dla pakietów. Musisz użyć instrukcji importu lub w pełni kwalifikowanej nazwy, aby wspomnieć o konkretnym typie.
package n1.n2;
class A {}
class B {}
lub
package n1.n2;
class A {}
Inny plik źródłowy:
package n1.n2;
class B {}
Nie można zagnieżdżać pakietu. Jeden plik źródłowy może mieć tylko jedną instrukcję pakietu.
Przestrzenie nazw służą do organizowania programów, zarówno jako „wewnętrzny” system organizacyjny programu, jak i jako „zewnętrzny” system organizacyjny.
System.Security.Cryptography.AsymmetricAlgorithm aa;
można wymienić:
using System.Security.Crypography;
AsymmetricAlgorithm aa;
Alternatywnie można określić alias dla przestrzeni nazw, np
using myAlias = System.Security.Crypography;
a następnie odwołaj się do klasy za pomocą
myAlias.AsymmetricAlgorithm
namespace N1.N2
{
class A {}
class B {}
}
lub
namespace N1
{
namespace N2
{
class A {}
class B {}
}
}
Jest kilka szczegółów, które się różnią.
W Javie struktura katalogów powinna odpowiadać strukturze pakietu. Nie ma takiego ograniczenia w C #.
W C # możesz mieć wiele przestrzeni nazw w jednym pliku. W Javie jeden plik należy do jednego pakietu (patrz poprzedni).
Java ma domyślną dostępność / pakiet. C # wewnętrzna dostępność idzie w zestawach.
Jeśli użyjesz VS i Eclipse i pozwolisz im ustrukturyzować projekt, nie poczujesz zbytnio różnic.
W Javie nie ma takiego terminu jak „przestrzeń nazw” - pakiet działa jednak jak przestrzeń nazw w Javie, jeśli chodzi o udostępnianie zakresu nazw. To także część modelu dostępności.
Z sekcji 7 specyfikacji języka Java :
Programy są zorganizowane jako zestawy pakietów. Każdy pakiet ma własny zestaw nazw typów, co pomaga zapobiegać konfliktom nazw. Typ najwyższego poziomu jest dostępny (§6.6) poza pakietem, który deklaruje go tylko wtedy, gdy typ jest zadeklarowany jako publiczny.
EDYCJA: OK, po wyjaśnieniu: pakiet Java jest podobny do przestrzeni nazw C # - poza tym, że ma wpływ na dostępność, podczas gdy w C # przestrzenie nazw i dostępność są całkowicie ortogonalne.
W C ++ / C # przestrzenie nazw są używane tylko do partycjonowania nazw, aby uniknąć kolizji przez przypadkowe użycie tej samej nazwy dla zmiennej w różnych miejscach.
W Javie pakiety to znacznie więcej niż tylko to - pakiety są używane jako moduły, a aspekt nazewnictwa jest tylko częścią tego.
W java możesz zastosować różne specyfikatory dostępu do klas, które będą miały wpływ na twoje pakiety.
chroniony: dostępny dla tego samego pakietu i jego podklas w innym pakiecie, domyślnie: dostępny dla tego samego pakietu, publiczny: powszechnie dostępny, prywatny: nawet niedostępny dla tego samego pakietu.
Ten typ specyfikatorów dostępu nie ma zastosowania do przestrzeni nazw w cis
Przestrzeń nazw jest jak nowy folder, wszystkie podfoldery są pod-przestrzeniami nazw. Jeśli weźmiemy pod uwagę przestrzeń nazw jako funkcję, tak jak mamy reklamę przestrzeni nazw w przestrzeni nazw marketingowych, używamy marketingu.advertising.adsclass.adsmethod. Bardzo łatwo rozwiązać problem. Java ma tę samą metodę za pośrednictwem pakietu, ale jest złożona dla nowych użytkowników.
W C #
'' 'marketing przestrzeni nazw {
class admissions{
int admissions_method(){
}
}
namespace advertising{
class advertisement{
void ad_in_newspaper( int no_of_lines){
}
void ad_on_tv(int seconds){
}
}
}
Do użycia w klasie klienta
using marketing;
using marketing.advertising;
'' 'W javie używasz tej samej metody. Pakujesz wiele zajęć w jeden pakiet i używasz go wiele razy. Zwiększa wyjątkowość. Piszesz raz i używasz wiele razy. Powiązane zajęcia w jednym pakiecie. Nie ma potrzeby kodowania wiele razy.
import system.security.crypography.AsymmetricAlgorithm;. Ponieważ w java musisz zaimportować klasę, a nie pakiet. Jest możliwe zaimportowanie wszystkich klas w pakiecie z,import package.*ale to również importuje klasy, a nie pakiet.