Soru C # 4, önceki C # sürümlerinin yapmadığı bir şekilde ad alanlarını optimize eder mi?


Bu soru, ilgi uyandırmak içindir. Bir üçüncü taraf kitaplığı ile çalışıyorum ve aşağıdaki belgelere rastladım. CMS.Security.Dummy sınıf:

BU SINIFI SİLMEYİN - Bu sınıf derleyicinin   .NET 4.0 altında tüm ad alanı bırakılıyor.

Kimse biliyor mu, yoksa kimse kukla sınıf çıkarılırsa .NET 4 ad alanını düşürecek diye kimbilir?

.NET 4 açıkça kaynak kodu yorumunda adlandırıldığı için, önceki C # sürümleri bu dummy sınıfı gerektirmeyen davranış sergilediğini varsayalım. Ancak bu tamamen spekülatif.

Ekran görüntüsü

documentation

Decompiled Kaynak Kodu 

#region Assembly CMS.SettingsProvider.dll, v4.0.30319
// ...\solution\wwwroot\Bin\CMS.SettingsProvider.dll
#endregion

using System;

namespace CMS.Security
{
    // Summary:
    //     DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping
    //     entire namespace under .NET 4.0.
    public class Dummy
    {
        // Summary:
        //     DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping
        //     entire namespace under .NET 4.0.
        public Dummy();
    }
}

44
2018-03-05 21:40


Menşei


Kütüphanenin pre-.NET 4.0 sürümünde böyle bir şey olup olmadığını görmek ilginç olurdu. - AakashM
IIRC ad alanları, CIL'de ayrı varlıklar olarak mevcut değildir - yalnızca nitelikli tür adlarının bir parçası haline gelirler. (CLI'nin tüm sürümleri için geçerli olan ve .NET 4'e özgü olmayan AFAIK). Bu anlamda, @Jon Skeet'in yanıtını destekleyeceğim. - stakx
Şüpheli bir ihtiyaçla ortaya çıkan güzel bir soru :) - Johann Blais
Şimdi kütüphanenin niçin isim alanına ihtiyacı olduğunu bilmek ilginç olurdu. - Konrad Rudolph
Şanslar, 3. taraf kaynağının bu ad alanına başvuran ifadeleri kullanmasıdır. Bu kesmek, kaynaklarını güncellemek zorunda kalmamaları veya daha az olasılıkla, ad alanı üzerinde bağımlılıkları olan istemcilerle geriye dönük uyumluluğa sahip olmaları ihtimalidir. - bryanbcook


Cevaplar:


Biraz takdir edilen bir gerçek, altta yatan CLR tipi sistemin bakış açısından bir "isim-alanı" diye bir şey olmamasıdır. Aksine, sadece bir Kongre isminde dönemleri içeren bir türün "bir ad alanının üyesi" olduğunu söylüyoruz. mantıken yasal kod arasında hiç fark yoktur:

namespace N
{
    class C  {}
}

ve psuedo-kodu:

class N.C {}

C # bu hoş kurguyu taklit etmeye zorlar, ama sadece bir kurgu - CLR tipi sistemin perspektifinden tabii ki. C # derleyicisinin bakış açısından, tabii ki ad alanları "gerçek" dir. Bir türün adının bir kısmı dışındaki meta verilerdeki hiçbir şeye uymuyorlar.

Kısacası: "boş" ad alanı olan bir derleme yaparsanız, derlenmiş ikili dosyada "ad alanı" hiç mevcut değildir. Bir "isim-alanı" sadece, kütüphanede kendi adıyla dönemleri olan bir tür olduğunda ortaya çıkar.

Şimdi, neden "boş" ad alanının ikili formda bir miktar varlığına sahip olmasını sağlamayı umursuyorsunuz, hiçbir fikrim yok.

Önceki C # sürümlerinin bu kukla sınıfı gerektirmeyen davranış sergilediğini varsayalım

Hayır! C # 'nin 1.0' dan sonraki her sürümü boş ad alanlarını atar.


90
2018-03-05 22:22



Harika cevap / açıklama! - Joseph at SwiftOtter
Boş bir isim alanına sahip olmalarını önemsemenin sebebinin, başka yerlerde ifadeler kullanmaya başvurmaları nedeniyle olduğunu varsaymak isterim. Ad alanı mevcut değilse, deyimi kullanarak derleme zamanı hatası olur. Neden sadece kullanma ifadelerini silmek değil? Kontrole sahip olmayan bazı kod oluşturma araçlarının çıktısı olabilir. (En azından, bu daha önce karşılaştığım durumdur.) - Tadmas


İsim alanının herhangi bir üye içermediği göz önüne alındığında (bu sınıf olmadan), kavram Bu noktada bir ad alanının ... ne de faydalı olacağını umuyorum.

Bunu sadece C # 2 derleyicisiyle yeniden üretmeye çalıştım ve IL içerisinde boş bir ad alanının izini göremiyorum.


23
2018-03-05 21:45





Düşünebildiğim tek yan konu, msbuild'de bir proje derlenirken, dolaylı başvuruların her zaman geçerli uygulamanın bin dizinine kopyalanmamasıdır. Eğer kütüphane B kütüphane A ve kütüphane C referanslarını dolaylı olarak referanslarsa, kütüphane A'yı derlerken, kütüphanenin A çıktısı mutlaka bin klasörüne kopyalanmayacaktır. Geçmişte, bir sınıfta boş alan referansı kullandım. bağımlılık açık ve çıktı düzgün bir şekilde dağıtıldı. Belki de orijinal devler benzer bir şey yaşadılar ve bu onların çözümü miydi?


7
2018-03-05 21:50



Muhakeme konusunda doğru olabilirsiniz, çünkü isim alanının bir amaç için görülmesi beklenir: bir testte bir araç ya da bazı belirsiz kenarlar olabilir. Kim bilir. Belgelerin, isim alanının neden sadece bunun uğruna varolduğunu belirtmesini isterdim. - John K