Avatar billede mr_miyagi Nybegynder
17. maj 2005 - 14:02 Der 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.
Avatar billede jps6kb Novice
17. maj 2005 - 14:04 #1
Din klasse hedder vel også c , og ikke connection ?
Avatar billede poulsgaard Praktikant
17. maj 2005 - 14:07 #2
Du kan også lave metoderne static i din klasse så behøver du ikke at lave en instans for at bruge funktionen !

Poulsgaard
Avatar billede poulsgaard Praktikant
17. maj 2005 - 14:11 #3
Det vil sige at du kan skrive Connection.Myfunction(input)

istedet for:
Connection c = new Connection();
c.Myfunction(input);
Avatar billede mr_miyagi Nybegynder
17. maj 2005 - 14:21 #4
det er ikke helt det jeg mener
fx i java skriver du
import connection

men hvad hedder det i c#
Avatar billede poulsgaard Praktikant
17. maj 2005 - 14:23 #5
using system
using system.IO

eller hvor nu din klasse ligger
Avatar billede mr_miyagi Nybegynder
17. maj 2005 - 14:42 #6
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
Avatar billede poulsgaard Praktikant
17. maj 2005 - 14:46 #7
hvilket udviklingsmiljø/compiler bruger du ?
Avatar billede mr_miyagi Nybegynder
17. maj 2005 - 14:49 #8
jeg bruger visualstudio
Avatar billede mr_miyagi Nybegynder
17. maj 2005 - 14:50 #9
og har .net 1.1 installeret
Avatar billede mr_miyagi Nybegynder
17. maj 2005 - 14:59 #10
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
Avatar billede spif2001 Nybegynder
17. maj 2005 - 16:59 #11
Hvis main og Connection ligger i samme namespace kan de "se" hinanden. Tjek øverst i dine klasse at namespacene er identiske.
Avatar billede spif2001 Nybegynder
17. maj 2005 - 17:03 #12
Hvis de ligger i hver deres namespace, men i samme project, er det nok at bruge "using MyNamespace;".

Hvis de ligger i hver deres project, skal du have en reference til projektet OG en using clause...
Avatar billede mr_miyagi Nybegynder
17. maj 2005 - 21:24 #13
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;

namespace webtimizer

{
    public class DbConnection
    {
        string text;
        private OleDbConnection conn;
        string connectionString;
        private OleDbCommand command;
        private string sqlStr;
        private string sqlString;
        private DataSet dataSet;
        private OleDbDataAdapter oleDbDataAdapter;

        /************************************
        * Initalerisering af diverse objekter
        *************************************/
        public DbConnection(string database)
        {
            dataSet = new DataSet();

            connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                @"Data source=" + @"C:\Inetpub\database\" + database + ";" +
                "Jet OLEDB:Database Password=bokm0527;";

            conn = new OleDbConnection(connectionString);
        }



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..
Avatar billede burningice Nybegynder
18. maj 2005 - 09:51 #14
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();
}
Avatar billede burningice Nybegynder
18. maj 2005 - 09:53 #15
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.
Avatar billede poulsgaard Praktikant
18. maj 2005 - 09:53 #16
Men klassen ligger jo i en anden fil, derfor kan han vel ikke umiddelbare lave en instans af den ??
Avatar billede arne_v Ekspert
18. maj 2005 - 09:56 #17
og C# og Java er iøvrigt helt ens på det område:

C# class = Java class
C# static metode = Java static metode
C# namespace = Java package
fil = 1 eller flere klasser

Største forskel er at Java har et par restriktioner:
  - kun en package per fil
  - kun en public class per fil
Avatar billede arne_v Ekspert
18. maj 2005 - 09:56 #18
- package struktur og directory struktur skal matche
Avatar billede burningice Nybegynder
18. maj 2005 - 09:57 #19
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.
Avatar billede poulsgaard Praktikant
18. maj 2005 - 09:59 #20
Kigger den alle .dll'er efter - cool

Og hvis den ikke lige ligger i /bin-mappen, måske fordi man ikke laver applikationer til en Webserver, hvor skal man så lægge sin .dll fil
Avatar billede burningice Nybegynder
18. maj 2005 - 10:01 #21
plus at Java vel kræver at man lave en import

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();

Det bliver nok lidt træls i længden.
Avatar billede poulsgaard Praktikant
18. maj 2005 - 10:03 #22
i øvrigt kunne
System.Web.UI.Webcontrols.Datagrid ds = new System.Web.UI.Webcontrols.Datagrid();

vel god blive nødvendig hvis man bruger et namespace med en anden Datagrid() i (fx noget database relateret)

;-))
Avatar billede burningice Nybegynder
18. maj 2005 - 10:03 #23
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.
Avatar billede poulsgaard Praktikant
18. maj 2005 - 10:04 #24
cyberfessor >> fint nok
Avatar billede burningice Nybegynder
18. maj 2005 - 10:06 #25
poulsgaard>> jo.. det er rigtigt. Men det er dårlig navngivningsstil at have klasser der hedder der samme som umiddelbart har relation til hinanden.

Så hvis man f.eks. har en DataGrid-klasse i noget databaserelateret kode som kan bruges overalt, så bør man omdøbe den til noget andet. Men f.eks.

System.Windows.Forms.Button og
System.Web.UI.Webcontrols.Button

er ok, fordi at de to klasser aldrig vil blive brugt i samme context.
Avatar billede burningice Nybegynder
18. maj 2005 - 10:07 #26
Men det er dårlig navngivningsstil at have klasser der hedder der samme som umiddelbart har relation til hinanden.

burde nok være

Men det er dårlig navngivningsstil at have klasser der hedder det samme som umiddelbart kommer til at blive brugt i samme context.
Avatar billede poulsgaard Praktikant
18. maj 2005 - 10:09 #27
Det er jo ikke mig der har lavet alle system.x namespaces, jeg er bare den dumme og naive bruger.

Men du har i øvrigt ret.
Avatar billede burningice Nybegynder
18. maj 2005 - 10:30 #28
"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.
Avatar billede burningice Nybegynder
18. maj 2005 - 10:30 #29
meget lækkert værktøj hvis man gerne vil have strammet sin kodning lidt op.
Avatar billede arne_v Ekspert
18. maj 2005 - 10:38 #30
18/05-2005 10:01:18>

nej - java kræver ikke mere import end C# kræver using

java.util.Date d = new java.util.date();

virker hvis man har lyst
Avatar billede arne_v Ekspert
18. maj 2005 - 10:39 #31
18/05-2005 10:07:37>

namespaces er opfundet fordi på trods af alle de gode intentioner, så sker der navne
sammentræf i den virkelige verden.
Avatar billede mr_miyagi Nybegynder
18. maj 2005 - 10:45 #32
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 :)
Avatar billede burningice Nybegynder
18. maj 2005 - 19:03 #33
"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?
Avatar billede mr_miyagi Nybegynder
19. maj 2005 - 11:42 #34
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.. :)
Avatar billede mr_miyagi Nybegynder
19. maj 2005 - 18:42 #35
cyberfessor
har du fået dine point?
Avatar billede burningice Nybegynder
20. maj 2005 - 11:02 #36
jeps, det har jeg :) tak for det
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