Hvorfor eksisterer null i .NET?

 C Programming >> C Programmering >  >> Tags >> .NET
Hvorfor eksisterer null i .NET?

Det har vi Tony Hoare, en tidlig pioner, der arbejdede på Algol, at takke for. Han fortryder det snarere:

En milliard er et lavt tal, tror jeg.

OPDATERING:C# version 8 og .NETCore har en anstændig løsning på dette problem. Tjek referencetyper, der ikke kan nulstilles.


Lige så tiltalende som en verden uden null er, det giver en masse vanskeligheder for mange eksisterende mønstre og konstruktioner. Overvej for eksempel følgende konstruktioner, som ville kræve større ændringer, hvis null fandtes ikke

  1. Oprettelse af et array af referencetyper ala:new object[42] . I den eksisterende CLR-verden ville arrays være fyldt med null hvilket er ulovligt. Array-semantik ville skulle ændre sig en del her
  2. Det giver default(T) kun nyttig, når T er en værditype. Brug af det på referencetyper eller ubegrænsede generiske stoffer ville ikke være tilladt
  3. Felter i en struktur, som er en referencetype, skal ikke tillades. En værditype kan 0-initialiseres i dag i CLR, som bekvemt udfylder felter af referencetyper med null . Det ville ikke være muligt i en ikke-nul verden, og felter, hvis type er referencetyper i struct'er, skulle derfor ikke tillades

Ingen af ​​ovenstående problemer er uløselige, men de resulterer i ændringer, der virkelig udfordrer, hvordan udviklere har en tendens til at tænke på kodning. Personligt ville jeg ønske, at C# og .Net var designet med eliminering af null, men det var det desværre ikke, og jeg forestiller mig, at problemer som ovenstående havde lidt at gøre med det.


Dette minder mig om et afsnit af James Burkes "Connections"-serie, hvor munke transskriberede arabisk til latin og først stødte på et nul-ciffer. Romersk aritmetik havde ikke en repræsentation for nul, men arabisk/aramæisk aritmetik havde. "Hvorfor skal vi skrive et brev for ikke at angive noget?" argumenterede de katolske munke. "Hvis det ikke er noget, skal vi ikke skrive noget!"

Heldigvis for det moderne samfund tabte de argumentet og lærte at skrive nulcifre i deres matematik.;>

Null repræsenterer simpelthen et fravær af et objekt. Der er programmeringssprog, som ikke har "nul" i sig selv, men de fleste af dem har stadig noget, der repræsenterer fraværet af et legitimt objekt. Hvis du smider "null" væk og erstatter det med noget, der hedder "EmptyObject" eller "NullNode", er det stadig en null bare med et andet navn.

Hvis du fjerner muligheden for et programmeringssprog til at repræsentere en variabel eller et felt, der ikke refererer til et legitimt objekt, dvs. du kræver, at hver variabel og felt altid indeholder en sand og gyldig objektinstans, så laver du nogle meget nyttige og effektive datastrukturer akavet og ineffektive, såsom at bygge en sammenkædet liste. I stedet for at bruge et null for at angive slutningen af ​​den linkede liste, er programmøren tvunget til at opfinde "falske" objektforekomster for at tjene som listeterminaler, der ikke gør andet end at angive "der er intet her".

At dykke ned i eksistentialismen her, men:Hvis man kan repræsentere tilstedeværelsen af ​​noget, er der så ikke et grundlæggende behov for også at kunne repræsentere fraværet af det?