Fra enkle spørgsmål om fordelene ved C# til for­kla­ring af for­skel­li­ge elementer i pro­gram­me­rings­spro­get og hvordan de kan bruges, har vi lavet en liste over de 10 vigtigste spørgsmål til en job­sam­ta­le om C#.

Denne artikel fremhæver ti ofte stillede spørgsmål i en job­sam­ta­le til en ud­vik­ler­stil­ling. Vi har også medtaget svar på hvert af disse spørgsmål. Selvom disse spørgsmål dækker en række emner fra enkle til de­tal­je­re­de, er der mange andre mulige spørgsmål om C# og dets særlige funk­tio­ner.

Denne artikel giver et ind­le­den­de overblik over for­skel­li­ge spørgsmål, der kan blive stillet, lige fra enkle spørgsmål til mere spe­ci­fik­ke spørgsmål, der kræver visse detaljer. Denne artikel kan også hjælpe dig med at forstå, hvordan du for­be­re­der dig til en samtale, der har til formål at teste din viden om et bestemt pro­gram­me­rings­sprog.

Spørgsmål 1: Hvad er de særlige egen­ska­ber ved C#, og hvilke fordele tilbyder pro­gram­me­rings­spro­get?

Med sit specielle ud­vik­lings­mil­jø Visual Studio er C# grund­læg­gen­de designet med henblik på hastighed. Som et ob­jekt­o­ri­en­te­ret pro­gram­me­rings­sprog scorer C# også point med sin enkle og moderne app-udvikling, der er både alsidig og kraftfuld. Derfor vælger mange udviklere C#, når de skal beslutte, hvilket pro­gram­me­rings­sprog de vil lære.

C# er grund­læg­gen­de struk­tu­re­ret omkring klasser og objekter og følger strengt typ­nings­prin­cip­per­ne. Det tilbyder funk­tio­ner som ab­strak­tion, ind­kaps­ling og arv. Pro­gram­me­rings­spro­get er primært beregnet til udvikling inden for Microsoft .NET-øko­sy­ste­met.

På grund af sin til­pas­ning til .NET-rammen har C# sin egen struktur, hvor mange typer inden for .NET-struk­tu­rer arver fra ob­jekt­klas­sen. Som følge heraf arver disse klasser metoder, egen­ska­ber, felter og be­gi­ven­he­der. Denne hie­rar­ki­ske struktur fremmer kon­si­stens og in­te­r­o­pe­ra­bi­li­tet inden for .NET-øko­sy­ste­met.

Spørgsmål 2: Hvad betyder klas­si­fi­ce­rin­gen “objekt” i C#?

For at forstå objekter i C# er det vigtigt at forstå de grund­læg­gen­de prin­cip­per i sproget. I sin kerne er C# et ob­jekt­o­ri­en­te­ret pro­gram­me­rings­sprog, hvor klasser fungerer som fun­da­men­tet. En klasse afgrænser da­ta­struk­tu­ren og dikterer, hvordan data lagres, ad­mi­ni­stre­res og overføres i C#. I det væ­sent­li­ge fungerer den som en blåkopi for alle andre da­ta­struk­tu­rer.

Objekter er reelle elementer i C#, som også optager reelle værdier i den til­gæn­ge­li­ge hukom­mel­se. Alle enheder, der er udstyret med meget spe­ci­fik­ke egen­ska­ber, eller som udfører en specifik opgave i softwaren, kan betragtes som objekter. Ob­jekt­ty­pen defineres af en klasse, og klas­se­in­stan­ser danner rammen for deres videre struktur.

Lad os for eksempel sige, at vi designer et program, der er centreret omkring et fjernsyn. Først skal vi definere en entitet som ud­gangs­punkt. I dette tilfælde kunne vi oprette klassen “Fjernsyn”. Inden for denne klasse vil vi definere fem egen­ska­ber: producent, model, farve, størrelse og pris. Disse egen­ska­ber er medlemmer af klassen. Andre medlemmer af klassen kunne være be­gi­ven­he­der, metoder eller felter, som alle sammen udgør et objekt.

For at pro­gram­me­re en Sony Bravia som en instans af et tv kan vi angive Sony, Bravia, Black, 50 og 500 som egen­ska­ber, når vi opretter dette objekt. Dette definerer op­lys­nin­ger­ne om producent, model, farve, størrelse og pris. Sony-fjern­sy­net er derfor en instans af klassen Te­le­vi­sion. For at gøre denne klasse til­gæn­ge­lig er det vigtigt at definere den som offentlig og ikke som privat eller beskyttet.

Spørgsmål 3: Hvad er for­skel­len mellem ad­mi­ni­stre­ret og ikke-ad­mi­ni­stre­ret kode i C#?

Ad­mi­ni­stre­ret kode

Ad­mi­ni­stre­ret kode i C# er al kode, der er oprettet ved hjælp af .NET Framework. Denne type kode udføres direkte af Common Language Runtime (CLR). CLR ad­mi­ni­stre­rer kodens livs­cy­klus, herunder op­ret­tel­se af objekter, hukom­mel­ses­al­lo­ke­ring og bort­skaf­fel­se af objekter.

Ikke-ad­mi­ni­stre­ret kode

Kode, der er udviklet uden for .NET Framework, betegnes som ikke-ad­mi­ni­stre­ret kode. Denne kategori omfatter alle ap­pli­ka­tio­ner, der ikke udføres under kontrol af CLR.

.NET Framework in­de­hol­der en funktion, der kan kon­ver­te­re ikke-ad­mi­ni­stre­ret kode til ad­mi­ni­stre­ret kode og omvendt. Denne funktion er særlig nyttig, da den letter pro­blem­fri in­te­gra­tion af ob­jekt­skab­ning og -udførelse samt ko­de­bort­skaf­fel­se inden for rammen.

Spørgsmål 4: Hvad er for­skel­len mellem struct og class?

I C# henviser ud­tryk­ke­ne klasse (class) og struktur (struct) til bru­ger­de­fi­ne­re­de datatyper. Disse datatyper har dog nogle grund­læg­gen­de forskelle.

Struktur

  • Som en værditype i C# arver struk­tu­rer altid implicit fra System.ValueType.
  • Struk­tu­rer kan ikke afledes fra andre typer.
  • Som regel bruges en struktur til mindre da­ta­mæng­der.
  • Struk­tu­rer kan ikke være abstrakte og kræver derfor direkte im­ple­men­te­ring.
  • Det er ikke muligt at tildele en stan­dard­kon­struk­tør til en struktur.
  • Det er ikke ob­liga­to­risk at oprette et objekt ved hjælp af nøg­le­or­det new.

Klasse

  • Som re­fe­ren­ce­ty­pe i C# arver klasser altid implicit fra System.Object.
  • Klaser kan afledes fra andre klasser, hvilket muliggør arv.
  • Som regel bruges en klasse til større da­ta­mæng­der eller mere komplekse struk­tu­rer.
  • Klaser kan være abstrakte, hvilket betyder, at de ikke tillader direkte in­stan­si­e­ring.
  • I mod­sæt­ning til struk­tu­rer kan klasser have en stan­dard­kon­struk­tør, hvis de har brug for en.

Spørgsmål 5: Hvad er for­skel­len mellem en græn­se­fla­de og en abstrakt klasse i C#?

In­ter­faces (græn­se­fla­der) og abstrakte klasser (abstrakte klasser) spe­ci­fi­ce­rer begge ko­de­kon­trakt­klas­ser, f.eks. for­ud­sæt­nin­ger eller ob­jek­tin­va­ri­an­ter, for afledte klasser. På trods af denne fæl­lesnæv­ner er der mange forskelle, som funk­tio­na­li­te­ten af in­ter­faces og abstrakte klasser viser.

Ko­de­kon­trakt­klas­ser kan bruges til at spe­ci­fi­ce­re for­ud­sæt­nin­ger, ef­ter­be­tin­gel­ser og ob­jek­tin­va­ri­an­ter. For­ud­sæt­nin­ger er krav, der skal være opfyldt, når man går ind i en metode eller egenskab.

Med hensyn til arv kan abstrakte klasser indeholde metoder med im­ple­men­te­ret kode ud over abstrakte metoder, mens græn­se­fla­der kræver, at alle metoder er abstrakte. Af denne grund skal abstrakte klasser de­kla­re­res med nøg­le­or­det abstract

Da C# ikke un­der­støt­ter multiple arv af klasser, kan en klasse ikke arve fra mere end én abstrakt klasse. En klasse kan dog im­ple­men­te­re flere græn­se­fla­der for at muliggøre multiple arv af græn­se­fla­der.

En abstrakt klasse kan have kon­struk­to­rer, der kan påkaldes af afledte klasser. In­ter­faces kan ikke indeholde kon­struk­to­rer, da de ikke er instanser og derfor ikke kan ini­ti­a­li­se­res.

Spørgsmål 6: Hvad er egen­ska­ber i C#?

I C# er egen­ska­ber et element i en klasse, der giver dig mulighed for at læse, skrive eller beregne værdien af et privat de­kla­re­ret felt. Egen­ska­ber kan bruges til at få adgang til of­fent­li­ge græn­se­fla­der eller tillade ændringer af data, der er gemt i en klasse.

Egen­ska­ber er et grund­læg­gen­de aspekt af ob­jekt­o­ri­en­te­ret pro­gram­me­ring i C# og bruges ofte i ap­pli­ka­tio­ner til at give ren og sikker adgang til klas­se­da­ta.

De de­kla­re­res ved hjælp af get og set, som definerer adfærden for læsning eller indstil­ling af egen­skabs­vær­di­en. get henter egen­ska­bens værdi, mens set indstil­ler egen­ska­bens værdi. En egenskab kan have en eller begge ac­ces­so­rer. Dette afhænger af, om egen­ska­ben er (eller bør være) skri­ve­be­skyt­tet eller læse-/skri­ve­be­skyt­tet.

Spørgsmål 7: Hvad menes der med boxing og unboxing i C#?

Boxing og unboxing bruges i C# til ty­pe­kon­ver­te­ring.

  • Kon­ver­te­ring fra en værditype til en re­fe­ren­ce­ty­pe kaldes boxing. Dette kan f.eks. være kon­ver­te­ring af en simpel datatype som int til datatypen object. Boxing er en implicit kon­ver­te­ring.
  • Kon­ver­te­ring fra en re­fe­ren­ce­ty­pe til en værditype kaldes derimod unboxing. Unboxing kan kun finde sted med den nøjagtige værditype, der op­rin­de­ligt blev boxet, for eksempel kon­ver­te­ring af objekt tilbage til int.

Spørgsmål 8: Hvad er enu­me­ra­tion (enum), og hvad bruges det til i C#?

En enum er en værditype med et sæt re­la­te­re­de navngivne kon­stan­ter. Denne gruppe kaldes også en ‘enu­me­ra­tor­li­ste’. I C# er enums enu­me­re­re­de datatyper, der er primitive og bru­ger­de­fi­ne­re­de. Nøg­le­or­det enum bruges til at deklarere en enu­me­ra­tion.

Enums i .NET Framework bruges til at oprette numeriske kon­stan­ter. Hvert medlem af en enum er af typen enum, og der kræves en numerisk værdi for hver enum-type. Disse enum-værdier er ufor­an­der­li­ge. Enums kan re­præ­sen­te­res som tegn­stren­ge og ma­ni­p­u­le­res som heltal.

Stan­dard­ty­pen for op­reg­nings­e­le­men­tet er int. Som standard har den første opregner værdien 0, og værdien for hver ef­ter­føl­gen­de opregner øges med 1. Disse værdier kan dog også indstil­les manuelt, f.eks. 10 = Til og 20 = Fra.

Spørgsmål 9: Hvad er for­skel­len mellem Dispose og Finalize i C#?

I C# bruges begge metoder til at frigive res­sour­cer.

Dispose-metoden frigiver ikke-ad­mi­ni­stre­re­de res­sour­cer, såsom da­ta­ba­se­for­bin­del­ser, der ikke ad­mi­ni­stre­res au­to­ma­tisk af .NET-kør­sels­tid­vær­ten. Den im­ple­men­te­res normalt i en klasse. Dette im­ple­men­te­rer igen IDis­posab­le-græn­se­fla­den, som definerer Dispose-metoden.

Denne metode kaldes eksplicit af kli­ent­ko­den for at frigive res­sour­cer, der ikke længere er nød­ven­di­ge. Al­ter­na­tivt kan den kaldes implicit med using, hvilket sikrer, at Dispose-metoden kaldes, når objektet går ud af omfanget.

Finalize-metoden bruges derimod til at udføre op­ryd­nings­o­pe­ra­tio­ner på et objekt lige før garbage col­lection-processen finder sted. Derfor im­ple­men­te­res den typisk i en klasse, der over­skri­ver Object.Finalize-metoden.

Spørgsmål 10: Hvad er fordelene ved ud­vi­del­ses­me­to­der i C#?

Ud­vi­del­ses­me­to­der giver udviklere mulighed for at udvide funk­tio­na­li­te­ten af en ek­si­ste­ren­de type uden at ændre den op­rin­de­li­ge type eller oprette en ny afledt type. De gør det muligt at tilføje metoder til ek­si­ste­ren­de klasser, struk­tu­rer, græn­se­fla­der, enums osv., selvom metoderne ikke op­rin­de­ligt var defineret inden for typen.

Ud­vi­del­ses­me­to­der de­kla­re­res inden for en statisk klasse og defineres som statiske metoder med en unik første parameter ved navn this. Denne parameter angiver den type, der udvides, hvilket gør det muligt at påkalde ud­vi­del­ses­me­to­den, som om den var en in­stans­me­to­de af den på­gæl­den­de type.

Hvilke spørgsmål kan jeg forvente i en C#-samtale?

At vide, hvem der in­ter­viewer dig, kan give dig et bedre indblik i, hvilken type spørgsmål du vil blive stillet. Re­k­rut­te­rings­ansvar­li­ge mangler nogle gange den nød­ven­di­ge eks­per­ti­se til at føre dybt­gå­en­de dis­kus­sio­ner om spe­ci­a­li­se­re­de områder som ka­te­go­ri­er eller objekter i C#. Så hvis in­ter­viewe­ren er en teknisk leder eller et medlem af ud­vik­ler­tea­met, er det mere sand­syn­ligt, at in­ter­viewspørgs­må­le­ne vil dreje sig om spe­ci­fik­ke pro­gram­me­rings­kon­cep­ter og -fær­dig­he­der.

Hvis den ledende softwa­rear­ki­tekt eller we­b­ud­vik­ler er til stede, vil de sand­syn­lig­vis stille spe­ci­a­li­se­re­de spørgsmål, især hvis du søger stil­lin­ger, der ligger over entry level. Det skyldes, at dine frem­ti­di­ge kolleger gerne vil vide, hvordan det nye team­med­lem vil kunne hjælpe dem i deres daglige arbejde.

Gå til ho­ved­me­nu­en