03. august 2006 - 10:13Der 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?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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.
Synes godt om
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)?
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
Synes godt om
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.
de problemer du beskriver er fordi du har statisk data og ikke fordi din metode er statisk.
Synes godt om
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.
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.
Synes godt om
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.
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 } }
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 !
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.