Gå til innhold

C#: New - Utenfor eller inni constructor?


Anbefalte innlegg

Hvilken er anbefalt og hvorfor:

 

private List<string> liste = new List<string>();

eller

private List<string> liste;

public Klasse()
{
liste = new List<string>();
}

 

Personlig så synes jeg den første er på en måte ryddigst i visse sammenhenger, da man er sikker på at den er opprettet. Det blir også mindre kode. Men hva synes andre? Mener å huske noe snakk om at den andre metoden er mer "riktig", men kan liksom ikke helt se hvorfor... er det noen betydelig forskjell annet enn skrivemåte og organisering? Forskjell på ressursbruk? Forskjell på når de settes? Hva er forskjellene? Hva bør en bruke?

Lenke til kommentar
Videoannonse
Annonse

Kort og greit svar:

Handler om kontroll. NEW'er du den i en metode så er det din programflyt som avgjør når du oppretter objektet eller ikke. NEW'er du den i DATA settet så blir den kjørt umiddelbart når objektet rundt er i scope. Om den ene metoden er bedre enn den andre er tvilsomt. Handler mer om hva du prøver å gjøre..

Lenke til kommentar

Det er faktisk en vesentlig forskjell mellom å kalle i constructor eller ikke, spesielt når en arver klasser.

 

Det stod en artikkel på MSDN om det for noen måneder siden.

 

Som regel initialiserer jeg i constructoren, fordi det ikke gir deg noen overraskelser, pluss at en får mer kontroll som HDSoftware sier.

Endret av GeirGrusom
Lenke til kommentar

arv. det var jo et poeng. men mener du at den utenfor constructoren ikke kjøres når en arver? for det ville jo vært litt jalla... da kan en jo ikke være sikker på at den kjører da? for en konstruktor kan en vel la være å kjøre om en vil?

Lenke til kommentar

Svish: Hvis du ikke selv definerer en konstruktør, gjør .NET det for deg. så en konstruktør slipper du ikke unna. Og som den kverulanten Manfred er, måtte han selvsagt henge seg opp i den detaljen.

 

edit: for å utdype:

class Class1 {}

class Class2 {
public Class2() {}
}

vil gi samme IL-kode.

Endret av hockey500
Lenke til kommentar

I den detaljen? Det var jo akkurat det han spurte om i posten, jo!

 

Greit at du veldig gjerne vil kritisere meg, men finn da et sted der det er noe å kritisere.

 

Han skriver " for en konstruktor kan en vel la være å kjøre om en vil?" - og i en klasse (så lenge den ikke er statisk) vil man alltid kjøre konstruktøren i det man oppretter en ny objektinstans av klassen.

Lenke til kommentar

Ja.

 

og ikke for å fortsette "krangelen" Manfred, men jeg tolket det som at han snakket om eksplisitt definerte konstruktører. Teknisk sett har du selvsagt rett i at man ikke kan instansiere en klasse uten å kalle en konstruktør. Jeg stiller vel bare ikke like høye krav til korrekt og utvetydig terminologi som deg.

Lenke til kommentar
Ja.

 

og ikke for å fortsette "krangelen" Manfred, men jeg tolket det som at han snakket om eksplisitt definerte konstruktører. Teknisk sett har du selvsagt rett i at man ikke kan instansiere en klasse uten å kalle en konstruktør. Jeg stiller vel bare ikke like høye krav til korrekt og utvetydig terminologi som deg.

 

Det er ikke så rart han presisrte det, jeg tolket innlegget i samme retning som manfred.

 

Men det spiller ingen rolle, nå er ihvertfall det presisert at en ikke kan la være å kalle minst én constructor.

 

Men tilbake til topic, så skjer det en slags kryssinitialisering når klassen er arvet som gjør at det er litt vanskelig å holde styr på hva som skjer når. Så derfor mener jeg at vi kan konkludere med at alle variabler skal initialiseres i constructoren, untatt hvis det er hensiktsmessig (for eksempel statiske felt) å initialisere dem utenfor.

Endret av GeirGrusom
Lenke til kommentar

Det er jo heller ikke noe problem å initialisere statiske felter i konstruktøren.

 

class MinKlasse
{
 static List<string> minListe;

 public MinKlasse()
 {
minListe = new List<string>();
 }
}

 

...vil jo fungere helt fint det...

 

Jeg synes uansett det er "god vane" å initialisere de i konstruktøren uansett..

Endret av Manfred
Lenke til kommentar
  • 2 uker senere...
Vil ikke det kunne gi deg noen artige resultater, kanskje? :)

 

Uansett liker jeg å oppbevare statiske variabler i en statisk "placeholder"-klasse, og ikke sammen med alle instansene.

 

Hvis du skal initialisere statiske variable, så kan man jo gjøre det i den statiske konstruktøren. Den kjøres før noen som helst instanser blir kalt.

 

Class1

{

static List<string> var1;

static Class1()

{

var1 = new List<string>();

}

}

Lenke til kommentar
Hva?

 

En konstruktør i en statisk klasse vil da aldri kjøres, siden du aldri sier "new" om den?

 

Altså...hvis du i tillegg har en statisk metode som du kaller på klassen, så vil denne konstruktøren kjøres før du kommer inn i metoden hvis du skjønner hva jeg mener.

 

Jeg var ikke klar over at en kunne definere constructorer til statiske klasser.

 

Den blir jo strengt tatt definert uansett, slik som på vanlige klasser. Du har derimot ikke mulighet til å sende paramatere til den, eller kontrollere når den blir kalt.

 

Edit:

For å stjele litt fra MSDN

public class Bus
{
// Static constructor:
static Bus()
{
	System.Console.WriteLine("The static constructor invoked.");
}

public static void Drive()
{
	System.Console.WriteLine("The Drive method invoked.");
}
}

class TestBus
{
static void Main()
{
	Bus.Drive();
}
}

 

skriver ut:

The static constructor invoked.

The Drive method invoked.

Endret av The Jackal
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...