Deci, cum se face acest lucru în C #? De exemplu, scrieți un calculator și aveți cea mai simplă logică:
Această soluție simplă și elegantă are dreptul la viață, dar are unele probleme:
- Software-ul este schimbabil. Mâine va trebui să adăugați o captură pe modul și apoi va trebui să recompilați clasa. În anumite etape ale proiectului, aceasta nu este o plăcere scumpă pentru consumatorii din clasa ta.
- Codul din formularul curent nu conține verificări de intrare. Dacă le adăugați, comutatorul creste indecent.
Ma Laasot. așa cum spun prietenii mei israelieni.
Mai întâi trebuie să încapsulați codul într-o funcție:
În al doilea rând, trebuie să scapi de comutator:
Ce am făcut? Am făcut definiția operațiilor de la cod la date - de la comutator la dicționar.
Un delegat este un obiect care indică o funcție. Sunând la un delegat, numim funcția pe care o indică. În acest caz, creăm un delegat pentru o funcție care are doi parametri dubli și o dublă creștere. În al doilea rând, creăm o mapare între simbolul de funcționare (+ - * /) și funcția sa.
Astfel, am rezolvat primul dezavantaj: lista de operațiuni poate fi modificată la discreția noastră.
Din nefericire, am avut un delegat inutil și o înregistrare a formei
nu la fel de clar ca
Începând cu C # 2.0, putem rezolva această problemă introducând metode anonime:
Aici, pentru adăugare și scădere, folosesc metode anonime, iar pentru multiplicare și divizare, metode complete. Dar încă prea multă apă.
C # 4.0 cu lambda vine la salvare:
Semnătura func este citită ca Func<тип первого аргумента, тип второго аргумента, тип результата>. Func în sine este același delegat, dar cu generice. Pe lângă comoditatea scrisului, Func acceptă atât metodele lambda, cât și metodele anonime, precum și metodele convenționale și totul sub o singură publicitate. Nu este surprinzător de confortabil?
Astfel, în C #, puteți scrie construcții elegante, tipizate cu puțină sau fără apă.
Haha tot felul de shags funky sunt întrebate?
Eu răspund: C # este un limbaj strict scris, care monitorizează cu strictețe că tipurile se potrivesc și nu cad în timpul runtime-ului. Pentru a încerca să atribuiți tipuri incorecte, acesta atinge mâinile când este compilat. Prin urmare, are nevoie de o indicație formală a tuturor tipurilor implicate.