17. maj 2005 - 14:02Der er
35 kommentarer og 1 løsning
klasser i C#
Hvordan bruger man metoderne i en anden klasse som man fx. kan gøre i JAVA.. fx man har en klasse der fx. hedder connection.cs og en der hedder main.cs så skal man bruge metoderne i connection.cs i main.cs klassen. jeg ved man skaber et object af connection.cs: Connection c = new Connection(); men den kan ikke finde klassen connection.
ja.. men det har jeg prøvet jeg har prøvet : using Connection.cs; men så mangler den en reference. Jeg har givet den et Namespace, men den kan alligevel ikke finde filen.. det er fordi jeg vil undgå at oprette et projekt så jeg slipper for alle de ekstra filer som kommer med.. men kan dele kodefilerne op i asp. og det er det samme jeg vil gøre i asp.net med c# klasserne og så importere med using.
jeg vil lave det ligesom man gør i java, hvor man ikke behøver at oprette et projekt for at få de forskellige klasser til at snakke sammen, hvis man kan sige det sådan
kan det virkelig passe at man SKAL oprette projekt før man kan få det til at virke, syntes bare det lyder lidt underligt. at de ikke har lavet det sådan man bare kan skrive using connection.cs, og så få adgang til den fil, uden det ligger i et projekt
De ligger ikke i noget projekt, det er to forskellige filer, som har det samme namespace. hvor jeg ønsker at bruge metoderne fra den ene fil i den anden
sådan ser den ene C# fil ud og det er den fil hvor jeg skal bruge connection metoderne: er det nødvendig at have alle filer tænker på *.rscx, web.config (den skal man have med, global.asax, for at kunne bruge metoderne fra den anden fil.
using DbConnection.cs; (det har jeg forsøgt at gøre, men jeg kan alligevel ikke bruge metoderne fra DbConnection.cs, i denne klasse) using System; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; //using DbConnection.cs;
namespace webtimizer { /// <summary> /// Summary description for WebForm1. /// </summary> public class Sitemap : System.Web.UI.Page { } public void Sitemap() { }
og derefter kommer alle de andre metoder.
den anden klasser starter sådan her :
using System; using System.Data.OleDb; using System.Data; using System.Collections;
/************************************ * Initalerisering af diverse objekter *************************************/ public DbConnection(string database) { dataSet = new DataSet();
som i kan se ligger de i det samme namespace, og IKKE i noget projekt...men jeg syntes bare ikke jeg kan bruge de metoder som connection har i Sitemap(som jeg før kaldte Main) hvorfor?? mangler jeg at impotere noget eller skrive noget ekstra for at kunne bruge metoderne..
1) Dine klasser hedder IKKE (!!) connection.cs og main.cs. Det er FILERNE de er skrevet i der hedder det, og har INTET med dine klassenavne at gøre. Der kan for så vidt ligge 2873278423460 forskellige klasser i samme fil hvis man ønsker det.
Derfor giver det heller ikke mening f.eks. at sige at man gerne vil bruge metoder fra en anden fil.
2) using er kun til for at gøre det lettere for programmøren, og har ikke nogen effekt rent kodemæssigt, ud over at man kan slippe for at skrive lidt mindre.
Typer i .Net er navngivet på 2 niveauer. Det første er namespacet, og dernæst kommer navnet på selve klassen. Det kan sammenlignes med et filsystem, hvor filer er organiseret i mapper. Man kan f.eks. godt have flere filer der hedder det samme, bare de ligger i hver sin mappe.
3) For at bruge metoder fra en klasse skal man have en INSTANS af klassen. En klasse er ikke andet end en støbeform til en legoklods. Du kan ikke lege med en støbeform, der skal først produceres en konkret klods.
4) for at summere det hele op, så kan du f.eks. skrive følgende i Sitemap-klassen for at kunne få fat i din database:
DbConnection c = new DbConnection("hej");
c.Open(); DataSet ds = c.GetData("SELECT * FROM dotNetArtikler"); c.Close();
foreach (DataRow dr in ds.Tables[0].Rows) { dr[0].Read(); }
Og hvis der kommer en fejl-side med at DbConnection ikke kan findes, så er det fordi at du ikke har glemt at kompile DbConnection.cs til en Dll-fil og lægge den i /bin-mappen på dit webhotel.
poulsgaard>> jo... hvis filen er kompilet til en dll-fil og ligger i /bin-mappen. It's the magic-folder in Asp.Net. Her vil .Net automatiks kigge efter evt. klasser den ikke kan finde andre steder før den kommer og brokker sig.
C# kræver ikke at man bruger using. Den er der bare for bekvæmmelighedens skyld, da det ellers kunne blive noget MEGET LANGE linjer koder man skulle skrive:
System.Web.UI.Webcontrols.Datagrid ds = new System.Web.UI.Webcontrols.Datagrid();
poulsgaard>> det er en ren asp.net-ting, og den feature er der kun fordi at aspx-sider ikke kan precompiles, og man derfor heller ikke kan tilføje en reference til den dll-fil man vil bruge, på samme måde som hvis du f.eks. laver et windows-program.
Når du laver en .exe-fil skal dll-filen som hovedregel ligge i samme mappe som .exe-filen, og du skal huske at tilføje en reference til dll-filen når .exe-filen compiles.
"den dumme og naive bruger" der forhåbenligt gerne skulle blive klogere :)
Hvis du forresten er interreseret i god kodestil og navnekonventioner, så vil jeg anbefale dig at bruge FxCop (http://www.gotdotnet.com/team/fxcop/) til at analysere din kode. Den kan finde en masse typiske fejl og kommer med forslag til hvordan du kan rette dem.
Det kan f.eks. være at man ikke skal navngive noget XMLDocument, men XmlDocument, da bogstaverne i en tre-bogstavs forkortelse ikke alle må være store. Hvorimod at i en tobogstavsforkotelse, der skal de netop være store, f.eks. WindowsXP eller System.IO
Den finder også stavefejl, om abstracte klasser f.eks. har public constructers eller om man sammenligner to floating points variabler.
cyberfessor >> jeg har prøvet det du skriver : ---------------------------------- DbConnection c = new DbConnection("hej");
c.Open(); DataSet ds = c.GetData("SELECT * FROM dotNetArtikler"); c.Close();
foreach (DataRow dr in ds.Tables[0].Rows) { dr[0].Read(); } ------------------------------------ der er ingen problemer med at lave det hele i een stor klasse, så virker det hele som det skal, men så ville man ende ud i 7000 liniers kode..
Men selv om jeg gør det du har skrevet vil den stadig ikke finde DBConnecstion.cs som ligger i samme mappe.
>1) Dine klasser hedder IKKE (!!) connection.cs og main.cs. Det er FILERNE de er >skrevet i der hedder det, og har INTET med dine klassenavne at gøre. Der kan for så >vidt ligge 2873278423460 forskellige klasser i samme fil hvis man ønsker det.
nej de hedder ikke connection.cs og main.cs, det var et par eksempler, jeg ved godt at filerne skal hedde DbConnection.cs og Sitemap.cs og det har jeg også kaldt dem, det foregår på samme måde som i java... men nu har jeg opgivet det lidt, eller lagt det på hyllen og oprettet et projekt i VS i stedet, så kører det hele som det skal, så nu jeg finde mig i alle de ekstrafiler som kommer med et projekt.... jeg ved dotnet 2.0 gør det jeg vil have det til at gøre uden problemer, og den fjerner også alle de ekstrafiler der er med, som man faktisk ikke rigtig bruger.
I alle har være rigtig gode til at hjælpe og det siger jeg tak for, men jeg tror jeg vil vælge at give cyberfessor alle point.. så hvis du lige vil lægge et svar. undskylder for besværligheden :)
"Men selv om jeg gør det du har skrevet vil den stadig ikke finde DBConnecstion.cs som ligger i samme mappe."
Hvem er det der ikke vil finde DbConnection-klassen (lad os lige abstrahere op over de filer). Hvad for en fejl kommer der, og hvornår. Er det når du requester siden første gang? Har du husket at compilet og lagt dll-filen i /bin-mappen, som jeg skrev du skulle gøre?
sitemap.cs virkede fint nok hvis du kørte det hele i den fil, fejlen kom da jeg ville dele DbConnection delen ud i sin egen fil altså "DbConnection.cs", så når jeg forsøgte at skrive "DbConnection conn = new DbConnection();" i sitemap.cs kom der en fejl fordi den påstod at den ikke fandtes, selv om begge filer ligger i samme mappe.
Jeg havde selvfølgelig ikke lagt dll-filen i bin-mappen, hvilket hjalp.. :)
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.