C # 'da, farklı bir derlemede yaşamadan bir sınıfı yalnızca kendi ad alanı içinde görünür yapabilir misiniz? Bu, başka yerde kullanılmaması gereken tipik yardımcı sınıflar için yararlı görünüyor. (yani Java'nın paket-özel sınıfları dediği şey)
C # 'da, farklı bir derlemede yaşamadan bir sınıfı yalnızca kendi ad alanı içinde görünür yapabilir misiniz? Bu, başka yerde kullanılmaması gereken tipik yardımcı sınıflar için yararlı görünüyor. (yani Java'nın paket-özel sınıfları dediği şey)
Yanıtlar:
İstediğinin mümkün olduğunu sanmıyorum.
Sınıfları oluşturabilirsiniz, internalancak bu yalnızca derlemenin dışındaki herkesin sınıfı kullanmasını engeller . Ama yine de bunu yapmak istediğiniz her ad alanı için ayrı bir derleme yapmanız gerekir. Sanırım neden olduğunu tahmin ediyorum olmaz bunu yapmak istiyorum.
Ad Alanı Görünürlüğünü Zorlamak için C # Derleyicisini Alma
Burada, yararlı bulabileceğiniz bir "sahte ad alanı" biçimi olarak kısmi sınıfları kullanma yöntemini gösteren bir makale ( C # 'de Ad alanı görünürlüğü ) bulunmaktadır.
Yazar, bunun mükemmel çalışmadığına dikkat çekiyor ve eksiklikleri tartışıyor. Ana sorun, C # tasarımcılarının C # ' ı bu şekilde çalışmayacak şekilde tasarlamasıdır . Bu, .NET Framework'ün en büyük avantajlarından biri olan C # /. NET'te beklenen kodlama uygulamalarından büyük ölçüde sapmaktadır.
Güzel bir numara… şimdi yapmayın .
System.Net.Mime.MediaTypeNames.Application
dahili derleme (kesinlikle modül) gizliliğidir. Ad alanı görünürlüğü üzerinde hiçbir etkisi yoktur.
Aynı derlemedeki diğer sınıflardan bir sınıfın gizliliğini sağlamanın tek yolu, bir sınıfın bir iç sınıf olmasıdır.
Bu noktada, eğer sınıf özelse, o sınıfta veya dış sınıfın kendisinde olmayan hiçbir şey için görünmezdir.
Korunuyorsa, onu özelken görebilen ancak dış sınıfın alt sınıfları tarafından da görülebilen herkes tarafından görülebilir.
public class Outer
{
private class Hidden { public Hidden() {} }
protected class Shady { public Shady() {} }
public class Promiscuous { public Promiscuous() {} }
}
public class Sub : Outer
{
public Sub():base()
{
var h = new Hidden(); // illegal, will not compile
var s = new Shady(); // legal
var p = new Promiscuous(); // legal
}
}
public class Outsider
{
public Outsider()
{
var h = new Outer.Hidden(); // illegal, will not compile
var s = new Outer.Shady() // illegal, will not compile
var p = new Outer.Promiscuous(); // legal
}
}
Özünde, arzu ettiğiniz şeyi elde etmenin tek yolu, dış sınıfı bir ad alanı biçimi olarak kullanmak ve bu sınıf içinde kısıtlamaktır.
Doğrudan mümkün olup olmadığından emin değilim, ancak sahte olmanın birkaç iyi yolu şunlar olabilir:
1) Bu tür şeylere ihtiyaç duyan sınıfların, dahili sınıf olarak yardımcı sınıfa sahip tek bir sınıftan miras almasını sağlayın.
2) Uzantı yöntemlerini kullanın ve ardından yalnızca ad alanı içindeki uzantı yöntemlerine başvurun.