C #'daki ad alanları ile Java'daki paketler arasındaki fark (kullanım açısından) nedir?
Yanıtlar:
Gönderen: http://www.javacamp.org/javavscsharp/namespace.html
Paketler, tür çatışmalarını önlemek için dosyaları veya genel türleri düzenlemek için kullanılır. Paket yapıları bir dosya sistemine eşlenebilir.
system.security.cryptography.AsymmetricAlgorithm aa;
değiştirilebilir:
import system.security.Crypography;
class xxx { ...
AsymmetricAlgorithm aa;
Paketler için takma ad yoktur. Belirli bir türü belirtmek için import deyimini veya tam nitelikli adı kullanmanız gerekir.
package n1.n2;
class A {}
class B {}
veya
package n1.n2;
class A {}
Başka bir kaynak dosya:
package n1.n2;
class B {}
Paket yuvalanamaz. Bir kaynak dosyada yalnızca bir paket ifadesi bulunabilir.
Ad alanları, hem bir program için "dahili" bir organizasyon sistemi hem de "harici" bir organizasyon sistemi olarak programları düzenlemek için kullanılır.
System.Security.Cryptography.AsymmetricAlgorithm aa;
değiştirilebilir:
using System.Security.Crypography;
AsymmetricAlgorithm aa;
Alternatif olarak, ad alanı için bir takma ad belirtilebilir, örn.
using myAlias = System.Security.Crypography;
ve sonra sınıfa bakın
myAlias.AsymmetricAlgorithm
namespace N1.N2
{
class A {}
class B {}
}
veya
namespace N1
{
namespace N2
{
class A {}
class B {}
}
}
Farklı olan birkaç ayrıntı var.
Java'da dizin yapısı paket yapısıyla eşleşmelidir. C # 'da böyle bir kısıtlama yok.
C # 'da bir dosyada birden çok ad alanınız olabilir. Java'da bir dosya tek bir pakete aittir (öncekine bakın).
Java'nın varsayılan / paket erişilebilirliği vardır. C # dahili erişilebilirlik derlemelerde gider.
VS ve Eclipse kullanırsanız ve projeyi yapılandırmalarına izin verirseniz, o zaman farklılıkları çok fazla hissetmeyeceksiniz.
Java'da "ad alanı" diye bir terim yoktur - bir paket , adlar için bir kapsam sağlama açısından Java'da bir ad alanı görevi görür . Ayrıca erişilebilirlik modelinin bir parçasıdır.
Gönderen Java Dil Şartname bölüm 7 :
Programlar, paketler halinde düzenlenmiştir. Her paketin türler için kendi isimleri vardır, bu da ad çakışmalarını önlemeye yardımcı olur. Paketin dışında, yalnızca türün genel olarak bildirilmesi durumunda bunu bildiren üst düzey bir türe erişilebilir (§6.6).
DÜZENLEME: Tamam, açıklamadan sonra: bir Java paketi, erişilebilirlik üzerinde bir etkiye sahip olması dışında C # ad alanına benzer , oysa C # ad alanlarında ve erişilebilirlik tamamen ortogonaldir.
C ++ / C # 'da, ad alanları yalnızca farklı yerlerde bir değişken için yanlışlıkla aynı adı kullanarak çarpışmaları önlemek için adları bölümlemek için kullanılır.
Java'da paketler bundan çok daha fazlasıdır - paketler modüller için kullanılır, adlandırma yönü bunun sadece bir parçasıdır.
Java'da, paketleriniz üzerinde etkisi olacak çeşitli erişim belirteçlerini sınıflara uygulayabilirsiniz.
korumalı: aynı paket ve başka bir paketteki alt sınıfları için erişilebilir, varsayılan: aynı paket için erişilebilir, genel: evrensel olarak erişilebilir, özel: aynı paket tarafından erişilemez bile.
Bu tür erişim tanımlayıcıları, c Sharp'daki ad alanı için geçerli değildir.
Ad alanı tıpkı yeni bir klasör gibidir, tüm alt klasörler alt ad alanlarıdır. Bir ad alanını, pazarlama ad alanı altında bir ad alanı reklamcılığına sahip olduğumuz gibi bir işlev olarak kabul edersek, marketing.advertising.adsclass.adsmethod'u kullanırız. Bir sorunu çözmek çok kolay. Java, paket yoluyla aynı yönteme sahiptir, ancak yeni gelenler için karmaşıktır.
C #
ad alanı pazarlaması {
class admissions{
int admissions_method(){
}
}
namespace advertising{
class advertisement{
void ad_in_newspaper( int no_of_lines){
}
void ad_on_tv(int seconds){
}
}
}
İstemci sınıfında kullanmak için
using marketing;
using marketing.advertising;
Java'da da aynı yöntemi kullanıyorsunuz. Tek bir pakette birden çok sınıfı paketleyip birçok kez kullanırsınız. Benzersizliği artırır. Bir kez yazıyorsun ve birçok kez kullanıyorsun. Tek bir pakette ilgili sınıflar. Birçok kez kodlamaya gerek yok.
import system.security.crypography.AsymmetricAlgorithm;. Java'da olduğu için bir paketi değil, bir sınıfı içe aktarmanız gerekir. Bir paketteki tüm sınıfları bir paket ile içe aktarmak mümkündür,import package.*ancak bu da paketi değil sınıfları içe aktarır.