indiscutabil, nulls sunt unul dintre cele mai grave cosmaruri ale dezvoltatorului și provoacă un număr mare de erori la timpul de aplicare. Lipsa de instrumente pentru a le trata în mod corespunzător face coexistența cu oile negre a valorilor posibile care trebuie aplicate la o variabilă. În acest articol din Manualul .NET vom încerca să aruncăm puțină lumină și să vă spunem soluțiile pe care tehnologia le oferă pentru a trăi cu valorile nulă.
și este că cu puțin pe care l-ați dezvoltat , sigur că ați întâmpinat vreodată sarcina dificilă de a atribui o valoare nulă la o variabilă de tip de valoare (Int, Float, Char …) în cazul în care nu se potrivește mai mult decât utilizarea trucurilor dificil de efectuat, urmărire și documentare. De exemplu, având în vedere o clasă de clasă cu o proprietate de tip întreg numită Vârstă, ce se întâmplă dacă luăm un obiect al clasei menționate dintr-o bază de date dacă câmpul nu a fost obligatoriu în acest lucru?
a priori, ușor: La citirea din baza de date, verificăm dacă este nulă și, în acest caz, atribuim proprietatea valorii clasei -1. Patch-ul bun, fără îndoială.
Cu toate acestea, optând în general de această idee prezintă mai multe dezavantaje. În primul rând, pentru a fi credincios realității, dacă dorim să stocăm din nou acest obiect în baza de date, ar trebui să se facă schimbarea inversă, adică pentru a verifica dacă vârsta este -1 și în acest caz salvați în câmpul NULL.
În al doilea rând, fixăm că conducem la artificii de clasă care nu au sens în domeniul problemei care trebuie rezolvate, în entitatea la care reprezintă. Privind la ea puțin de departe, care este sensul unei vârste negative într-o entitate de persoană? Nici unul.
În al treilea rând, există o problemă de coerență în consultări. Dacă am o colecție de oameni în memorie (realizată, de exemplu, folosind tipuri generice) și vreau să știu pe cei care sunt vârsta definită, ar trebui să verifice pentru fiecare element dacă vârsta proprietății lor este în valoare de -1; Cu toate acestea, atunci când efectuați aceeași interogare în baza de date, trebuie să cereți valoarea nulă pe câmpul corespunzător.
Adevărat este că am putea aduce și conceptul la baza de date Conceptul „-1 înseamnă NULL” Câmpul de vârstă, dar … nu ar fi stropirea structurii de date cu o particularitate (și limitare) a limbajului de programare utilizat? O altă idee bizară ar putea fi să introducă vârsta pe un șir și o problemă rezolvată: lanțurile, fiind un tip de referință pot conține null fără probleme, totuși este necesar să recunoaștem că ordonările ar fi regulate; -)
prin Ultima și, în loc de vârstă, unde, în mod clar, nu pot exista negative, vorbim despre clasa povestitorului și despre proprietatea lui dartal? Aici este clar că utilizarea negative nu este o resursă validă.
soluții, în afară de comentate, există pentru toate gusturile. Ar putea, de exemplu, să adauge, de exemplu, o proprietate booleană paralelă care a indicat dacă câmpul de vârstă este nul (o lucrare suplimentară, în special fără mai multe proprietăți, aceste valori sunt) sau încapsulează vârsta într-o clasă care încorporează tratamentul logic al acestei nul.
În orice caz, soluțiile posibile sunt lucrătorii, uneori complexe și, mai presus de toate, prea artificiale pentru a fi ceva de zi cu zi, deoarece este un câmp simplu nul.
conștient de el, c # Designerii au luat deja în considerare în versiunea sa 2.0 o caracteristică interesantă: tipuri de nullable sau tipuri anuale, un mecanism care permite nul în viața noastră într-un mod non-traumatic.
Următoarea linie a generat o eroare în eroare. Compilație, care a spus, și nu a lipsit motivul, că „nu poate fi convertit nul în” int „, deoarece este un tip de valoare”:
int s = null;
din C # 2.0, este posibil să se facă următoarele:
int? s;
s = null;
s = 1;
Respectați interogarea cu tipul, care este indicarea ca variabila S să fie întregi, dar acceptă și o valoare nulă. /p>
în interior, acest lucru funcționează după cum urmează: int? Este un alias al sistemului de tip generic. De fapt, am putea folosi indistinct oricare dintre cele două moduri de ao exprima. Interne o structură este creată cu două proprietăți de citire: Hasvalue, care se întoarce dacă variabila în cauză are valoare și valoare, care conține valoarea în sine.
Se înțelege că o variabilă cu Hasvalue egală cu False conține valoarea nulă, iar dacă încercăm să o accesăm prin valoare, va fi lansată o excepție.
Cu toate acestea, principalul avantaj pe care îl au este că sunt utilizate ca și cum ar fi un tip de valoare tradițională. Tipurile anulare se comportă practic le place și oferă acelorași operatori, deși trebuie să ia în considerare particularitățile lor, după cum se poate vedea în următorul cod:
int?A = 1;
int? b = 2; int? Innulo = null;
bool? Da = adevărat;
Bool? NU = FALSE;
BOOL? Nisinino = null;
Console.Writeline (A + B); // 3
Console.Writeline (A + INTNULO); // nimic, este null
Console.Writerine (a * intnulo); // nimic, este null
Console.Writeline (dacă & Nu); // FALSE
Console.Writeline (dacă & Nu); // Adevărat
Console.Writeline (da & nisinino); // nimic, nu este null
console.writelin (nu & nisinino); // Fals
Console.Writeline (Si | Nisinino); // TRUE
Console.Writeline (Nu | Nisinino); // nimic, nu este nul
putem crea tipuri anuale de orice tip de cadru: int?, plutitor?, dublu?, char?, etc.
și de fapt, ca tipuri de valoare care sunt, o putem face și cu enumerări. Următorul exemplu ar fi incorect:
stare de stat1 = stare.correct;
Stat2 = null;
A doua linie determină eroarea în compilație „Null nu poate fi convertit în „consoleplicare1.program.State” deoarece este un tip de valoare. ” Logic, este același lucru ca și cum am încerca să atribuim valoarea nulă null unui număr întreg.
Acest lucru poate provoca un disconfort ușor pentru gestionarea valorilor „nedeterminate”, deoarece am fi nevoie, de exemplu, la Utilizați un alt membru al enumeramului pentru a reprezenta această valoare, ca și în următorul cod în Visual Basic .NET:
Public Enum State la indeterminate = 0 CORECTO = 1
Incorect = 2
Enlu Enum
Cu toate acestea, există momente când este mai interesant să puteți avea o valoare nulă ca opțiune pentru variabilele tipului de enumerare. Pentru a face acest lucru, putem folosi aceeași sintaxă pe care am văzut-o anterior:
‘vb.net
Starea Dim1 ca nullabilă (de stat) = State.Correct
Stat2 = Nimic // C #
State? STAT1 = Status.Correct;
Stare? STAT2 = null;