Getter og setter c#

Tags:    c#

<< < 12 > >>
Hejsa :)

Jeg sidder og er ved at omlægge min webform til at benytte get og set metoder.
Jeg har lavet en specifik class kun til data: Data.cs med følgende indhold.

Når jeg debugger bliver oplysningerne fint lagt i min get og set, men så snart jeg skal bruge oplysningerne i en anden class, så er den nulled

Måden jeg lægger indhold i er:

Fold kodeboks ind/udCSharp kode 



Data.cs fil

Fold kodeboks ind/udCSharp kode 



Kan i se hvorfor min get/set ikke gemmer oplysningerne ?

//Jesper



16 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 9 karma
Sorter efter stemmer Sorter efter dato
Mit gæt er at du ikke initialiserer korrekt efter webforms måden at gøre tingene på.
Webforms har en meget kort levetid (objektmæssigt) - så der køres din constructor, udføres de kaldte events og så kastes alting væk.
Næste gang du modtager en postback så opbygges alting op igen så her laves dit objekt igen.
Det specielle i webforms er at den gemmer state på dine elementer i siden - såsom fx en tekstbox.
Dette gemmer den i viewstate som er noget lagret inde i siden.

Load: Siden laves og sendes ud til brugeren
Action: Brugeren indskriver noget i din tekstboks og trykker på en knap
Postback: Siden sendes derfor til serveren (dig) og state (tekst) er gemt for dig.

Derfor skal du ikke selv huske at sætte dine elementer til det som brugeren sidst har sat dem til for gør ASP.NET for dig.

Så hvis du i constructoren laver
Fold kodeboks ind/udCSharp kode 

vil du automatisk få sat dit objekt til det som der står i tekstboksen.

Men husk dit objekt dataClass er nu den instans der lever i din constructor og ikke længere, så så snart den er færdig så er objektet væk fordi der er intet der holder fast i den.
Så hvis du i en anden metode laver første linie, så er dette en ny instans og dermed er Server ikke sat.

Hvis du vil dele dit objekt andre steder kan du lade det blive en del af din side, ved at have en property (GET/SET) efter din constructor, hvori du sætter din Data-class.

Fold kodeboks ind/udCSharp kode 

Her vil din CorrectLocalHost stadig have dit objekt fordi du har lagt det ind i en property som holder på objektet, når din constructor er ovre. Dermed forsvinder dit objekt ikke og du vil kunne få fat i det i når du et andet sted kalder CorrectLocalHost().
Så hvis du har løst det ved at lave dit data-objekt igen (new Data() ) så er det ikke længere samme objekt og derfor din værdi er "forsvundet".

Alternativt skal du begynde at se på muligheder med static.

Håber det gav mening og var forståeligt :)



Når du initialiserer dit Data objekt, er data objektet så den samme som du benytter hvor den siger null?

Gemmes den som lokal variabel, eller er den global, og hvordan får du fat i objektet?

Jeg tror at vi skal se noget mere kode, før vi kan hjælpe med at lokaliserer fejlen.



Indlæg senest redigeret d. 19.02.2013 13:23 af Bruger #4487
Jeg initialiserer mit dataobjekt globalt i:

Fold kodeboks ind/udCSharp kode 


Det gør jeg på samme måde i de andre klasser jeg benytter. Efter min overbevisning så burde det være globalt?

i den klasse der fx skal bruge de data sætter jeg den string eller anden variabel til = dataClass.Server



Jeg ville lave en constructor i data som tager dine felter som parameter og så kan du instantiere objektet med:


Fold kodeboks ind/udCSharp kode 


Og så behøver du vel egentlig ikke get/set metoder, da constructoren har adgang til dine privates. Om det er en "pæn" måde at gøre det på, ved jeg dog ikke :-)



Hvis jeg bruger en constructor, så ender jeg bare med rigtig mange af dem, da jeg har 10 felter og nogle gange er det kun det ene felt jeg skal bruge.

Så ender jeg med at have constructorere der kun tager et felt eller flere. :/



Hver gang du bruger objekt formen Class class = new Class(); vil den medfødte constructor sætte variabler til nill. Du kan komme om det, ved at lave din egen public Class(){} og så sende dine objekter med som parametre.
Tam.



Kan du give et eksempel Tam ? :)



indholdsrigt svar :)

din dataproperty har jeg ikke helt forstået.. jeg vil gerne kunne kalde min data direkte fra min dataklasse uden alt for meget kode:

Hvis jeg gør sådan i min data.cs er der så ikke en mere simpel måde at kunne tilgå min get/set på fra en anden klasse? :/

Fold kodeboks ind/udCSharp kode 




Nu har du ikke skrevet koden til din data klasse, men jeg vil mene du gør noget forkert hvis du skal sætte properties for at kunne få data tilbage.

Jeg ville lave metoder for hvert ting du vil hive ud fra dit datalag. Så tager din metode imod de parametre der skal til for at hente data ud korrekt. Jeg mener ikke det holder at du skal have styr hvilke properties skal bruges for at kunne hente hvilke data ud.



Nu har du ikke skrevet koden til din data klasse, men jeg vil mene du gør noget forkert hvis du skal sætte properties for at kunne få data tilbage.

Jeg ville lave metoder for hvert ting du vil hive ud fra dit datalag. Så tager din metode imod de parametre der skal til for at hente data ud korrekt. Jeg mener ikke det holder at du skal have styr hvilke properties skal bruges for at kunne hente hvilke data ud.
Jeg er enig i den betragtning :P



<< < 12 > >>
t