Avatar billede Slettet bruger
03. august 2006 - 10:13 Der er 17 kommentarer og
2 løsninger

Static metoder i ASP.NET

Hejsa,

Jeg har et lille "problem".
Jeg skal til at udvikle en web-applikation, hvor det blandt andet skal være nuligt at vælge en varetype, hvorefter applikationen sender et id til en metode, der returnerer en pris.

Mit dilemma er følgende:
1. Skal jeg lave den/de metoder som normalt med public void/string o.l. og dermed oprette et objekt af typen af denne klasse når jeg skal kalde metoden til beregningen af prisen?

2. Eller kan/skal jeg lave den/de metoder static sådan at jeg kan kalde metoderne uden at skulle oprette/nedlægge objekter af typen af klassen hver gang en pris skal hentes fra DB?

Er det rent ressourcemæssigt forsvarligt at operere med static metoder og vil det influere på det brugerne ser når de laver kald samtidig med andre brugere?

Nogen med erfaringer på dette område?
Avatar billede dr_chaos Nybegynder
03. august 2006 - 10:22 #1
Det er klart det bedste at oprette et selvstændigt objekt.
Statiske metoder kan give problemer hvis applikationen skal bruges af mange personer.
DU kan jo evt. sende objektet med rundt som en parameter til funktioner.
Så skal du ikke oprette et nyt objekt.
Avatar billede Slettet bruger
03. august 2006 - 10:50 #2
Tak for svar.
Det var jo en mulighed, som jeg på nuværende tidspunkt helst vil undgå da jeg allerede sender andre parametre med rundt.

Hvad er fordelene ved static og hvad er ulemperne (ud over den du lige nævner der)?
Avatar billede dr_chaos Nybegynder
03. august 2006 - 11:14 #3
fordelen er jo at du kan kalde metoden uden at lave en instans af klassen.
Den største ulempe som jeg ser det er den som jeg har nævnt.
Jeg oplevede den selv i forbindelse med at jeg havde en statisk function som koblede sig op til databasen og udførte en stored procedure.
Når der var mange brugere gav det konflikter i forbindelse med åbning og lukning af forbindelsen til databasen.

En andet problem var et statisk array på den hjemmeside hvor værdier fra en tidligere bruger blev vist når en ny bruger kom ind på siden.

statisk kan f.eks. bruges hvis du hele tiden skal returnere den samme variabel eller hvis du laver simple beregninger.

Men du skal passe på hvis du nu skal kalde op til en database og hente nogle priser.
Hvis du bare sender priserne til en funktion som beregner total behøves du ikke at være så forsigtig
Avatar billede Slettet bruger
03. august 2006 - 11:28 #4
Kan jeg få dig til at komme med et eksempel på opbygning/kald til en simpel klasse med statiske metoder?

Jeg har aldrig benyttet det før.
Jeg vil selvfølgelig følge dit råd og lave instanser af objektet i stedet for (bare for en sikerheds skyld). Det er dog meget simpelt det jeg skal returnere, men heller være på den sikre side.
Avatar billede dr_chaos Nybegynder
03. august 2006 - 11:45 #5
public class class1
{
public class1() { }

public static int returnab(int a, int b)
{
return a+b;
}


}
Avatar billede dr_chaos Nybegynder
03. august 2006 - 11:46 #6
ved kald benytter man

class1.returnab(3,4);
Avatar billede esbenp Nybegynder
03. august 2006 - 12:51 #7
dr_chaos

de problemer du beskriver er fordi du har statisk data og ikke fordi din metode er statisk.
Avatar billede Slettet bruger
03. august 2006 - 12:54 #8
Vil det sige, at man egentlig godt kan have både statistike metoder og "almindelige" metoder i en klasse?

Jeg tænker her på den/de føromtalte metoder, der returnerer noget ud fra et valg fra brugeren (og som så ikke bør være statiske) og samtidig en/flere metoder, der returnerer noget statisk - foreksempel en liste, der skal være ens for alle kald til klassen?

Den statiske metode kan så kaldes fra Page_Load fra den side hvor den skal bruges - altså

if(!Page.IsPostBack)
klasseX.StatiskMetode();

og så kan de andre metoder kaldes fra evt. eventhandler-metoder, hvos brugeren vælger at klikke på en knap?

Vil det være ok, at gøre det sådan?
På denne måde vil jeg umiddelbart mene, at jeg så ikke behøver at oprette objektet flere gange i den samme code-behind og/eller erklære objektet globalt i code-gehind.

Er dette rigtigt forstået?
Avatar billede esbenp Nybegynder
03. august 2006 - 12:55 #9
thomasso

Hvis det er simpelt vil jeg anbefale at lave dine metoder statiske. Begrænsningen på statiske metoder er at de kun har adgang til parametre i metoden eller statisk data.

Statisk data er delt mellem alle objekter af klassen og alle threads der kører en statisk metode så det skal du passe på med at bruge.
Avatar billede Slettet bruger
03. august 2006 - 13:07 #10
Ja. Jeg skal så også kun returnere en liste, hvor værdierne hentes fra en database og vil være de samme for alle brugere.
Dog kan jeg se at jeg nu er rendt ind i et nyt problem.

Jeg gar vidst ikke rigtig mulighed for at afvikle database-kald fra den statiske metode?
Jeg kan ikke oprette den samme databaseadgang fra denne metode som jeg kan fra alle de andre.

Jeg opretter databaseadgangen via et "DBFactory" objekt, hvor jeg har sat globale variable for henholdsvis connection og command, men jeg får en fejl om en object reference i den statiske metode.

Hvad er lige problemet her?
Avatar billede lateralus Nybegynder
03. august 2006 - 13:48 #11
Der skulle da ikke være nogle problemer med at afvikle database-kald fra en statisk metode? Kan du poste noget kode?

Iøvrigt, såfremt data i databasen ikke ændrer sig hyppigt kan du vel med fordel indlæse data én gang for alle i en statisk constructor og gemme data i en collection af en eller anden slags (eksempelvis en hashtable). Derefter kan din metode der beregner prisen slå op i denne collection, istedet for at slå i databasen hver gang.
Dvs.:

static class CalculatorClass
{
    private static Hashtable _data;

    static CalculatorClass() // static constructor
    {
        // indlæs data fra database her og gem i hashtabel
    }

    public static double BeregnPris(int vareid)
    {
        // hent pris fra collection, lav evt. beregning og returnér prisen
    }
}
Avatar billede hmortensen Nybegynder
03. august 2006 - 17:14 #12
Lidt off, men ret sjov en, om hvornår man ikke skal bruge static:
http://thedailywtf.com/forums/thread/65834.aspx
Avatar billede arne_v Ekspert
03. august 2006 - 21:09 #13
du bør kun bruge static metoder til totalt kontekst frie metoder - hvis din hent
fra database metode selv åbner og lukker connection, så virker den fint static også i
flerbruger sammenhæng, men åbnes connection i en static metode og bruges i en anden
static metode så går det grueligt galt i flerbruger sammenhæng - og det gælder
også for alle andre former for kontekt afhængighed

men et par pointer:

1)  hvis du starter med en objekt model og finder klasser udfra den så vil din
    metode med stor sandsynlighed blive ikke static helt uden at du skal
    sidde og fundere over det

2)  når du kommer lidt videre i program design vil du begunde at lave det som:

MitInterface o = new MinKlasse();
o.MinMetode();

og

MitInterface o = MinFactory.GetMinKlasse(cfg);
o.MinMetode();

og i så fald skal MinMetode være ikke static for at det virker !
Avatar billede Slettet bruger
04. august 2006 - 13:27 #14
Tak for input.
esbenp, lateralus og dr_chaos.

Smidder i lige et svar?
Avatar billede dr_chaos Nybegynder
04. august 2006 - 13:41 #15
gerne :)
Avatar billede lateralus Nybegynder
04. august 2006 - 19:20 #16
ellers tak - jeg er ikke samler... :)
Avatar billede Syska Mester
04. august 2006 - 19:50 #17
lalalalla
Avatar billede esbenp Nybegynder
05. august 2006 - 14:40 #18
tak
Avatar billede Slettet bruger
05. august 2006 - 16:05 #19
Tak igen :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester