Nuo paprastų klausimų apie C# pri­va­lu­mus iki prog­ra­ma­vi­mo kalbos skirtingų elementų ir jų naudojimo pa­aiš­ki­ni­mo – sudarėme 10 svar­biau­sių klausimų, kuriuos reikia užduoti darbo pokalbyje dėl C# prog­ra­ma­vi­mo darbo.

Šiame straips­ny­je pa­tei­kia­mi dešimt daž­niau­siai užduodamų klausimų darbo pokalbyje dėl prog­ra­muo­to­jo darbo vietos. Taip pat pa­tei­kia­mi atsakymai į kiekvieną iš šių klausimų. Nors šie klausimai apima įvairias temas, nuo paprastų iki sudėtingų, yra daug kitų galimų klausimų apie C# ir jo ypatingas savybes.

Šiame straips­ny­je pa­tei­kia­ma pirminė įvairių klausimų, kurie gali būti užduoti, apžvalga – nuo paprastų iki labiau spe­ci­fi­nių ir rei­ka­lau­jan­čių tam tikrų detalių. Šis straips­nis taip pat gali padėti jums suprasti, kaip pa­si­ruoš­ti pokalbiui, kurio tikslas – pa­tik­rin­ti jūsų žinias apie konkrečią prog­ra­ma­vi­mo kalbą.

1 klausimas: Kokios yra C# ypatybės ir kokius pri­va­lu­mus siūlo ši prog­ra­ma­vi­mo kalba?

Naudodama specialią kūrimo aplinką „Visual Studio“, C# iš esmės yra sukurta greičiui. Kaip objektų ori­en­tuo­ta prog­ra­ma­vi­mo kalba, C# taip pat pelno taškų dėl savo paprastos ir modernios programų kūrimo, kuri yra tiek uni­ver­sa­li, tiek galinga. Štai kodėl daugelis prog­ra­muo­to­jų, spręsdami, kokią prog­ra­ma­vi­mo kalbą mokytis, renkasi C#.

C# yra iš esmės struk­tū­ri­zuo­ta aplink klases ir objektus, griežtai laikantis ti­pi­za­vi­mo principų. Ji teikia tokias funkcijas kaip abst­rak­ci­ja, in­kap­su­lia­ci­ja ir pa­vel­dė­ji­mas. Ši prog­ra­ma­vi­mo kalba yra skirta pir­miau­sia prog­ra­ma­vi­mui Microsoft .NET eko­sis­te­mo­je.

Dėl su­de­ri­na­mu­mo su .NET platforma, C# turi savo struktūrą, kurioje daugelis .NET struktūrų tipų paveldi iš objekto klasės. Dėl to šios klasės paveldi metodus, savybes, laukus ir įvykius. Ši hie­rar­chi­nė struktūra pa­leng­vi­na nuo­sek­lu­mą ir sąveiką .NET eko­sis­te­mo­je.

2 klausimas: Ką reiškia kla­si­fi­ka­ci­ja „objektas“ C# kalboje?

Objektų su­pra­t­i­mas C# kalboje priklauso nuo pag­rin­di­nių kalbos principų suvokimo. Iš esmės C# yra objektų ori­en­tuo­ta prog­ra­ma­vi­mo kalba, kurioje pagrindą sudaro klasės. Klasė apibrėžia duomenų struktūrą ir nustato, kaip jie saugomi, tvarkomi ir per­duo­da­mi C# kalboje. Iš esmės ji yra visų kitų duomenų struktūrų modelis.

Objektai yra realūs elementai C# kalboje, kurie taip pat užima realias vertes turimoje atmintyje. Visi subjektai, turintys labai spe­ci­fi­nes cha­rak­te­ris­ti­kas arba at­lie­kan­tys konkrečią užduotį prog­ra­mi­nė­je įrangoje, gali būti laikomi objektais. Objekto tipas api­brė­žia­mas klase, o klasės instancės sudaro pagrindą tolesnei jų struk­tū­rai.

Pa­vyz­džiui, tarkime, kad kuriame programą, skirtą te­le­vi­zo­riui. Pir­miau­sia turime apibrėžti objektą kaip pradinį tašką. Šiuo atveju galime sukurti klasę „Te­le­vi­zo­rius“. Šioje klasėje norime apibrėžti penkias savybes: gamintoją, modelį, spalvą, dydį ir kainą. Šios savybės yra klasės nariai. Kiti klasės nariai gali būti įvykiai, metodai ar laukai, kurie visi kartu sudaro objektą.

Norėdami prog­ra­muo­ti „Sony Bravia“ kaip te­le­vi­zo­riaus pavyzdį, kurdami šį objektą galime nurodyti savybes „Sony“, „Bravia“, „Black“, „50“ ir „500“. Tai apibrėžia in­for­ma­ci­ją apie gamintoją, modelį, spalvą, dydį ir kainą. Taigi „Sony“ te­le­vi­zo­rius yra „Te­le­vi­sion“ klasės pavyzdys. Kad ši klasė būtų prieinama, svarbu ją apibrėžti kaip viešą, o ne kaip privačią ar apsaugotą.

3 klausimas: Koks yra skirtumas tarp valdomo ir nevaldomo kodo C# kalboje?

Valdomas kodas

C# valdomas kodas – tai visas kodas, sukurtas naudojant .NET Framework. Šio tipo kodas vykdomas tie­sio­giai naudojant bendrąją kalbos vykdymo aplinką (CLR). CLR valdo kodo gyvavimo ciklą, įskaitant objektų kūrimą, atminties pa­skirs­ty­mą ir objektų šalinimą.

Nevalomas kodas

Kodas, sukurtas ne .NET Framework aplinkoje, vadinamas nevaldomu kodu. Ši ka­te­go­ri­ja apima visas programas, kurios nėra vykdomos CLR kontrolės sąlygomis.

.NET Framework teikia funkciją, kuri gali kon­ver­tuo­ti nevaldomą kodą į valdomą kodą ir at­virkš­čiai. Ši funkcija yra ypač naudinga, nes ji pa­leng­vi­na objektų kūrimo ir vykdymo bei kodo šalinimo in­te­g­ra­vi­mą į sistemą.

4 klausimas: Koks yra skirtumas tarp struk­tū­ros ir klasės?

C# kalboje terminai „klasė“ (class) ir „struktūra“ (struct) reiškia vartotojo api­brėž­tus duomenų tipus. Tačiau šie duomenų tipai turi keletą esminių skirtumų.

Struktūra

  • Kaip vertės tipas C# kalboje, struk­tū­ros visada ne­tie­sio­giai paveldi iš System.ValueType.
  • Struk­tū­ros negali būti išvestos iš kitų tipų.
  • Paprastai struktūra naudojama ma­žes­niems duomenų kiekiams.
  • Struk­tū­ros negali būti abst­rak­čios, todėl rei­ka­lau­ja tie­sio­gi­nio įgy­ven­di­ni­mo.
  • Struk­tū­rai negalima priskirti stan­dar­ti­nio konst­ruk­to­riaus.
  • Objekto kūrimas naudojant raktinį žodį new nėra pri­va­lo­mas.

Klasė

  • Kaip nuorodų tipas C# kalboje, klasės visada ne­tie­sio­giai paveldi iš System.Object.
  • Klasės gali būti kilusios iš kitų klasių, o tai leidžia pa­vel­dė­ji­mą.
  • Paprastai klasė naudojama di­des­niems duomenų kiekiams arba su­dė­tin­ges­nėms struk­tū­roms.
  • Klasės gali būti abst­rak­čios, o tai reiškia, kad jos neleidžia tie­sio­gi­nio ins­tan­ci­ja­vi­mo.
  • Prie­šin­gai nei struk­tū­ros, klasės gali turėti stan­dar­ti­nį konst­ruk­to­rių, jei jo reikia.

5 klausimas: Koks yra skirtumas tarp sąsajos ir abst­rak­čios klasės C# kalboje?

Sąsajos (in­ter­fa­ces) ir abst­rak­čio­sios klasės (abstract classes) abi nurodo kodų sutarties klases, pvz., iš­anks­ti­nes sąlygas ar objekto ne­kin­ta­mus dydžius, iš­ves­ti­nėms klasėms. Nepaisant šio bendrumo, yra daug skirtumų, kaip rodo sąsajų ir abst­rak­čių­jų klasių funk­cio­na­lu­mas.

Kodų sutarčių klasės gali būti nau­do­ja­mos norint nurodyti iš­anks­ti­nes sąlygas, paskesnes sąlygas ir objekto ne­kin­ta­mus dydžius. Iš­anks­ti­nės sąlygos yra rei­ka­la­vi­mai, kurie turi būti įvykdyti įvedant metodą ar savybę.

Pa­vel­dė­ji­mo atžvilgiu abst­rak­čios klasės gali turėti ne tik abst­rak­čius metodus, bet ir metodus su įgy­ven­din­tu kodu, o sąsajos rei­ka­lau­ja, kad visi metodai būtų abst­rak­čiai. Dėl to abst­rak­čioms klasėms dekla­ruo­ti rei­ka­lin­gas raktinis žodis abstract

Kadangi C# nepalaiko daug­kar­ti­nio klasių pa­vel­dė­ji­mo, klasė negali paveldėti iš daugiau nei vienos abst­rak­čios klasės. Tačiau klasė gali įgy­ven­din­ti keletą sąsajų, kad būtų galima daug­kar­ti­nis sąsajų pa­vel­dė­ji­mas.

Abst­rak­čio­ji klasė gali turėti konst­ruk­to­rius, kuriuos gali iškviesti iš­ves­ti­nės klasės. Sąsajos negali turėti konst­ruk­to­rių, nes jos nėra instancės ir todėl negali būti ini­ci­juo­tos.

6 klausimas: Kas yra savybės C# kalboje?

C# kalboje savybės yra klasės elementas, lei­džian­tis skaityti, rašyti ar ap­skai­čiuo­ti privačiai dekla­ruo­to lauko vertę. Savybės gali būti nau­do­ja­mos norint pasiekti viešas sąsajas arba leisti keisti klasėje saugomus duomenis.

Savybės yra pag­rin­di­nis ob­jek­ti­nio prog­ra­ma­vi­mo C# kalba aspektas ir daž­niau­siai nau­do­ja­mos prog­ra­mo­se, siekiant už­tik­rin­ti aiškų ir saugų prieigą prie klasės duomenų.

Jie dekla­ruo­ja­mi naudojant get ir set prieigos funkcijas, kurios apibrėžia savybės vertės skaitymo ar nustatymo elgesį. get prieigos funkcija gauna savybės vertę, o set prieigos funkcija nustato savybės vertę. Savybė gali turėti vieną arba abi prieigos funkcijas. Tai priklauso nuo to, ar savybė yra (arba turėtų būti) tik skaitoma, ar skaitoma/rašoma.

7 klausimas: Ką reiškia „boxing“ ir „unboxing“ C# kalboje?

C# kalboje tipų kon­ver­si­joms naudojami boxing ir unboxing.

  • Kon­ver­ta­vi­mas iš vertės tipo į nuorodos tipą vadinamas „boxing“. Tai gali būti, pa­vyz­džiui, paprasto duomenų tipo, pvz., int, kon­ver­ta­vi­mas į duomenų tipo objektą. „Boxing“ yra ne­tie­sio­gi­nis kon­ver­ta­vi­mas.
  • Pa­kei­ti­mas iš nuorodos tipo į vertės tipą, kita vertus, vadinamas iš­pa­ka­vi­mu. Iš­pa­ka­vi­mas gali vykti tik su tiksliai tuo pačiu vertės tipu, kuris buvo iš pradžių įdėtas į dėžutę, pa­vyz­džiui, objekto kon­ver­ta­vi­mas atgal į int.

8 klausimas: Kas yra iš­var­di­ji­mas (enum) ir kam jis nau­do­ja­mas C# kalboje?

Enumas yra vertės tipas su susijusių pavadintų konstantų rinkiniu. Ši grupė taip pat vadinama „enu­me­ra­to­riaus sąrašu“. C# kalboje enumai yra išvardyti duomenų tipai, kurie yra pri­mi­ty­vūs ir vartotojo apibrėžti. Rak­ta­žo­dis enum nau­do­ja­mas enu­me­ra­ci­jai dekla­ruo­ti.

.NET Framework enumai naudojami skait­me­ni­nių konstantų kūrimui. Kiek­vie­nas enumo narys yra enumo tipo, o kiek­vie­nam enumo tipui rei­ka­lin­ga skait­me­ni­nė vertė. Šios enumo vertės yra ne­kin­ta­mos. Enumai gali būti pa­tei­kia­mi kaip simbolių eilutės ir tvarkomi kaip sveikieji skaičiai.

Nu­ma­ty­ta­sis iš­var­di­ji­mo elemento tipas yra int. Nu­ma­ty­ta­sis pirmojo iš­var­di­ji­mo elemento vertė yra 0, o kiekvieno kito iš­var­di­ji­mo elemento vertė pa­di­di­na­ma 1. Tačiau šias vertes taip pat galima nustatyti rankiniu būdu, pvz., 10 = Įjungta ir 20 = Išjungta.

9 klausimas: Koks yra skirtumas tarp Dispose ir Finalize C# kalboje?

C# kalboje abu metodai naudojami iš­tek­liams iš­lais­vin­ti.

Dispose metodas atleidžia ne­val­do­mus išteklius, pvz., duomenų bazių ryšius, kurie nėra au­to­ma­tiš­kai valdomi .NET vykdymo aplinkos šei­mi­nin­ko. Paprastai jis įgy­ven­di­na­mas klasėje. Tai savo ruožtu įgy­ven­di­na IDis­po­sab­le sąsają, kuri apibrėžia Dispose metodą.

Šis metodas yra aiškiai iš­kvie­čia­mas kliento kodu, kad būtų at­lais­vin­ti ne­be­rei­ka­lin­gi ištekliai. Al­ter­na­ty­viai, jis gali būti ne­tie­sio­giai iš­kvie­čia­mas naudojant using teiginį, už­tik­ri­nant, kad Dispose metodas būtų iš­kvie­čia­mas, kai objektas išeina iš taikymo srities.

Kita vertus, Finalize metodas nau­do­ja­mas objekto valymo ope­ra­ci­joms atlikti prieš pat šiukšlių surinkimo procesą. Todėl jis paprastai įgy­ven­di­na­mas klasėje, kuri perrašo Object.Finalize metodą.

10 klausimas: Kokie yra C# išplėtimo metodų pri­va­lu­mai?

Išplėtimo metodai leidžia prog­ra­muo­to­jams išplėsti esamo tipo funk­cio­na­lu­mą ne­kei­čiant ori­gi­na­laus tipo ir ne­su­ku­riant naujo iš­ves­ti­nio tipo. Jie leidžia pridėti metodus prie esamų klasių, struktūrų, sąsajų, enumų ir pan., net jei metodai iš pradžių nebuvo apibrėžti tipo viduje.

Išplėtimo metodai dekla­ruo­ja­mi statinėje klasėje ir api­brė­žia­mi kaip statiniai metodai, turintys unikalų pirmąjį parametrą, pavadintą this. Šis pa­ra­met­ras nurodo iš­ple­čia­mą tipą, leidžiant išplėtimo metodą iškviesti taip, tarsi jis būtų to tipo ins­tan­ci­nis metodas.

Kokio pobūdžio klausimų galiu tikėtis C# interviu metu?

Žinodami, kas jus in­ter­viuos, galėsite geriau suprasti, kokio pobūdžio klausimai jums bus užduodami. Kartais personalo atrankos spe­cia­lis­tams trūksta žinių, rei­ka­lin­gų išsamioms dis­ku­si­joms apie spe­cia­li­zuo­tas sritis, pvz., ka­te­go­ri­jas ar objektus C# kalboje. Taigi, jei interviu vedėjas yra techninis vadovas arba prog­ra­ma­vi­mo komandos narys, labiau tikėtina, kad interviu klausimai bus susiję su konk­re­čio­mis prog­ra­ma­vi­mo sąvokomis ir įgūdžiais.

Jei dalyvauja vy­riau­sia­sis prog­ra­mi­nės įrangos ar­chi­tek­tas arba ži­nia­tink­lio kūrėjas, tikėtina, kad jie užduos spe­cia­li­zuo­tus klausimus, ypač jei pre­ten­duo­ja­te į aukš­tes­nes pareigas nei pradinio lygio. Taip yra todėl, kad būsimi kolegos nori žinoti, kaip naujas komandos narys galės jiems padėti kas­die­ni­nė­se užduotyse.

Go to Main Menu