.net 4.0 - Optimoiiko C # 4 nimitilat pois tavalla, jota aiemmat C # -versiot eivät tehneet?

Translate

Tämä kysymys on kiinnostuksen vuoksi. Työskentelen kolmannen osapuolen kirjaston kanssa ja törmäsin seuraaviin asiakirjoihinCMS.Security.Dummyluokka:

ÄLÄ POISTA TÄTÄ LUOKKAA - Tämä luokka estää kääntäjää pudottamasta kokonaisia nimiavaruuksia .NET 4.0: n alla.

Tietääkö kukaan, vai kukaan voi spekuloida, miksi .NET 4 pudottaisi nimitilan, jos nuken luokka poistettaisiin?

Koska .NET 4 on nimenomaisesti nimetty lähdekoodikommentissa, oletan, että edellisillä C # -versioilla on käyttäytymistä, joka ei vaadi tätä nuken luokkaa. Se on kuitenkin puhtaasti spekulatiivista.

Näyttökuva

documentation

Dekompiloitu lähdekoodi

#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();
    }
}
This question and all comments follow the "Attribution Required."

Kaikki vastaukset

Translate

Vähän arvostettu tosiasia on, että taustalla olevan CLR-tyyppisen järjestelmän näkökulmasta ei ole olemassa "nimitilaa". Pikemminkin se on vain ayleissopimussanomme, että tyyppi, jonka nimessä on pisteitä, on "nimitilan jäsen".Loogisestilakikoodissa ei ole lainkaan eroa:

namespace N
{
    class C  {}
}

ja psuedokoodi:

class N.C {}

C # pakottaa sinut teeskentelemään, että tämä miellyttävä fiktio on todellisuutta, mutta se on vain fiktiota -CLR-tyyppisen järjestelmän näkökulmasta,tietysti. C #-kääntäjän näkökulmasta tietysti nimitilat ovat "todellisia". Ne eivät vain vastaa metatiedoissa mitään muuta kuin osan tyypin nimestä.

Lyhyesti sanottuna: jos teet kokoonpanon "tyhjällä" nimiavaruudella, niin "nimitilaa" ei ole lainkaan käännetyssä binaarissa. "Nimitila" syntyy vasta, kun kirjastossa on tyyppiä, jonka nimessä on pisteitä.

Miksi nyt välität siitä, että "tyhjällä" nimiavaruudella on jonkin verran läsnäoloa binäärimuodossa, minulla ei ole aavistustakaan.

Oletan, että edellisillä C # -versioilla on käyttäytymistä, joka ei vaadi tätä nuken luokkaa

Ei. Jokainen C # -versio versiosta 1.0 lähtien heittää tyhjät nimitilat.

Lähde
Translate

Ottaen huomioon, että nimiavaruudessa ei ole jäseniä (ilman kyseistä luokkaa), en ole varma, että siellä on edeskonseptinimitilaa siinä vaiheessa ... enkä uskoisi sen olevan hyödyllistä joka tapauksessa.

Olen juuri yrittänyt toistaa tämän C # 2-kääntäjällä, enkä näe mitään jälkeä tyhjästä nimitilasta IL: ssä.

Lähde
Translate

Ainoa osittain liittyvä asia, jonka voin ajatella, on se, että koottaessani projektia msbuildissa epäsuoria viitteitä ei aina kopioida nykyisen sovelluksen roskakorihakemistoon. Jos kirjasto B viittaa epäsuorasti vain kirjastoon A ja kirjastoon C viitteisiin B, kirjaston A tulosta ei välttämättä kopioida bin-kansioon kirjastoa C kääntäessä. Aikaisemmin olen käyttänyt luokassa null-viittausta varmistaaksesi, että riippuvuus on selkeä ja lähtö on otettu käyttöön oikein. Ehkä alkuperäiset kehittäjät kokivat jotain vastaavaa ja tämä oli heidän ratkaisunsa?

Lähde
Kirjailijasta