.NET MAUI (Multi-platform App UI) on Microsoftin työkalu, joka mahdollistaa monialustaisen sovelluskehityksen käyttäen yhtä koodipohjaa eri alustoilla, kuten Windowsissa, iOS:ssa, macOS:ssa ja Androidissa. Sen avulla kehittäjät voivat luoda sovelluksia, jotka toimivat saumattomasti kaikilla pääalustoilla, mikä säästää aikaa ja resursseja. Asennettaessa Visual Studio 2022:ta, .NET MAUI:n vaadittavat työkuormat asennetaan automaattisesti. Jos kuitenkin ilmenee ongelmia, voidaan työkuormien asentaminen varmistaa manuaalisesti.
Työkuormia voi tarkastella ja hallita komennolla dotnet workload list, jolloin näet asennetut työkuormat ja niiden versionumerot. Esimerkiksi maui-android tarkoittaa, että .NET MAUI SDK on asennettu Android-alustalle. Jos haluat nähdä, mitkä työkuormat ovat saatavilla asennettaviksi, voit käyttää komentoa dotnet workload search. Tämä komento näyttää luettelon kaikista saatavilla olevista työkuormista, kuten maui-ios, maui-windows ja maui-android. Näitä työkuormia voidaan asentaa tarvittaessa komennolla dotnet workload install <workload> ja päivittää komennolla dotnet workload update.
Jos tarvitset vain tietyt työkuormat, kuten vain Androidille tai iOS:lle tarkoitetut työkuormat, ne voidaan valita yksittäin. Asennuskomentoa dotnet workload install maui käytettäessä kaikki tarvittavat työkuormat asennetaan samanaikaisesti. Jos kehittäjä huomaa, että puuttuu työkuorma projektin tarpeisiin, voi käyttää komentoa dotnet workload restore puuttuvien työkuormien asentamiseen.
Kun työkuormat on asennettu, voidaan kehittää sovelluksia eri alustoille Visual Studio 2022:lla. Windowsilla iOS- ja macOS-sovellusten kehittämiseen tarvitaan kuitenkin erillinen Mac-rakennuspalvelin, johon voidaan yhdistää Visual Studio 2022:n kautta verkon yli. Tämä on erityisen tärkeää, jos halutaan kehittää nimenomaan iOS-sovelluksia, sillä macOS-laitteet tarjoavat tarvittavat työkalut, kuten Xcode.
.NET MAUI tarjoaa myös laajan valikoiman käyttöliittymäkomponentteja, jotka jakautuvat neljään pääkategoriaan: sivut (Pages), asettelut (Layouts), näkymät (Views) ja solut (Cells). Näillä komponenteilla voidaan luoda monipuolisia ja mukautettavia käyttöliittymiä. Esimerkiksi Shell-komponentti tarjoaa yksinkertaistetun tavan käsitellä navigointia ja hakutoimintoja, kun taas ListView-komponentti on erinomainen pitkäkestoisten tietoluettelojen näyttämiseen.
Hyvin suunniteltu käyttöliittymä on keskeinen osa mobiili- ja työpöytäsovellusten kehitystä. Shell-komponentti on erityisen hyödyllinen, kun sovelluksessa on useita navigoitavia sivuja. Se mahdollistaa selkeän ja käyttäjäystävällisen navigoinnin, jossa käytetään joko TabBar-tai FlyoutItem-komponentteja. TabBar on hyvä valinta, kun sivuja on vain muutama, mutta jos sivuja on enemmän, FlyoutItem voi tarjota skaalautuvan ratkaisun, jossa listan kohteet voidaan esittää pystysuunnassa vieritettävänä luettelona.
ListView-komponentti puolestaan on erinomainen valinta silloin, kun halutaan näyttää pitkiä luetteloita. Sen avulla voidaan ryhmitellä tietoja ja käyttää mukautettuja soluja, jotka voivat sisältää tekstin tai kuvan. Soluissa voi olla myös kontekstitoimintoja, kuten poistovaihtoehtoja, jotka ilmestyvät, kun käyttäjä tekee pitkän painalluksen Android-laitteella tai oikean painikkeen klikkauksen työpöytäjärjestelmässä.
.NET MAUI:ssä käytettävät kontrollit, kuten Entry ja Editor, mahdollistavat tekstikenttien luomisen. Hyvä käytäntö on käyttää Entry-komponenttia, kun tarvitsee yhden rivin tekstiä ja Editor-komponenttia, kun kyseessä on monirivinen teksti. Nämä komponentit voivat olla data-sidottuja, mikä tarkoittaa, että ne voivat olla kytkettyjä johonkin tietomallin kenttään, kuten käyttäjän syöttämään tietoon.
.NET MAUI:ssa käytetään myös niin sanottuja "handlers" -komponentteja, jotka yhdistävät .NET MAUI:n abstraktit kontrollit natiivien kontrollien kanssa eri alustoilla. Näin esimerkiksi Button-komponentti, joka on määritelty .NET MAUI:ssa, voi olla kytkettynä iOS:n UIButton-komponenttiin tai Androidin AppCompatButton-komponenttiin. Tämä antaa kehittäjälle mahdollisuuden käyttää alustan erityispiirteitä ja mukauttaa natiivia kontrollia tarpeen mukaan.
Joskus on tarpeen kirjoittaa alustan erityisiä koodirivejä. Tämä voidaan tehdä käyttämällä kääntäjäohjeita (compiler directives), kuten #if __ANDROID__, joka mahdollistaa alustan erityisten ominaisuuksien käyttämisen, kuten Androidissa näkyvän tekstikentän alaviivan poistamisen.
Kehittäjän on hyvä myös muistaa, että jos kehität iOS- tai macOS-sovelluksia, tarvitset macOS-laitteen ja Xcode-ohjelman, joka mahdollistaa sovellusten kehittämisen ja testaamisen näille alustoille. Ilman tätä asennusta iOS- ja macOS-sovellukset eivät toimi oikein.
Miten hallita tietoja ja suorittaa kyselyjä SQL Serverissä tehokkaasti?
T-SQL on voimakas ja monipuolinen ohjelmointikieli, joka mahdollistaa tietokannan hallinnan ja tietojen manipuloinnin SQL Serverissä. Sen avulla voidaan suorittaa monimutkaisia kyselyitä, määritellä muuttujia, hallita virheenkäsittelyä ja ohjata suorituksen kulkua. Kieli on eräänlainen laajennus SQL:stä, ja sen tarjoamat mahdollisuudet tekevät siitä tehokkaan työkalun tietokantatehtävissä.
Yksi keskeinen osa T-SQL:ää on muuttujien määrittäminen ja käsittely. Muuttujia voidaan käyttää pitämään väliaikaisia arvoja, joita voidaan muokata ja käyttää eri osissa kyselyä. Esimerkiksi muuttujan määrittäminen ja sen arvon muuttaminen on yksinkertaista:
Tässä luodaan muuttuja @WholeNumber ja lisätään siihen arvo. Muuttujan arvoa voidaan käyttää myöhemmin, kuten esimerkiksi laskettaessa työntekijöiden määrää:
Tällaisilla toimenpiteillä saadaan tehokkaasti tallennettua ja manipuloitua tietoja kyselyssä ilman tarvetta luoda erillisiä tauluja tai käyttää väliaikaisia tietorakenteita.
Globaalit muuttujat ja tietotyyppien määrittäminen
SQL Server tarjoaa globaalit muuttujat, jotka ovat käytettävissä koko kyselysession ajan. Yksi tunnetuimmista globaaleista muuttujista on @@ROWCOUNT, joka kertoo, kuinka monta riviä on vaikuttanut edelliseen SQL-lauseeseen, kuten päivityksiin tai poistamiseen. Esimerkiksi:
Tässä esimerkissä saamme selville, kuinka monta riviä on päivitetty tai poistettu aiemmalla komennolla. Tämä on erityisen hyödyllistä virheiden käsittelyssä ja raportoinnissa.
Tietotyypit SQL Serverissä voivat olla joko kiinteän kokoisia tai muokattavia. Esimerkiksi INT on neljä tavua suuri tietotyyppi, kun taas SMALLINT on pienempi. Tekstityypeissä voidaan määritellä joko kiinteä pituus, kuten CHAR(40), tai muuttuva pituus, kuten VARCHAR(40). Erityisesti tekstityypeissä on huomioitava, että N-etuliite tarkoittaa Unicode-merkistöä, joka käyttää kahta tavua per merkki verrattuna tavallisiin tekstityyppeihin, jotka käyttävät vain yhtä tavua.
Ohjauslauseet ja virheenkäsittely
T-SQL:ssä on monia ohjauslauseita, kuten IF...ELSE, WHILE, BREAK, ja CONTINUE, jotka toimivat samalla tavalla kuin monissa ohjelmointikielissä kuten C#:ssä. Näitä käytetään koodin suorituksen hallintaan ja loogisten ehtojen tarkistamiseen. Esimerkiksi:
Virheenkäsittelyssä käytetään TRY...CATCH-rakennetta, joka sieppaa virheitä ja käsittelee ne asianmukaisesti. Tämä on tärkeää, jotta ohjelma ei kaadu odottamattomista virheistä.
DML ja tietojen manipulointi
DML (Data Manipulation Language) -lauseet kuten SELECT, INSERT, UPDATE, ja DELETE ovat keskeisiä SQL Serverin käytössä. SELECT-lauseen avulla voidaan hakea tietoja tietokannasta eri kriteereiden mukaan:
Tässä haetaan kaikkien Yhdysvalloissa asuvien työntekijöiden etu- ja sukunimet. INSERT, UPDATE ja DELETE mahdollistavat tietojen lisäämisen, päivittämisen ja poistamisen tietokannasta:
Tietojen päivittäminen onnistuu vastaavasti:
DELETE-komennolla taas voidaan poistaa rivit taulusta:
Erityisesti suurten tietomäärien käsittelyssä TRUNCATE-komento voi olla tehokas vaihtoehto, koska se poistaa kaikki rivit taulusta ilman, että yksittäiset poistot kirjataan lokiin:
DDL ja rakenteen hallinta
Data Definition Language (DDL) mahdollistaa tietokannan rakenteen muutokset. Esimerkiksi taulun luominen voidaan tehdä näin:
Tällöin luodaan uusi taulu nimeltä Shippers, jossa on kentät ShipperId ja CompanyName. Taulujen muokkaaminen onnistuu myös ALTER TABLE-komennolla, ja indeksejä voidaan luoda parantamaan suorituskykyä:
Erilaiset liitokset ja monimutkaisemmät kyselyt
SQL Serverissä voidaan käyttää monimutkaisempia liitoksia (JOIN) eri taulujen yhdistämiseksi. Esimerkiksi:
Tässä liitetään Categories ja Products taulut ja haetaan tuotteiden nimet niiden kategorian mukaan. Liitoksia on monia erilaisia, kuten INNER JOIN, LEFT JOIN ja RIGHT JOIN, jotka kaikki toimivat eri tavoin sen mukaan, miten halutaan yhdistää tauluja.
T-SQL:ssä on myös monimutkaisempia komentoja kuten UNION ja DISTINCT, jotka auttavat yhdistämään kyselyiden tuloksia tai poistamaan päällekkäisiä rivejä.
Tietokannan kyselyt voivat olla yksinkertaisia tai monimutkaisempia, mutta niiden ymmärtäminen ja tehokas käyttö on tärkeä osa tietokannan hallintaa.
Mitä on tärkeää ymmärtää synkronoinnin ja asynkronisuuden yhteydessä C#:ssa?
Interlocked ei toimi numeerisilla tyypeillä, kuten byte, sbyte, short, ushort ja decimal. Interlocked pystyy suorittamaan atomisia operaatioita, kuten Exchange ja CompareExchange, jotka vaihtavat arvoja muistissa seuraavilla tyypeillä: • System.Single (float), System.Double (double) • nint, nuint • T, System.Object (object).
Tarkastellaanpa tätä käytännössä:
-
Määritä SharedObjects-luokassa toinen kenttä, joka laskee, kuinka monta operaatioita on suoritettu, kuten seuraavassa koodissa:
-
Program.Methods.cs-tiedostossa, molemmissa A- ja B-metodeissa, for-lauseessa ja merkkijonon arvon muokkaamisen jälkeen, lisää lauseke turvalliseen laskentaan, kuten seuraavassa koodissa:
-
Program.cs-tiedostossa, aikarajan tulostamisen jälkeen, kirjoita laskuri konsoliin, kuten seuraavassa koodissa:
-
Suorita koodi ja tarkastele tulosta, kuten seuraavassa esimerkissä:
Tarkkaavaiset lukijat huomaavat, että nykyinen conch-objekti suojaa kaikki jaetut resurssit, joita käytetään koodilohkossa, joka on lukittu conchin avulla. Tämän vuoksi Interlockedin käyttö on tässä esimerkissä tarpeetonta. Mutta jos emme olisi jo suojanneet toista jaettua resurssia, kuten Messagea, olisi Interlockedin käyttö ollut välttämätöntä.
Muita synkronointimenetelmiä
Monitor ja Interlocked ovat yksinkertaisia ja tehokkaita lukkoja, mutta toisinaan tarvitaan kehittyneempiä vaihtoehtoja jaettujen resurssien käyttöoikeuden synkronointiin. Seuraavassa taulukossa on lueteltu joitakin tällaisia vaihtoehtoja:
-
ReaderWriterLock, ReaderWriterLockSlim: Nämä mahdollistavat sen, että useat säikeet voivat olla lukutilassa, yksi säie voi olla kirjoitustilassa yksinoikeudella, ja säie, joka on lukemassa, voi päivittää lukemastaan resurssista kirjoitustilaan ilman, että sen tarvitsee luopua lukemisoikeuksistaan.
-
Mutex: Kuten Monitor, tämä tarjoaa yksinoikeuden jaetun resurssin käyttöön, mutta se on suunniteltu prosessien välistä synkronointia varten.
-
Semaphore, SemaphoreSlim: Nämä rajoittavat säikeiden määrää, jotka voivat samanaikaisesti käyttää resurssia tai resurssipoolia, määrittämällä slotit. Tämä on resurssien rajoittamista eikä lukitsemista.
-
AutoResetEvent, ManualResetEvent: Nämä odotushandlet mahdollistavat säikeiden synkronoinnin toimintoja odottamalla toistensa signaaleja.
Async ja await
C# 5 esitteli kaksi avainsanaa, jotka ovat erityisen hyödyllisiä, kun työskennellään Task-tyypin kanssa. Ne ovat erityisen hyödyllisiä seuraavissa tapauksissa:
-
Moniajon toteuttaminen graafisessa käyttöliittymässä (GUI).
-
Web-sovellusten ja -palvelujen skaalautuvuuden parantaminen.
Tässä luvussa käsittelemme sen teoriaa, miksi nämä kaksi C#-avainsanaa esiteltiin, ja myöhemmin tulemme näkemään ne käytännössä.
Parantaminen konsolisovelluksille
Yksi konsolisovellusten rajoituksista on, että voit käyttää await-avainsanaa vain metodeissa, jotka on merkitty asynkronisiksi. Kuitenkin C# 7 ja aikaisemmat versiot eivät salli Main-metodin merkitsemistä asynkroniseksi! Onneksi C# 7.1:ssa otettiin käyttöön tuki asynkroniselle Mainille.
-
Käytä valitsemaasi koodieditoria lisätäksesi uusi konsolisovellus Chapter04-ratkaisuun/työtilaan nimeltä AsyncConsole.
-
Poista Program.cs-tiedostossa nykyiset lauseet ja lisää lauseet, jotka luovat HttpClient-instanssin, tekevät pyynnön Applen etusivulle ja tulostavat, kuinka monta tavua sillä on.
-
Rakenna projekti ja huomaa, että se onnistuu. Aikaisemmin .NET 5 ja sitä aikaisemmissa versioissa projekti luotiin eksplisiittisesti Program-luokalla, jossa Main-metodia ei voitu merkitä asynkroniseksi, mikä olisi johtanut virheilmoitukseen.
-
Suorita koodi ja tarkastele tulosta, jonka kokoonpano saattaa vaihdella Applen etusivun päivityksistä riippuen.
Async-syötteet
.NET Core 3.0:ssa Microsoft esitteli asynkronisen virran käsittelyn. Ennen C# 8.0:aa ja .NET Core 3.0:aa await-avainsana toimi vain tehtävien kanssa, jotka palauttavat yksittäisiä arvoja. Async-virrat mahdollistavat sen, että asynkroninen metodi voi palauttaa arvoja toistuvasti, yksi kerrallaan.
Simuloimme esimerkin, joka palauttaa kolme satunnaista kokonaislukua asynkronisesti:
Sitten luemme nämä arvot ja tulostamme ne:
GUI-sovellusten suorituskyvyn parantaminen
Tähän asti olemme käsitelleet vain konsolisovelluksia, mutta ohjelmoijien elämä muuttuu monimutkaisemmaksi rakennettaessa verkkosovelluksia, verkkopalveluja ja sovelluksia, joissa on käyttöliittymä (GUI), kuten Windowsin työpöytä- ja mobiilisovellukset.
Yksi suurimmista haasteista GUI-sovelluksissa on se, että niissä on erityinen säie, käyttöliittymä (UI) -säie. On olemassa kaksi sääntöä, joiden mukaan GUI:lla työskentelyssä:
-
Älä suorita pitkiä tehtäviä UI-säikeellä.
-
Älä pääse käsiksi käyttöliittymäelementteihin millään muulla säikeellä kuin UI-säikeellä.
Näiden sääntöjen noudattaminen ilman apuvälineitä voisi johtaa monimutkaiseen koodiin, jossa pitkäkestoiset tehtävät piti suorittaa ei-UI-säikeellä ja sen jälkeen tulokset siirrettiin turvallisesti UI-säikeelle. Onneksi C# 5 ja sitä uudemmat versiot tuovat async- ja await-avainsanat, jotka mahdollistavat koodin kirjoittamisen synkronisesti, mutta suorituksessa voidaan käyttää useita säikeitä.
Miten ohjelmointi voi tukea monikulttuurista ympäristöä?
Kansainvälistyminen on prosessi, jossa ohjelmakoodisi otetaan käyttöön eri puolilla maailmaa. Tämä prosessi koostuu kahdesta osasta: globalisaatiosta ja lokalisoinnista. Molemmat osat keskittyvät kulttuureihin, mutta niillä on eri lähestymistavat. Globalisaatio tarkoittaa sitä, että ohjelmakoodisi on suunniteltu niin, että se pystyy tukemaan useita kieliä ja alueita. Alueen ja kielen yhdistelmää kutsutaan kulttuuriksi. On tärkeää ymmärtää, että vaikka kaksi maata saattaisivatkin käyttää samaa kieltä, kuten ranskaa, niiden päivämäärä- ja valuuttamuodot voivat silti olla erilaisia, esimerkiksi Quebecissä ja Pariisissa.
Jokaiselle kulttuuriyhdistelmälle on olemassa kansainvälisen standardointijärjestön (ISO) määrittelemä koodi. Esimerkiksi koodi da-DK tarkoittaa, että käytetään tanskalaista kieltä (da) ja Tanskan aluetta (DK). Toisaalta fr-CA viittaa ranskankieliseen Kanadaan. ISO ei ole lyhenne, vaan se on viittaus kreikkalaiseen sanaan "isos", joka tarkoittaa "tasavertainen".
Lokalisointi puolestaan keskittyy käyttöliittymän mukauttamiseen niin, että se tukee tiettyä kieltä. Esimerkiksi painikkeen nimike voidaan vaihtaa "Close" (en) tai "Fermer" (fr), mutta lokalisoinnissa alue ei aina ole olennainen tekijä. Ironisesti kuitenkin käytännöt, kuten "en-US" ja "en-GB", viittaavat alueellisiin eroihin, vaikka kielenä on sama englanti. On tärkeää huomioida, että ohjelmistojen käännöksissä kannattaa käyttää ammattilaisten apua, etenkin jos et ole äidinkielenpuhuja.
Kulttuurien tunnistaminen ja vaihtaminen ohjelmistossa on olennainen osa kansainvälistämistä. Tässä osiossa käsitellään perusasioita, jotka liittyvät CultureInfo- ja RegionInfo-luokkiin System.Globalization-namespacessa. Esimerkiksi voidaan kirjoittaa koodia, joka hakee nykyiset kulttuurit ja näyttää niitä konsolissa. Tämä voidaan tehdä määrittämällä ohjelman käytettäväksi kulttuurikoodit, kuten da-DK, en-GB tai fr-CA. Kun ohjelma käynnistetään, se käyttää oletuskulttuuria, joka vastaa käyttöjärjestelmän asetuksia.
Ohjelma voi myös kysyä käyttäjältä uuden kulttuurikoodin ja näyttää, kuinka tämä vaikuttaa päivämäärien, valuuttojen ja muiden tietojen esittämistapaan. Tällöin ohjelma voi ottaa huomioon päivämääräformaatit, valuuttasymbolit ja jopa mittayksiköt. Esimerkiksi yhdysvaltalainen "en-US" käyttää erilaista päivämäärämuotoa kuin brittiläinen "en-GB" tai suomalainen "fi-FI". Samoin valuutan symbolit voivat vaihdella alueesta riippuen.
Kun ohjelman käyttämää kulttuuria vaihdetaan ohjelman suorituksen aikana, se vaikuttaa kaikkiin ohjelman tulostuksiin, kuten päivämäärien, aikojen ja valuuttojen esitysmuotoihin. Tällöin on tärkeää varmistaa, että käyttäjälle esitettävät tiedot ovat oikeassa muodossa hänen alueensa ja kielensä mukaan. Tämä edellyttää syvällistä ymmärrystä siitä, kuinka kulttuurikohtaiset asetukset toimivat ja kuinka ne voivat vaikuttaa käyttäjäkokemukseen.
Koodin käytettävyys ja ymmärrettävyys paranevat, kun otetaan huomioon kulttuuriset erot. Esimerkiksi, jos ohjelma kysyy käyttäjältä syntymäpäivän, se voi tarjota oletusmuodon, joka on kulttuuriin sopiva. Suomessa päivämäärä ilmoitetaan yleensä muodossa "päivä/kuukausi/vuosi", kun taas Yhdysvalloissa käytetään muodossa "kuukausi/päivä/vuosi". Tämän vuoksi on tärkeää, että ohjelma tunnistaa käyttäjän kulttuurin ja esittää tiedot juuri hänelle ymmärrettävällä tavalla.
Samalla on huomattava, että kansainvälistämisen ja lokalisoinnin prosessit eivät rajoitu pelkästään kielten tai päivämäärien käsittelyyn. On olemassa monia muita alueellisia eroja, kuten mittayksiköt, valuutat ja jopa kulttuuriset tavat, jotka voivat vaikuttaa siihen, kuinka ohjelma tulisi suunnitella. Siksi on tärkeää tutustua kulttuurien moninaisuuteen ja varmistaa, että ohjelma on joustava ja kykenee mukautumaan useisiin ympäristöihin.
Kulttuurien tuki ohjelmoinnissa ei ole pelkästään tekninen haaste, vaan myös kulttuurinen ja sosiaalinen. Ymmärrys siitä, kuinka eri alueet ja kielet eroavat toisistaan, voi parantaa ohjelmien käytettävyyttä ja varmistaa sen, että käyttäjät ympäri maailmaa voivat nauttia sujuvasta ja mielekkäästä kokemuksesta.
Miten antropologia on kehittynyt kohti objektiivista tutkimusta ja eettistä lähestymistapaa?
Mikä teki revolverista tehokkaan ja kestävän työkalun 1800-luvun alussa?
Mikä tekee esihistoriallisen selviytyjän kertomuksesta merkittävän antropologisen spekulatiivisen fiktion teoksen?
Miten toteuttaa Contextual Mode Android-sovelluksessa ja miksi se on tärkeää?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский