C # /. NET'te yalnızca ad alanı sınıf görünürlüğü?


88

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)


Sorunuzu anlamadım. Cevaplarımı "dahili" demek istemediğiniz için mi kaldırdım?
Zyphrax

3
@nos: java'nın paket düzeyinde görünürlüğünün eşdeğerini mi arıyorsunuz?
John Saunders

Yanıtlar:



80

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 .


1
Bir örnek buldum:System.Net.Mime.MediaTypeNames.Application
Bitterblue

Makale, her çağrının başına "ad alanı" adınızı eklemeniz gerektiğini söylüyor, ancak buna C # 6'da "statik kullanarak" ihtiyacınız yok. "
Ad

@Pumkko Sınıfın 'using static' ifadesini kullanabilmesi için statik olması gerekmez, ancak onu bir ad alanı olarak kullanıyorsanız, o zaman yine de olmalıdır.
Fuzzy Logic

21

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.


@ShuggyCoUK: genel sınıf Alt: Dış, genel sınıf kapalı olmalıdır Alt: Dış ??? +1 olsa da ... benim için çalışıyor
IAbstract

0

Tek bir derlemeniz varsa, bu derlemede istediğiniz kadar ad alanı tanımlayabilirsiniz, ancak IDE'de hangi değiştiriciyi uygularsanız uygulayın, sınıfları her zaman diğer ad alanlarında görebileceksiniz.


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.