Svish Skrevet 29. september 2008 Del Skrevet 29. september 2008 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
HDSoftware Skrevet 29. september 2008 Del Skrevet 29. september 2008 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
GeirGrusom Skrevet 29. september 2008 Del Skrevet 29. september 2008 (endret) 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 29. september 2008 av GeirGrusom Lenke til kommentar
Svish Skrevet 29. september 2008 Forfatter Del Skrevet 29. september 2008 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
Manfred Skrevet 29. september 2008 Del Skrevet 29. september 2008 Hvordan skal du la være å kjøre en konstruktør når du oppretter en ny instans av klassen? Lenke til kommentar
hockey500 Skrevet 29. september 2008 Del Skrevet 29. september 2008 (endret) 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 29. september 2008 av hockey500 Lenke til kommentar
Manfred Skrevet 29. september 2008 Del Skrevet 29. september 2008 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
Svish Skrevet 29. september 2008 Forfatter Del Skrevet 29. september 2008 (endret) kjøres constructor selv når man ikke kjører : base() ? og kjøres base() hvis man kjører base(annen signatur)? Endret 29. september 2008 av Svish Lenke til kommentar
hockey500 Skrevet 29. september 2008 Del Skrevet 29. september 2008 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
GeirGrusom Skrevet 29. september 2008 Del Skrevet 29. september 2008 (endret) 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 29. september 2008 av GeirGrusom Lenke til kommentar
Manfred Skrevet 30. september 2008 Del Skrevet 30. september 2008 (endret) 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 30. september 2008 av Manfred Lenke til kommentar
steingrim Skrevet 30. september 2008 Del Skrevet 30. september 2008 Det er jo heller ikke noe problem å initialisere statiske felter i konstruktøren. Men hvor lurt er det å initialisere statiske data i instans-konstruktøren? Hver gang du oppretter en instans vil du overskrive de statiske dataene. Neppe noe man vil. Lenke til kommentar
Manfred Skrevet 30. september 2008 Del Skrevet 30. september 2008 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. Lenke til kommentar
The Jackal Skrevet 8. oktober 2008 Del Skrevet 8. oktober 2008 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
Manfred Skrevet 8. oktober 2008 Del Skrevet 8. oktober 2008 Hva? En konstruktør i en statisk klasse vil da aldri kjøres, siden du aldri sier "new" om den? Lenke til kommentar
steingrim Skrevet 8. oktober 2008 Del Skrevet 8. oktober 2008 Hva? En konstruktør i en statisk klasse vil da aldri kjøres, siden du aldri sier "new" om den? En STATISK konstruktør, ikke instans-konstruktør. Merk ordet static foran ctoren i eksempelet. Lenke til kommentar
GeirGrusom Skrevet 8. oktober 2008 Del Skrevet 8. oktober 2008 Jeg var ikke klar over at en kunne definere constructorer til statiske klasser. Lenke til kommentar
The Jackal Skrevet 8. oktober 2008 Del Skrevet 8. oktober 2008 (endret) 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 8. oktober 2008 av The Jackal Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå