See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 20516|Vastuse: 0

[Nõuanded] 47 viisi C# programmi optimeerimiseks

[Kopeeri link]
Postitatud 15.03.2018 10:41:59 | | |

1. Asenda ligipääsetavad väljad atribuutidega

1、. .NET andmete sidumine toetab ainult andmete sidumist ning andmete sidumise eeliseid saab kasutada atribuutide abil.
2. Juurdepääsu määramise ja määramise funktsioonis saad lukku kasutada, et lisada mitmelõimelise tugi.

2. ainult lugemine (käitusaja konstant) ja const (kompileerimisaja konstant)

1. const saab kasutada ainult primitiivsete tüüpide, enumite ja stringide jaoks, samas kui ainult read-only võib olla mis tahes tüüpi;
2. const asendatakse kompileerimise ajal kindla konstandiga, nii et kui viites kasutatakse nii const kui ainult lugemiskõlblikke väärtusi, muudab ainult readonly'i muutmine disaini algset eesmärki, milleks on vajadus kompileerida muudetud assembler, et viidata uuele konstantväärtusele.
3. Const on tõhusam kui ainult lugemine, kuid kaotab rakenduse paindlikkuse.

3. IS ja AS

1. Mõlemad on käitusajal tüübi teisendused, kuna operaatoreid saab kasutada ainult viitetüüpides, samas kui see võib kasutada väärtusi ja viitetüüpe;
2. Tavapärane praktika on kasutada IS tüübi määramiseks ning seejärel valida selektiivselt tugeva tüübi teisendusoperaatori (teisenduse määramisel operaatori poolt).

4. ConditionalAttribute asemel #if #endif条件编译

1. ConditionalAttribute'i kasutatakse ainult meetodi tasemel ning muud elemendid nagu tüübid, atribuudid jne on kehtetud. Ja #if #endif则不受此限制;
2. ConditionalAttribute võib lisada mitu OR (OR) operatsiooni kompileerimistingimuste jaoks ning #if #endif则可以添加与(AND) [siin saab täielikult defineerida teise eraldi sümbolina];
3. ConditioanlAttribute definitsiooni saab paigutada eraldi meetodisse, et muuta programm paindlikumaks.

5. Esita ToString() meetod

1. See suudab pakkuda kasutajatele üksikasjalikku teavet sõbralikumal viisil;
2. Kasuta IFormatter.ToString() meetodit, et pakkuda paindlikumat kohandamist, ja kui lisad IFormatProvider ja ICustomFormatter liidesed, on mõistlikum sõnumi väljundit kohandada.

6. Väärtuse ja viitetüübi erinevus

1. Väärtustüübid ei toeta polümorfismi, mis sobib rakenduste poolt juhitavate andmete salvestamiseks, samas kui viited toetavad polümorfismi, mis sobib rakenduse käitumise määratlemiseks.
2. Väärtustüüpidena määratletud massiivide puhul saab programmi jõudlust oluliselt parandada;
3. Väärtustüübil on vähem kuhjamälu fragmentiseerumist, mälu prügi ja kaudse ligipääsu aega ning selle tagasitulek meetodis toimub replikatsioonina, et vältida sisemise struktuuri paljastamist välismaailmale.
4. Väärtustüüpe kasutatakse järgmistes stsenaariumites: Tüüpide vastutust kasutatakse peamiselt andmete salvestamiseks; Avalikud liidesed on täielikult määratletud mõnede andmeliikmete ligipääsu atribuutidega; Alamklasse ei ole kunagi; Polümorfset käitumist ei ole kunagi.

7. Väärtustüübid tuleks rakendada võimalikult konstantsed ja aatomilised tüübid

1. Muuta meie kood lihtsamini kirjutatavaks ja hooldatavaks;
2. Kolm strateegiat konstantsete initsialiseerimiseks: ehituses; taimemeetod; Koosta muutlik abiklass (nt StringBuilder).

8. Veendu, et 0 on kehtiva staatuse vääriline

1. Väärtustüübi vaikimisi olek peaks olema 0;
2. Enum-tüübi 0 ei tohiks olla kehtetu; FlagsAttribute'is on selleks, et tagada väärtuse 0 kehtiv olek;
3. Kui nöör on tühi, saab nööri tagasi anda. Tühi nöör tühja vastu.

9. Mitmekordsed esindatussuhted võrdse hinnanguga

1. ReferenceEquals() määrab, et viited on võrdsed, ja see peab olema tõene, kui mõlemad viitavad samale objektile.
2. Staatilist Equals() meetodit kasutatakse esmalt viitehinnangu tegemiseks ja seejärel väärtustüübi hindamiseks;
3. Viitetüübi hindamiseks saab väärtussemantika kasutamisel kasutada ümberkirjutamise meetodit Equals().
4. Equals() meetodi ümberkirjutamisel tuleb ümber kirjutada ka GetHashCode() meetod ning operater==() operatsioon tuleks samal ajal esitada.

10. Mõista GetHashCode() meetodi puudusi

1. GetHashCode() rakendatakse ainult räsipõhiste ** defineeritud võtmete, nagu HashTable või Dictionary, räsiväärtustele;
2. GetHashCode() peaks järgima vastavaid kolme reeglit: kaks võrdset objekti peaksid tagastama sama räsikoodi; peaks olema invariant; Räsifunktsioon peaks genereerima juhusliku jaotuse kõigi täisarvude vahel.

11. Anna prioriteedi foreach loop-lausete kasutamisele

1. foreach võib välistada kompilaatori kontrolli for-tsükli massiivi piiri suhtes;
2. Foreach ringmuutuja on ainult lugemiseks ning eksisteerib selge teisendus, mis viskab erandi, kui ** objekti tüüp on vale;
3. **, mida iga jaoks kasutatakse, on: avalik GetEnumberator() meetod; IEnumberdatav liides on selgelt rakendatud. IEnumeratori liides on rakendatud;
4. foreach võib tuua ressursihalduse eeliseid, sest kui kompilaator suudab määrata IDisposable liidese, saab ta kasutada optimeeritud try... lõpuks blokeerimine;

12. Vaikimisi välja initsialiseerimine on parem kui määramislause

1. Välja eluiga initsialiseerib vaikimisi väärtustüübi väärtuse 0-ks ja viitetüübi nulliks.
2. Sama objekti mitu korda inisialiseerimine vähendab koodi täitmise efektiivsust.
3. Välja initsialiseerimise paigutamine konstruktorisse soodustab erandite käsitlemist.

13. Kasuta staatilist konstruktorit staatiliste liikmete initsialiseerimiseks

1. Staatiline konstruktor käivitatakse enne, kui on ligipääs mõnele klassi meetodile, muutujale või atribuudile;
2. Staatilised väljad jooksevad samuti enne staatilist konstruktorit ning staatiline konstruktor soodustab erandite käsitlemist.

14. Kasuta konstruktori ahelat (in. NET 4.0 lahendab selle probleemi juba valikuliste parameetritega)

1. Kasuta seda, et anda initsialiseerimistöö teisele konstruktorile üle ja kasutada baasi kutsumiseks baasklassi konstruktorile;
2. Tüüpeksemplaride operatsioonijada on: sea kõik staatilised väljad 0-ks; Staatiliste välja initsialisaatorite täitmine; staatiline konstruktor, mis täidab baasklassi; Staatilised konstruktorid, mis täidavad praegust tüüpi;
Sea kõik instantsi väljad väärtuseks 0; Käivita instantsi välja initsialiseerijad; Käivita sobiv baasklassi instantsi konstruktor; Käivita praeguse tüübi instantsi konstruktor.

15. Kasuta kasutamist ja proovi/lõpuks lauseid ressursside puhastamiseks

IDisposable liidese Dispose() meetodis saab GC.SuppressFinalize() abil teavitada prügikogujat, et lõplikku operatsiooni enam ei tehta.

16. Mälujäätmete minimeerimine

1. Objektide eraldamine ja hävitamine kuhjas võtab protsessori jaoks lisaaega;
2. Määratud objektide arvu vähendamise tehnikad: sageli kasutatavad lokaalsed muutujad tõstetakse väljadeks; Pakub klassi, mis salvestab levinud Singletoni objektide eksemplare, mis väljendavad kindlaid tüüpe.
3. Kasuta StringBuilderit keerukate stringitoimingute tegemiseks.

17. Vähenda pakkimist ja lahtipakkimist

1. Pööra tähelepanu tüübi kaudsele teisendamisele System.Object-iks ja väärtustüüpi ei tohiks asendada System.Object tüübiga;
2. Liideste kasutamine tüüpide asemel aitab vältida karpimist, st väärtustüüpide rakendamist liidestest ja seejärel liikmete kutsumist liideste kaudu.

18. Rakenda standardset Hävitamisrežiimi

1. Mitte-mäluressursside kasutamiseks peab olema lõplik lahendus, prügikoguja lisab realiseerija objektid lõpetamisjärjekorda pärast nende mäluobjektide lõpetamist, mis neid pole lõpetanud, ning seejärel alustab prügikoguja uut lõime, et käivitada lõplikud objektid. See aitab vältida mälulekke probleemi, mis tekib haldamata mäluressursside vabastamise tõttu.
2. IDisposable.Dispose() meetodi kasutamine nõuab nelja tööaspekti: kõigi haldamata ressursside vabastamist; Vabasta kõik hallatavad ressursid; Sea olekumärk, mis näitab, kas Dispose() on käivitatud; Kutsu GC.SuppressFinalize(this), et tühistada objekti lõpetamisoperatsioon;
3. Lisa kaitstud virtuaalne meetod Dispose() tüübile, mis vajab polümorfismi, ja tuletatud klass vabastab oma ülesande, kirjutades selle meetodi ümber.
4. Tüübis, mis vajab IDisoposeeritavat liidest, peaksime rakendama terminaatori isegi siis, kui seda pole vaja.

19. Määratleda ja rakendada liidesed pärilustüüpide üle

1. Mitteseotud tüübid saavad ühiselt rakendada ühist liidest ning liidese rakendamine on lihtsam kui pärilikkus;
2. Liides on suhteliselt stabiilne, see kapseldab funktsioonide komplekti liideses teiste rakenduslepingute tüübina, samas kui baasklassi saab aja jooksul laiendada.

20. Erista liidese rakendamist ja virtuaalse meetodi ümberkirjutamist

1. Baasklassis liidese rakendamisel peab tuletatud klass kasutama new meetodit, et varjata baasklassi meetodit;
2. Baasklassi liidese meetodit saab deklareerida virtuaalse meetodina ja seejärel rakendada tuletatud klassis.

21. Kasuta usaldamist tagasikutsete väljendamiseks

1. Delegaat ise ei paku erandite püüdmist, seega lõpetab iga multisaate delegaadi kõne kogu kõneahela.
2. Kuvades ja kutsudes iga delegeerimise sihtmärki delegaatide ahelas, saad vältida mitmiksaate delegaadid tagastamast ainult viimase delegaadi väljundi.

22. Kasuta sündmusi väliste liideste määratlemiseks

1. See tuleks deklareerida ühiseks sündmuseks ja lasta kompilaatoril luua meie jaoks lisamis- ja renmove-meetodid.
2. Kasuta System.ComponentModel.EventHandlerList konteinerit, et salvestada iga sündmuste käsitleja, ja varjata kõigi sündmuste keerukust, kui tüüp sisaldab suurt hulka sündmusi.

23. Väldi viidete tagastamist sisemistele klassiobjektidele

1. Kuna väärtustüübi objekti ligipääs loob objekti koopia, ei muuda väärtustüübi määratlemise atribuudid üldse olekut tüübi objekti sees;
2. Konstantsed tüübid võivad vältida objekti oleku muutmist;
3. Määratle liides, et piirata ligipääsu alamhulgale, et minimeerida objekti sisemise oleku kahjustusi.
4. Defineeri wrapper-objekt, et piirata ligipääsu teisele objektile;
5. Kui kliendikood muudab sisemisi andmeelemente, saab rakendada vaatlejarežiimi, et objekt saaks muudatusi kontrollida või neile vastata.

24. Deklaratiivne programmeerimine on parem kui imperatiivne programmeerimine

Vigade tekkimise võimalust mitmes sarnases käsitsi kirjutatud algoritmis saab vältida ning tagatakse selge ja loetav kood.

25. Rakenda tüüpe võimalikult serialiseeritavalt

1. Tüüp ei esinda kasutajaliidese juhtimist, akent ega vormi ning tüüp peaks toetama serialiseerimist;
2. Deserialiseeritud atribuuti NonSerializedAttribute lisamisel saab vaikimisi väärtuse laadida OnDeserialization() meetodiga, mis rakendab IDeserializationCallback;
3. Versioonihalduses saab kasutada ISerializable liidest paindlikuks juhtimiseks ning pakkuda serialiseerimise konstruktorit objektide initsialiseerimiseks vastavalt voo andmetele, ning rakendamisel on vaja SerializationFormatter erandite luba.
4. Kui pead looma tuletatud klassi, pead selle tuletatud klassi jaoks pakkuma hook-meetodit.

26. Sorteerimissuhete rakendamiseks kasuta IComparable'i ja IComparer liideseid

1. IComparable liidest kasutatakse tüüpide kõige loomulikuma sorteerimisseose rakendamiseks, nelja võrdlusoperaatori ülekoormamiseks ning CompareTo() meetodi ülekoormatud versiooni pakkumiseks, et aktsepteerida konkreetseid tüüpe parameetritena.
2. IComparerit kasutatakse sorteerimissuhete pakkumiseks, mis erinevad IComparable'ist, või selleks, et pakkuda sorteerimisseoseid, mida tüüp ise ütleb, et neid pole rakendatud.

27. Väldi ICloneable liideseid

1. Väärtustüüpide puhul ei ole vaja toetada ICloneable liidest, vaid kasutada vaikimisi määramisoperatsiooni;
2. Baasklasside puhul, mis võivad vajada ICloneable liideseid, tuleks nende jaoks luua kaitstud replikatsioonikonstruktor ning IConeable liideseid tuleks vältida.

28. Vältige sundkonverteerimise operaatorite kasutamist

Konstruktorite kasutamine konverteerimisoperaatorite asemel muudab konverteerimise töö selgemaks, mis võib kergesti põhjustada kummalisi vigu ajutiste objektide kasutamise tõttu pärast konverteerimist.

29. Kaalu uue modifikaatori kasutamist ainult siis, kui uute versioonide kuhjumine tekitab probleeme

30. Rakendada CLS-ühilduvaid kokkupanekuid nii palju kui võimalik
1. Ühilduva assamblee loomiseks tuleb järgida kahte reeglit: kõik avalikud ja kaitstud assamblee liikmed peavad olema ühilduvad CLS-iga; Iga avalik ja kaitstud liige, kes ei ole CLS-iga ühilduv, peab omama CLS-iga ühilduvat alternatiivi;
2. CLS-i ühilduvuse tüübi kontrolli saab mööda hiilida, rakendades liidese selgesõnaliselt ning CLSCompliantAttribute ei kontrolli privaatsete liikmete CLS ühilduvust.

31. Rakenda võimalikult lühikest ja lühikest meetodit

1. JIT-kompilaator kompileerib meetodite ühikutena ning metode, mida ei kutsuta, ei kompileerita JIT-i poolt;
2. Kui pikemas Switchis asendatakse Case'i kood ühe meetodiga korraga, korrutatakse JIT-kompilaatori poolt säästetud aeg;
3. Lühikesed ja lühikesed meetodid ning vähem lokaalsete muutujate valimine võimaldavad optimeeritud registrikasutust;
4. Mida vähem juhtimisharusid meetodis, seda lihtsam on JIT-kompilaatoril muutujaid registritesse paigutada.

32. Teosta võimalikult palju väikest suurust ja kõrge sidususega kokkupanekuid

1. Pane kõik avalikud klassid ja ühised baasklassid mõnesse assambleesse, pane tööriistaklassid, mis pakuvad funktsioone avalike klasside jaoks, samasse assambleesse, pakendada vastavad avalikud liidesed oma assambleedesse ja lõpuks töödelda klassid, mis on rakenduses horisontaalses asendis;
2. Põhimõtteliselt tuleks luua kahte tüüpi komponente: üks on väike ja koondatud komplekt kindla funktsiooniga ning teine suur ja lai komplekt ühiste funktsioonidega.

33. Tüüpide nähtavuse piiramine

1. Liideste kasutamine tüüpide funktsioonide paljastamiseks teeb sisemiste klasside loomise lihtsamaks ilma nende kättesaadavust väljaspool assemblerit piiramata;
2. Mida vähem avalikke tüüpe on välismaailmale avatud, seda rohkem võimalusi on sul tulevaseks laienemiseks ja muudatuste rakendamiseks.

34. Loo suurte detailidega veebipõhine API

See vähendab masinatevaheliste tehingute sagedust ja koormust, tuues serverile suured operatsioonid ja täpsed täitmised.

35. Ümberkirjutamine on parem kui sündmuste töötlejad

1. Kui sündmuste protsessor teeb erandi, ei kutsuta teisi sündmuste ahelas olevaid protsessoreid, kuid see ei juhtu ümberkirjutatud virtuaalmeetodiga.
2. Ümberkirjutamine on palju tõhusam kui assotsiatiivsete sündmuste protsessorid, mis peavad kogu päringute nimekirja üle iteratsiooni tegema, mis võtab rohkem protsessori aega.
3. Sündmustele saab reageerida käitusajal, suurema paindlikkusega ning sama sündmusega saab seostada mitut vastust.
4. Tavapärane reegel on käsitleda tuletatud sündmust ja ümberkirjutamismeetod on parem.

36. Õiglane kasutus. .NET käitusaja diagnostika

1. System.Diagnostics.Debug\Trace\EventLog pakub kõiki vajalikke tööriistu, et programm saaks lisada käitusajale diagnostikainfot, ning rakendus saab kirjutada süsteemi sündmuste logi, kui EventLog annab selle koostisosa;
2. Lõpuks, ära kirjuta oma diagnostikateeki, .NET FCL-il on juba vajalik põhiteek.

37. Kasuta standardseid konfiguratsioonimehhanisme

1、. .NET raamistiku System.Windows.Application klass määratleb meile omadused, et luua ühine konfiguratsioonitee;
2. Application.LocalAppDataPath ja Application.userDataPath genereerivad kohaliku andmekataloogi ja kasutajaandmete teekonnanimed;
3. Ära kirjuta andmeid ProgramFiles'i ja Windowsi süsteemikataloogidesse, need asukohad nõuavad kõrgemaid turvaõigusi, ära oota kasutajatelt kirjutamisõigusi.

38. Andmete sidumise kohandamine ja toetamine

1. BindingMananger ja CurrencyManager kaks objekti realiseerivad andmeedastuse juhtimise ja andmeallika vahel;
2. Andmete sidumise eelised: andmete sidumine on palju lihtsam kui oma koodi kirjutamine; Seda tuleks kasutada ka muude ulatuste jaoks peale tekstiandmeelementide – ka teisi kuvamisomadusi saab siduda; WindowOS Formsi andmesidemete puhul võimaldab kontrolliga seotud andmeallikate mitmekordset juhtimissünkroniseerimist;
3. Kui objekt ei toeta vajalikke atribuute, saad toetada andmete sidumist, blokeerides praeguse objekti ja lisades soovitud objekti.

39. Kasuta. .NET valideerimine

1. ASP.NET-s on viis kontrolli kehtivuse kontrollimiseks ning CustomValidatoriga saab tuletada uus klass oma autentija lisamiseks.
2. Windowsi valideerimiseks on vaja alam-System.Windows.Forms.Control.Validating sündmuste halduri kirjutamiseks.

40. Vali sobiv ** vastavalt vajadustele

1. Massiivil on kaks ilmset defekti: seda ei saa dünaamiliselt suurust muuta; Suuruse muutmine võtab aega;
2. ArrayList segab ühemõõtmeliste massiivide ja seotud loendite omadusi, Queue ja Stack on spetsiaalsed massiivid, mis põhinevad massiivil;
3. Kui programm on paindlikum elementide lisamisel ja kustutamisel, suudab ta luua vastupidavamaid tüüpe ning klassi loomisel, mis simuleerib **, peaks ta rakendama indekseerijaid ja IEnumberable liideseid.

41. DataSet on parem kui kohandatud struktuur

1. Andmekogumitel on kaks puudust: XML-serialiseerimise mehhanismi abil kasutatavate andmekogumite ja non-.NET koodi vaheline suhtlus ei ole eriti hea; DataSet on väga mitmekülgne konteiner;
2. Tugevad andmekogumite tüübid rikuvad rohkem disainireegleid ning nende arenduse efektiivsus on palju kõrgem kui elegantsematel iseseisvalt kirjutatud disainidel.

42. Kasuta omadusi, et lihtsustada refleksiooni

Disainides ja rakendades funktsiooniklasse, mis sunnivad arendajaid määratlema dünaamiliselt kasutatavaid tüüpe, meetodeid ja atribuute, saate vähendada rakenduse käitusvigu ja parandada tarkvarakasutajate rahulolu.

43. Väldi reflekside liigset kasutamist

1. Invoke'i liikmete kasutatavad parameetrid ja tagastusväärtused on System.Object, mis teisendab tüüpe käitusajal, kuid probleemide tekkimise võimalus on muutunud tõenäolisemaks.
2. Liides võimaldab meil saada selgema ja hooldatavama süsteemi ning peegeldus on väga võimas hiline sidumismehhanism. .NET raamistik kasutab seda andmete sidumise rakendamiseks Windowsi ja veebikontrollide jaoks.

44. Loo rakendusele spetsiifilised erandiklassid

1. Ainus põhjus, miks erinevad erandklassid on vajalikud, on see, et kasutajad saaksid hõlpsasti kasutada erinevaid lähenemisi erinevatele vigadele püüdmisprotsessorite kirjutamisel;
2. Kui võib esineda erinevaid paranduskäitumisi, peaksime looma mitmesuguseid erandklasse, pakkudes kõik erandbaasklassi toetatud konstruktorid, saame luua rakendusele täielikult funktsionaalse erendiga klassi ning kasutada InnerException atribuuti, et salvestada kogu madalama taseme veatingimuste tekitatud veainfo.

45. Anna prioriteet ebanormaalsetele ohutusgarantiidele

1. Tugev erandigarantii tagab parima tasakaalu erandist taastumise ja lihtsustatud erandite käsitlemise vahel ning programmi seisund jääb muutumatuks, kui operatsioon erindi tõttu katkestatakse.
2. Teha kaitsvat kopeerimist muudetavatest andmetest, muuta nende andmete kaitsekoopiat, keskmine operatsioon võib põhjustada erandi ning ajutine koopia ja algne objekt vahetatakse;
3. Terminaatorid, Dispose() meetodid ja sihtmeetodid, mis on seotud delegaatidega, peaksid tagama, et nad ei tee erandeid mingil juhul.

46. Koostalitlusvõime minimeerimine

1. Koostalitlusvõimel on kolm kulu: andmete loendamise kulu hallatavate ja haldamata kuhjade vahel, üleminekukulud hallatud ja haldamata koodi vahel ning arendajate arendustöö, kes tegelevad hübriidkeskkondadega;
2. Blittable'i tüübi kasutamine interop'is võimaldab tõhusalt replitseerida hallatavate ja haldamata keskkondade vahel ilma objekti sisemise struktuuri mõjutamata.
3. Kasuta In/Out funktsiooni, et tagada kõige sobivamad tarbetud mitmekordsed replikatsioonid ning paranda jõudlust, deklareerides, kuidas andmeid loendatakse.
4. Kasuta COM Interop'i, et teostada ühilduvust COM komponentidega kõige lihtsamal viisil, kasutada P/Invoke'i Win32 API kutsumiseks või kasutada C++ kompilaatori /CLR lülitit, et segada hallatud ja hallamata koodi;

47. Anna ohutuskoodidele prioriteet

1. Väldi haldamata mälu kasutamist nii palju kui võimalik ning isoleeritud salvestus ei saa takistada juurdepääsu hallataval koodil ja usaldusväärsetel kasutajatel.
2. Kui assambleed töötavad veebis, kaalu isoleeritud salvestuse kasutamist ning kui teatud algoritmid nõuavad kõrgemaid turvaõigusi, tuleks need koodid isoleerida eraldi assembleris.

48. Valda asjakohaseid tööriistu ja ressursse

1. Kasuta NUniti automaatsete ühiktestide loomiseks (integreeritud VS2010-sse);
2. FXCop tööriist hangib IL-koodi assamblees, analüüsib seda heterogeensete kodeerimisreeglite ja parimate tavade alusel ning lõpuks teatab rikkumisest.
3. ILDasm on IL-i lahtivõtmise tööriist, mis aitab meil saada ülevaadet detailidest;
4. Jagatud lähtekoodiga CLI on rakenduse lähtekood, mis sisaldab .NET raamistiku tuuma ja C# kompilaatorit.




Eelmine:Teeninduskangas – olekupõhise teenuse kontseptsioon
Järgmine:.net/c# SynchronizationContext detailide jaoks
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com