Jag snurrar nog ihop för mycket och blandar ihop med VB. Du kan använda dig av "static" för att slippa initiera klassen vilket du annars måste göra för att få tag i din metod: Tack, nu fick jag tag på den, men jag gör tydligen något fel i alla fall, jag får ett error. Din metod måste returnera ett värde. Den gör det nu enbart om den kommer in i If statsen, om "texten" längd är 0 så kommer den inte in i if statsten, det är bara void som inte använder sig av return alla andra metoder måste returnera något. Som ett komplement till Fredriks svar så ligger det ett tips som handlar om detta här : [Har C# någon motsvarighet till VB:s moduler?] Tack, den biten är helt ok nu. Jag tror du skall ta en titt här t.ex.: Hej Johan. Jag hade nog gjort nåt sånt här i så fall... kanske inte den snyggaste lösningen.. Precis detta står i mitt tips ovan ([Har C# någon motsvarighet till VB:s moduler?]): Måste bara säga att angreppssättet är jävligt dumt. Se inte tekniska detaljer! Håller med om vad du säger Niklas, men mitt tips handlar inte om OOP/OOD, det handlar om vad C# klarar och inte klarar. I C# KAN du blanda statiska funktioner och instansfunktioner i en och samma klass. Om det är bra eller ej har jag inga synpunkter på i mitt tips, det är en annan diskussion...Och Namespaces finns i C#. Håller också med dig Niklas. Varför inte programmera i VB.NET om man vill köra vanligt(?) funktionsbaserad programmering (ursäkta, kommer inte ihåg vad motsatsen till OOP heter). Nu när jag ändå har gett mig in i det här, så kan jag väl lika gärna fortsätta... =) Tack alla ni som har svarat, och velat hjälpa mig att få rätt riktning på min kodning. <b>>När jag tänkte "som jag brukar" så handlade det väldigt mycket om att inte upprepa kod, dvs försöka att göra functioner t ex som underlättar. Detta tankesättet är tydligen helt eller delvist förkastligt så jag får försöka att tänka på ett annat sätt.</b> Nu svarar du ju faktiskt på min uppföljningsfråga, och det var ungefär så jag hade tänkt i mitt förvirrade tillstånd. Datatillgången ligger oftast som en klass. Brukar ha en klass som heter typ DataAccess som innehåller både connection och connectionsträngen + en del andra hjälpsamma metoder. Ahaaaa... >Gillar inte det upplägget alls, men då är det klart att man får skaffa en klass som Använda sig av Class
I VB brukade jag sammla ihop functioner i en särskilld modul. Skulle vilja göra likadant i C#.
Försöker så här:
Det finns en textruta och en knapp i form1
<code>
//under knappen i form1
string texten = textBox1.Text;
string svar = Funktioner.Class1.kollaStor(texten);
//i class1 (namespase Funktioner) ligger kollaStor
public string kollaStor(string texten)
{
if(texten.Length > 0)
{
texten.ToUpper;
return;
}
}
</code>
Felet är att jag inte får "tag i classen.
Om jag skriver ( i Form1) Funktioner lägger till en punkt så hittar han Class1.
Lägger jag till en punkt så hittar han Equals och ReferenceEquals men inte min class.
Hur bör jag skriva för att kunna ha ett bibliotek utanför de vanliga formerna(form1 osv)Sv: Använda sig av Class
Ändra:
public string kollaStor(string texten)
till:
public static string kollaStor(string texten)
/Fredrik Normén NSQUARED2Sv: Använda sig av Class
Så här ser det ut nu.
<code>
private void button1_Click(object sender, System.EventArgs e)
{
string texten = textBox1.Text;
string svar = Funktioner.Class1.kollaStor(texten);
textBox1.Text = svar;
}
//class1
public static string kollaStor(string texten)
{
if(texten.Length > 0)
{
texten.ToUpper();
return texten.ToString();
}
}
</code>
Error:
E:\MeraTest\Test\Class1.cs(21): 'Funktioner.Class1.kollaStor(string)': not all code paths return a value
Vad jag försöker att göra är att när jag klicka på knappen, så skall texten bli i versaler.
Just denna app har ingen betydelse, men jag ville lära mig hur jag kan skicka info ifrån en classfil till en annan class.Sv: Använda sig av Class
<code>
public static string kollaStor(string texten)
{
if(texten != null && texten.Length > 0)
{
return texten.ToUpper();
}
return string.Empty;
}
</code>
/Fredrik Normén NSQUARED2Sv: Använda sig av Class
Sv: Använda sig av Class
Nu till verkligheten.
Vad jag skulle vilja göra är att ha min dataconnection i en classfil. Jag försöker med min tidigare övning i minnet.
I classfilen:
<code>
using System;
using System.Data;
using System.Data.OleDb;
//lite kod
public OleDbConnection con;
public OleDbDataAdapter da;
public DataSet ds;
public Class1()
{
//
// TODO: Add constructor logic here
//
konnekta();
}
//lite kod
public static object konnekta()
{
string CONstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Försäljning.mdb";
con = new OleDbConnection(CONstring);
}
</code>
Det ger mig följande error:
E:\MeraTest\Test\Class1.cs(37): An object reference is required for the nonstatic field, method, or property 'Funktioner.Class1.con'
Jag antar att jag inte kan ha static i den classen?Sv: Använda sig av Class
http://www.developerfusion.com/show/3821/5/
Problemet är att en statisk metod är separerad från själva instansen av klassen. Alltså så känner den inte till variabler som definerade i en instans av klassen. Kolla på länken ovan så kanske det klarnar lite. Om du inte skall göra sååå avancerade saker vid uppkopplingen kanske det räcker med att spara din connectionstring som en statisk variabel. Då behöver du ju bara ändra på ett ställe.Sv: Använda sig av Class
Nja jag är inte säker på att jag förstod artiklen, men så här är det just nu.
I classen:
<code>
using System.Data;
using System.Data.OleDb;
public OleDbConnection con;
public OleDbDataAdapter da;
public DataSet ds;
public Class1()
public static object konnekta()
{
string CONstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Försäljning.mdb";
OleDbConnection con = new OleDbConnection(CONstring);
return con;
}
//i formen
public OleDbConnection con;
public OleDbDataAdapter da;
public DataSet ds;
//han kräver dessa deklarationern igen.
listBox1.Items.Clear();
string SQLstring ="SELECT * FROM Kunder";
da = new OleDbDataAdapter(SQLstring,con);
ds = new DataSet("frånKunder");
</code>
Det är naturligtvis mera kod, men jag tar bara med detta.
Jag får ett error:
Objectreferensen har inte angetts till en instans av ett object.
Jag tror att jag är helt åt skogen, jag skall väll inte behöva deklarera t ex con på mer än ett ställe?Sv: Använda sig av Class
<code>
public class Myconnection()
{
public static OleDbConnection CONNECTION=null;
public static OleDbDataAdapter DATAADAPTER=null;
public static DataSet DATASET=null;
public static void Konnekta()
{
string CONstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Försäljning.mdb";
CONNECTION = new OleDbConnection(CONstring);
}
}
//i formen
listBox1.Items.Clear();
string SQLstring ="SELECT * FROM Kunder";
Myconnection.Konnekta(); //för att sätta Myconnection.CONNECTION
Myconnection.DATAADAPTER = new OleDbDataAdapter(SQLstring,Myconnection.CONNECTION);
Myconnection.DATASET = new DataSet("frånKunder");
</code>Sv: Använda sig av Class
"Du kan t o m blanda statiska metoder och instansmetoder (dvs vanliga metoder som kräver en instans för att anropas) men kom ihåg att statiska metoder inte kan accessa data eller metoder som inte är deklarerade som static. "
Alla variabler som används i en static-metod måste vara deklarerade som static själva.Sv: Använda sig av Class
Antingen kör man objektorienterat, eller så gör man det inte. Att vilja peta in allt i en klass för att samla ihop det är definitivt inte korrekt enligt gängse objektorienteringsregler.
Tänk inte på om man kan komma åt icke-statiska variabler i en statisk metod.
Tänk istället så här:
Man har en typ av objekt, och alla sådan objekt har dels egna egenskaper och dels egenskaper som delas av alla objekten samtidigt. Det finns också något slags metod som man kan anropa som är generell för alla objekten. Ska denna metod kunna komma åt egenskaper hos enskilda objekt?
Nej - och man skulle aldrig komma på tanken att de skulle göra det heller!
Det är därför problem uppstår när man använder icke objektorienterade idéer med objektorienterade konstruktioner.
Jag är inte insatt i C# tillräckligt, är det som Java där allt måste vara del av klasser?
I så fall ska ju en funktionsorienterad "hopbuntning" ske i en dummy-klass med bara statiska metoder och variabler.
Är det inte så, så skall man lägga alla i ett namespace (_det_ finns väl i C#?).
Men allra bäst är naturligtvis att göra en ren OOD istället; på det sättet som Arathorn föreslår.
PS.
Det här känner säkert redan alla till, och ni undrar varför jag skriver det här i så fall. Det är för att jag borde läsa på till en omtenta, men jag orkar inte... =)Sv: Använda sig av Class
Sv: Använda sig av Class
Det som är så bra med OOP, är att det blir mycket enklare att strukturera sin kod. Det går säkert att göra lika snabb kod utan OOP, men tro mig - det är mycket svårare. En god förståelse av OOP och vitsen med det krävs för alla som vill lära sig det.
Men det är klart, alla har vi ju våra ströfunktioner som vi lägger nånstans. Jag brukar för det mesta göra en klass som heter Util, och lägga alla generella funktioner där. Men det blir uppenbart att man inte blandar statiska och icke-statiska funktioner och variabler då.
/JörgenSv: Använda sig av Class
<b>>Håller med om vad du säger Niklas, men mitt tips handlar inte om OOP/OOD, det handlar om vad C# klarar och inte klarar.</b>
Är med på det, det var en uppmaning till saw att tänka på ett annat sätt.
<b>>I C# KAN du blanda statiska funktioner och instansfunktioner i en och samma klass. Om det är bra eller ej har jag inga synpunkter på i mitt tips, det är en annan diskussion...</b>
Jag säger inte att det är dåligt att blanda dem, men det är viktigt att inse vad de olika konstruktionerna betyder. En statisk funktion eller medlemsvariabel betyder "en generell egenskap eller handling för alla objekt av en typ". Såvida de har allmän åtkomst.
Det är ju inget fel i att det finns en egenskap som är generell hos alla objekt av en typ, samtidigt som varje typ har egna egenskaper. Men att använda statiska variabler för att så att säga, "spara undan information", eller så, är ju helt vansinnigt, precis som att funktioner som är generella för hela klassen (statiska) naturligtvis inte kan komma åt specifika detaljer (instansvariabler) i enskilda objekt.
Privata grejer bör ju hålla ungefär lika hård koll, men där kan man även lägga implementationsdetaljer.
<b>>Och Namespaces finns i C#. </b>
Bra, följer man då ett funktionsorienterat synsätt så ska man inte lägga "lösa" funktioner i klasser, utan i Namespaces.
<b>>funktionsbaserad programmering (ursäkta, kommer inte ihåg vad motsatsen till OOP heter).</b>
Funktionsorienterad, som sagt (fast motsats vet jag inte om det är, snarare en lägre abstraktionsnivå). Eller strukturerad. (Eller spaghetti. =))
Sen så är det faktiskt ofta så att koden blir effektivare om man kör med OO - brukar ta strängar i C++ som exempel. En vanlig enkel sträng (en array med tecken) är ganska effektiv, men en mer abstrakt sträng blir effektivare eftersom man t.ex. kan implementera en smartare metod för stränglängder, och det är lätt att göra ref-counting - något som kan höja prestandan avsevärt, men som är svårt och mycket felbenäget att göra utan en högre abstraktionsnivå.Sv: Använda sig av Class
Jag inser nog(tyvärr) att jag inte skall försöka ha en connection liggande i en classfil, det är nog ingen vinst med det hela.
När jag tänkte "som jag brukar" så handlade det väldigt mycket om att inte upprepa kod, dvs försöka att göra functioner t ex som underlättar. Detta tankesättet är tydligen helt eller delvist förkastligt så jag får försöka att tänka på ett annat sätt.
En god fortsätning på det nya året.Sv: Använda sig av Class
Nej, missförstå oss inte!
Det är inget fel rent principiellt att dels programmera funktionsorienterat, och dels bunta ihop funktioner i grupper. Dock är det så att du bör lägga funktionerna tillsammans i en namespace, och inte en class. De har samma förutsättningar för det du vill uppnå, men namespacet förvirrar inte på samma sätt.
Det är däremot ett gott råd att försöka göra det objektorienterat ändå; men då får du byta sätt att tänka. En kort fingervisning:
Det är inte frågan om "på vilket sätt gör jag si och så?", utan snarare: "vad består mitt program av?".
Din Connection är ett objekt (du ska naturligtvis se allt i ett sammanhang) - du ska se den som ett objekt.
Vilka egenskaper har en Connection?
Nu har jag ingen större koll på databaser, men en egenskap är väl protokollet, en annan en adress dit det skall anslutas osv.
Vad kan den göra?
Ansluta, ge ifrån sig recordsets (?) osv.
Då har du sådana metoder.
I Anslutningen skapar du din "ConnectionString", för det är först då du behöver den.
Typ:
Connection EnAnslutning;
EnAnslutning.Address="localhost";
//...
EnAnslutning.Connect();
Ser det inte lite enklare ut?Sv: Använda sig av Class
Namespace är Funktioner.
Där hadde jag lagt först
<code>
public OleDbConnection con;
public OleDbDataAdapter da;
public DataSet ds;
</code>
(är osäker på om detta inte skulle vara private)
Därefter så tänkte jag på en class (måste det ju vara) men jag fick ju problem här, och en del tyckte att jag kanske tänkte fel.
När jag nu grunnar lite till, så kanske jag jagar mindre kod på fel sätt. Det är ju trots allt bara två rader kod på varje sida, men jag funderade i stort att få lite mera överblick och det trodde jag att jag skulle vinna genom att hela tiden peka på samma class.
Jag får nog ta mig en ordentlig tankeställare var jag skall lägga enigin på att spara och optimera.
Tack för att ni tar er tid.Sv: Använda sig av Class
Men jag förstår inte riktigt. Funktioner kan väl inte läggas direkt i ett namespace. Det är ju som i Java att allt är i klasser och det finns inget utanför.
/JörgenSv: Använda sig av Class
Gillar inte det upplägget alls, men då är det klart att man får skaffa en klass som bara har massa statiska metoder och variabler.
Kodar ju inte i C# alls själv, så...Sv: Använda sig av Class
>bara har massa statiska metoder och variabler.
Annars är det väl inte fullt ut OOP?
/Jörgen