C#:n eduista kos­ke­vis­ta yk­sin­ker­tai­sis­ta ky­sy­myk­sis­tä oh­jel­moin­ti­kie­len eri ele­ment­tien ja niiden käyt­tö­ta­po­jen se­lit­tä­mi­seen – olemme koonneet listan 10 tär­keim­mäs­tä ky­sy­myk­ses­tä C#-työ­haas­tat­te­luun.

Tässä ar­tik­ke­lis­sa esitetään kymmenen yleisesti kysyttyä kysymystä ke­hi­tys­työn­te­ki­jän työ­haas­tat­te­lus­sa. Olemme myös lisänneet vas­tauk­set jokaiseen ky­sy­myk­seen. Vaikka nämä ky­sy­myk­set kattavat mo­nen­lai­sia aiheita yk­sin­ker­tai­sis­ta yk­si­tyis­koh­tai­siin, on olemassa monia muita mah­dol­li­sia ky­sy­myk­siä C#-kielestä ja sen eri­tyi­so­mi­nai­suuk­sis­ta.

Tämä artikkeli tarjoaa alustavan kat­sauk­sen eri­lai­sis­ta ky­sy­myk­sis­tä, joita voi tulla esiin haas­tat­te­lus­sa. Ky­sy­myk­set voivat olla suo­ra­vii­vai­sia tai tarkempia ja vaatia tiettyjä yk­si­tyis­koh­tia. Artikkeli auttaa myös ym­mär­tä­mään, miten voit val­mis­tau­tua haas­tat­te­luun, jossa testataan tietyn oh­jel­moin­ti­kie­len osaa­mis­ta­si.

Kysymys 1: Mitkä ovat C#-kielen eri­tyis­piir­teet ja mitä etuja tämä oh­jel­moin­ti­kie­li tarjoaa?

Eri­tyi­sel­lä Visual Studio-ke­hi­ty­sym­pä­ris­töl­lä C# on suun­ni­tel­tu pe­rus­tal­taan nopeaksi. Ob­jek­ti­suun­tau­tu­nee­na oh­jel­moin­ti­kie­le­nä C# kerää pisteitä myös yk­sin­ker­tai­sel­la ja mo­der­nil­la so­vel­lus­ke­hi­tyk­sel­lään, joka on sekä mo­ni­puo­li­nen että tehokas. Siksi monet ke­hit­tä­jät va­lit­se­vat C#:n, kun he päättävät, mitä oh­jel­moin­ti­kiel­tä oppia.

C# on pe­rus­tal­taan luokkien ja objektien ympärille ra­ken­net­tu kieli, joka noudattaa tiukasti tyy­pi­tysprins­se­jä. Se tarjoaa toi­min­nal­li­suuk­sia kuten ab­strak­tio, kap­se­loin­ti ja pe­riy­ty­mi­nen. Oh­jel­moin­ti­kie­li on tar­koi­tet­tu en­si­si­jai­ses­ti ke­hi­tys­työ­hön Mic­ro­sof­tin .NET-eko­sys­tee­mis­sä.

Koska C# on yh­den­mu­kais­tet­tu .NET-ke­hy­sym­pä­ris­tön kanssa, sillä on oma ra­ken­teen­sa, jossa monet .NET-ra­ken­tei­den tyypit pe­riy­ty­vät ob­jek­ti­luo­kas­ta. Tämän seu­rauk­se­na nämä luokat pe­riy­ty­vät me­ne­tel­mis­tä, omi­nai­suuk­sis­ta, kentistä ja ta­pah­tu­mis­ta. Tämä hie­rark­ki­nen rakenne helpottaa yh­den­mu­kai­suut­ta ja yh­teen­toi­mi­vuut­ta .NET-eko­sys­tee­mis­sä.

Kysymys 2: Mitä luokitus “objekti” tar­koit­taa C#-kielessä?

C#-kielessä objektien ym­mär­tä­mi­nen riippuu kielen pe­rus­pe­ri­aat­tei­den hal­lit­se­mi­ses­ta. C# on poh­jim­mil­taan olio-oh­jel­moin­ti­kie­li, jossa luokat toimivat perustana. Luokka mää­rit­te­lee datan rakenteen ja määrää, miten se tal­len­ne­taan, hallitaan ja siir­re­tään C#-kielessä. Se toimii käy­tän­nös­sä kaikkien muiden da­ta­ra­ken­tei­den pohjana.

Objektit ovat C#-kielessä to­del­li­sia ele­ment­te­jä, jotka vievät myös to­del­lis­ta muistia käy­tet­tä­vis­sä olevasta muistista. Kaikki en­ti­tee­tit, joilla on hyvin erityisiä omi­nai­suuk­sia tai jotka suo­rit­ta­vat tietyn tehtävän oh­jel­mis­tos­sa, voidaan katsoa ob­jek­teik­si. Ob­jek­ti­tyyp­pi mää­ri­tel­lään luokalla, ja luokan ins­tans­sit muo­dos­ta­vat kehyksen niiden jat­ko­ke­hi­tyk­sel­le.

Oletetaan esi­mer­kik­si, että suun­nit­te­lem­me te­le­vi­sioon kes­kit­ty­vää ohjelmaa. En­sin­nä­kin meidän on mää­ri­tel­tä­vä läh­tö­koh­dak­si en­ti­teet­ti. Tässä ta­pauk­ses­sa voimme luoda luokan ”Televisio”. Tämän luokan sisällä haluamme mää­ri­tel­lä viisi omi­nai­suut­ta: val­mis­ta­ja, malli, väri, koko ja hinta. Nämä omi­nai­suu­det ovat luokan jäseniä. Luokan muita jäseniä voivat olla ta­pah­tu­mat, me­ne­tel­mät tai kentät, jotka kaikki yhdessä muo­dos­ta­vat objektin.

Oh­jel­moi­dak­sem­me Sony Bravian te­le­vi­sion ins­tans­sik­si, voimme määrittää Sony, Bravia, Black, 50 ja 500 omi­nai­suuk­sik­si luo­des­sam­me tämän objektin. Tämä määrittää tiedot val­mis­ta­jas­ta, mallista, väristä, koosta ja hinnasta. Sony-televisio on siis Te­le­vi­sion-luokan instanssi. Jotta tämä luokka olisi käy­tet­tä­vis­sä, on tärkeää mää­ri­tel­lä se jul­ki­sek­si eikä yk­si­tyi­sek­si tai suo­ja­tuk­si.

Kysymys 3: Mikä on ero hallitun ja hal­lit­se­mat­to­man koodin välillä C#-kielessä?

Hallittu koodi

C#-kielellä hal­lin­noi­tu koodi on kaikki .NET Framework -ke­hy­sym­pä­ris­tös­sä luotu koodi. Tämän tyyppinen koodi suo­ri­te­taan suoraan Common Language Runtime (CLR) -ym­pä­ris­tös­sä. CLR hallinnoi koodin elin­kaar­ta, mukaan lukien objektien luomisen, muistin al­lo­koin­nin ja objektien hä­vit­tä­mi­sen.

Hal­lit­se­ma­ton koodi

.NET Fra­mewor­kin ul­ko­puo­lel­la ke­hi­tet­tyä koodia kutsutaan hal­lit­se­mat­to­mak­si koodiksi. Tähän luokkaan kuuluvat kaikki so­vel­luk­set, joita ei suoriteta CLR:n hal­lin­nas­sa.

.NET Framework tarjoaa toiminnon, joka voi muuntaa hal­lit­se­mat­to­man koodin hal­li­tuk­si koodiksi ja päin­vas­toin. Tämä omi­nai­suus on erityisen hyö­dyl­li­nen, koska se helpottaa objektien luomisen ja suo­rit­ta­mi­sen sekä koodin hä­vit­tä­mi­sen sau­ma­ton­ta in­tegroin­tia kehykseen.

Kysymys 4: Mikä on ero struct- ja class-tyyppien välillä?

C#-kielessä termit class (luokka) ja structure (rakenne) viit­taa­vat käyttäjän mää­rit­te­le­miin tie­to­tyyp­pei­hin. Näillä tie­to­tyy­peil­lä on kuitenkin joitakin pe­rus­ta­van­laa­tui­sia eroja.

Rakenne

  • C#-kielessä rakenteet ovat arvojia, jotka pe­riy­ty­vät aina impli­siit­ti­ses­ti *System.ValueType-*tyypistä.
  • Ra­ken­tei­ta ei voi johtaa muista tyypeistä.
  • Ra­ken­net­ta käytetään yleensä pie­nem­pien tie­to­mää­rien kä­sit­te­le­mi­seen.
  • Rakenteet eivät voi olla ab­strak­te­ja, joten ne vaativat suoraa to­teu­tus­ta.
  • Ra­ken­teel­le ei voi määrittää va­kio­kon­struk­to­ria.
  • Objektin luominen new avain­sa­nal­la ei ole pa­kol­lis­ta.

Luokka

  • C#-kielessä luokkien vii­te­tyyp­pi­nä luokkien perintö System.Object-luokasta on aina impli­siit­ti­nen.
  • Luokat voivat olla joh­det­tu­ja muista luokista, mikä mah­dol­lis­taa perinnön.
  • Yleensä luokkaa käytetään suu­rem­mil­le tie­to­mää­ril­le tai mo­ni­mut­kai­sem­mil­le ra­ken­teil­le.
  • Luokat voivat olla ab­strak­te­ja, mikä tar­koit­taa, että ne eivät salli suoraa ins­tan­soin­tia.
  • Toisin kuin rakenteet, luokilla voi olla va­kio­kon­struk­to­ri, jos ne sitä tar­vit­se­vat.

Kysymys 5: Mikä on ero ra­ja­pin­nan ja ab­strak­tin luokan välillä C#-kielessä?

Ra­ja­pin­nat (in­ter­faces) ja ab­strak­tit luokat (abstract classes) mää­rit­te­le­vät molemmat koo­di­so­pi­mus­luo­kat, esim. en­nak­koeh­dot tai objektien in­va­rians­sit, joh­de­tuil­le luokille. Tästä yh­tei­ses­tä piir­tees­tä huo­li­mat­ta niissä on monia eroja, kuten ra­ja­pin­to­jen ja ab­strak­tien luokkien toi­min­nal­li­suus osoittaa.

Koo­di­so­pi­mus­luok­kia voidaan käyttää mää­rit­te­le­mään en­nak­koeh­dot, jäl­kieh­dot ja objektien in­va­rians­sit. En­nak­koeh­dot ovat vaa­ti­muk­sia, jotka on täy­tet­tä­vä me­ne­tet­täes­sä me­ne­tel­mään tai omi­nai­suu­teen.

Pe­rin­tö­jen osalta ab­strak­tit luokat voivat sisältää ab­strak­tien me­ne­tel­mien lisäksi me­ne­tel­miä, joissa on to­teu­tet­tu koodi, kun taas ra­ja­pin­nat edel­lyt­tä­vät, että kaikki me­ne­tel­mät ovat ab­strak­te­ja. Tästä syystä ab­strak­tit luokat tar­vit­se­vat abstract ju­lis­ta­mis­ta varten.

Koska C# ei tue luokkien mo­ni­pe­rin­töä, luokka ei voi periä useampaa kuin yhtä ab­strak­tia luokkaa. Luokka voi kuitenkin toteuttaa useita ra­ja­pin­to­ja, jotta ra­ja­pin­to­jen mo­ni­pe­rin­tö on mah­dol­lis­ta.

Abstrakti luokka voi sisältää kon­struk­to­rei­ta, joita johdetut luokat voivat kutsua. Ra­ja­pin­nat eivät voi sisältää kon­struk­to­rei­ta, koska ne eivät ole ins­tans­se­ja eivätkä siten voi olla alus­tet­tu­ja.

Kysymys 6: Mitä ovat omi­nai­suu­det C#-kielessä?

C#-kielessä omi­nai­suu­det ovat luokan ele­ment­te­jä, joiden avulla voit lukea, kir­joit­taa tai laskea yk­si­tyi­ses­ti mää­ri­tel­lyn kentän arvon. Omi­nai­suuk­sia voidaan käyttää julkisten ra­ja­pin­to­jen käyt­tä­mi­seen tai luokkaan tal­len­net­tu­jen tietojen muut­ta­mi­seen.

Omi­nai­suu­det ovat olen­nai­nen osa C#-kielellä ta­pah­tu­vaa olio-oh­jel­moin­tia, ja niitä käytetään yleisesti so­vel­luk­sis­sa, jotta luokkien tietoihin pääsee käsiksi selkeästi ja tur­val­li­ses­ti.

Ne mää­ri­tel­lään käyt­tä­mäl­lä get ja set, jotka mää­rit­te­le­vät omi­nai­suu­den arvon lukemisen tai aset­ta­mi­sen käyt­täy­ty­mi­sen. get hakee omi­nai­suu­den arvon, kun taas set asettaa omi­nai­suu­den arvon. Omi­nai­suu­del­la voi olla yksi tai molemmat pää­sy­funk­tiot. Tämä riippuu siitä, onko omi­nai­suus (tai sen pitäisi olla) vain luku -tyyppinen vai luku/kirjoitus-tyyppinen.

Kysymys 7: Mitä tar­koi­te­taan C#-kielessä termeillä boxing ja unboxing?

Boxing ja unboxing käytetään C#-kielessä tyyppien muun­ta­mi­seen.

  • Ar­vo­tyy­pin muun­ta­mi­nen vii­te­tyy­pik­si tunnetaan nimellä boxing. Tämä voi olla esi­mer­kik­si yk­sin­ker­tai­sen da­ta­tyy­pin, kuten int, muun­ta­mi­nen da­ta­tyy­pik­si object. Boxing on impli­siit­ti­nen muunnos.
  • Viit­taus­tyy­pin muun­ta­mi­nen ar­vo­tyy­pik­si puo­les­taan on unboxing. Unboxing voi tapahtua vain al­ku­pe­räi­sen boxing-muun­nok­sen tarkalle ar­vo­tyy­pil­le, esi­mer­kik­si muun­ta­mal­la object takaisin int-tyypiksi.

Kysymys 8: Mikä on luet­te­loin­ti (enum) ja mihin sitä käytetään C#-kielessä?

Enum on arvon tyyppi, jolla on joukko toisiinsa liittyviä nimettyjä vakioita. Tätä ryhmää kutsutaan myös ‘enu­me­ra­tor listiksi’. C#-kielessä enumit ovat lue­tel­tu­ja tie­to­tyyp­pe­jä, jotka ovat pri­mi­tii­vi­siä ja käyttäjän mää­rit­te­le­miä. Avain­sa­naa enum käytetään luettelon mää­rit­te­le­mi­seen.

.NET Fra­mewor­kin enum-tyyppejä käytetään nu­mee­ris­ten vakioiden luomiseen. Jokainen enum-tyypin jäsen on enum-tyyppiä, ja jo­kai­sel­le enum-tyypille tarvitaan nu­mee­ri­nen arvo. Nämä enum-arvot ovat muut­tu­mat­to­mia. Enum-tyypit voidaan esittää merk­ki­jo­noi­na ja käsitellä ko­ko­nais­lu­kui­na.

Enu­me­ra­tion-elementin ole­tus­tyyp­pi on int. Ole­tuk­se­na en­sim­mäi­sen enu­me­ra­to­rin arvo on 0 ja jokaisen seuraavan enu­me­ra­to­rin arvo kasvaa yhdellä. Nämä arvot voidaan kuitenkin asettaa myös ma­nu­aa­li­ses­ti, esi­mer­kik­si 10 = Päällä ja 20 = Pois.

Kysymys 9: Mikä on ero Dispose- ja Finalize-ko­men­to­jen välillä C#-kielessä?

C#-kielessä molempia me­ne­tel­miä käytetään re­surs­sien va­paut­ta­mi­seen.

Dispose-metodi vapauttaa hal­lit­se­mat­to­mat resurssit, kuten tie­to­kan­tayh­tey­det, joita .NET-ajo­ym­pä­ris­tön isäntä ei hallitse au­to­maat­ti­ses­ti. Se to­teu­te­taan yleensä luokassa. Tämä puo­les­taan toteuttaa IDis­po­sable-ra­ja­pin­nan, joka mää­rit­te­lee Dispose-metodin.

Tämä menetelmä kutsutaan ni­men­omai­ses­ti asia­kas­koo­dil­la va­paut­ta­maan resurssit, joita ei enää tarvita. Vaih­toeh­toi­ses­ti se voidaan kutsua impli­siit­ti­ses­ti using, mikä varmistaa, että Dispose-menetelmä kutsutaan, kun objekti poistuu so­vel­ta­mi­sa­las­ta.

Finalize-me­ne­tel­mää puo­les­taan käytetään objektin puh­dis­tus­toi­min­to­jen suo­rit­ta­mi­seen juuri ennen ros­kien­ke­räyspro­ses­sin alkamista. Siksi se to­teu­te­taan tyy­pil­li­ses­ti luokassa, joka ohittaa Object.Finalize-me­ne­tel­män.

Kysymys 10: Mitkä ovat laa­jen­nus­me­ne­tel­mien edut C#-kielessä?

Laa­jen­nus­me­ne­tel­mien avulla ke­hit­tä­jät voivat laajentaa olemassa olevan tyypin toi­min­nal­li­suut­ta muut­ta­mat­ta al­ku­pe­räis­tä tyyppiä tai luomatta uutta johdettua tyyppiä. Niiden avulla me­ne­tel­miä voidaan lisätä olemassa oleviin luokkiin, ra­ken­tei­siin, ra­ja­pin­toi­hin, luet­te­loi­hin jne., vaikka me­ne­tel­miä ei olisi alun perin mää­ri­tel­ty ky­sei­ses­sä tyypissä.

Laa­jen­nus­me­ne­tel­mät mää­ri­tel­lään staat­ti­ses­sa luokassa ja mää­ri­tel­lään staat­ti­sik­si me­ne­tel­mik­si, joissa on ai­nut­laa­tui­nen en­sim­mäi­nen parametri nimeltä this. Tämä parametri määrittää laa­jen­net­ta­van tyypin, jolloin laa­jen­nus­me­ne­tel­mää voidaan kutsua ikään kuin se olisi kyseisen tyypin ins­tans­si­me­ne­tel­mä.

Millaisia ky­sy­myk­siä voin odottaa C#-haas­tat­te­lus­sa?

Kun tiedät, kuka sinua haas­tat­te­lee, saat paremman kä­si­tyk­sen siitä, millaisia ky­sy­myk­siä sinulle tullaan esit­tä­mään. Rek­ry­toi­jil­la ei aina ole tar­vit­ta­vaa asian­tun­te­mus­ta sy­väl­li­siin kes­kus­te­lui­hin eri­kois­tu­neis­ta aiheista, kuten C#-kielessä käy­tet­tä­vis­tä luokista tai ob­jek­teis­ta. Jos haas­tat­te­li­ja on tekninen johtaja tai ke­hi­tys­tii­min jäsen, on to­den­nä­köi­sem­pää, että haas­tat­te­lu­ky­sy­myk­set koskevat tiettyjä oh­jel­moin­nin kä­sit­tei­tä ja taitoja.

Jos johtava oh­jel­mis­toark­ki­teh­ti tai web-kehittäjä on paikalla, he to­den­nä­köi­ses­ti esittävät eri­kois­tu­nei­ta ky­sy­myk­siä, etenkin jos haet muuta kuin aloit­te­li­jan tehtävää. Tämä johtuu siitä, että tulevat kollegat haluavat tietää, miten uusi tiimin jäsen voi auttaa heitä päi­vit­täi­sis­sä teh­tä­vis­sä.

Siirry pää­va­lik­koon