Globala variabler finns ju inte i C#. Om jag nu behöver något liknande, hur går jag tillväga?
Jag behöver lagra ner lite blandad information som diverse klasser ska ha tillgång till. Bland annat en array.
Jag är återigen ny vad gäller OO så jag vet inte riktigt hur jag ska lösa problemet. Har googlat och hittat något om att man ska skapa en klass för detta och sedan skapa instanser till klassen. Men vad menas och hur gör man det? Poängen är att flertalet klasser ska ha tillgång till variabeln.
Delade variabler
58 svar · 1 796 visningar · startad av Gein
Det finns visst globala variabler (inte i ordets bemärkelse, men väl funktionsmässigt), det beror bara på hur du använder dem.
Huvudtanken är att du samlar global information i ett affärslager/-objekt (som kanske kommunicerar med ett datalager och hämtar information därifrån). Ett sätt är skapa en "module" med all information. Den behöver inte instansieras, utan kan köras direkt (ungefär som en shared/static metod).
Att instansiera innebär att man gör en "lokal kopia" av en klass som du kan använda, alltså:
[b]VB[/b]
Dim foo As myFreakinClass = New myFreakinClass("weeee")
[b]C#[/b]
myFreakinClass foo = new myFreakinClass("weeee");
I VB.NET skriver man:
Public strString As String
när man vill göra en sträng global (går såklart även med t.ex. integer, double etc).
Sen om du har en klass som är döpt till MyClass i ett namespace döpt till MyNamespace får du tillgång till strängen genom det här:
Dim MyString As New MyNamespace.MyClass
Dim NewString As String = MyString.strString
Kan tyvärr inte så mycket C#, men jag hoppas du förstår vad jag menar.
Den ovanstående koden kan du använda i vilket projekt du vill så länge du har en referens till dll-filen med objektet.
/r
Lite seg där :r
Och hur skulle ditt förslag om ett objekt/lager kunna se ut i kod? ;)
Jag e ny på detta och vet verkligen inte hur jag ska realisera det.
Dim MyString As New MyNamespace.MyClass
Dim NewString As String = MyString.strString
Detta skapar väl en ny instans? Gör jag en ändring så sker det väl då bara lokalt?
Kan försöka mig på lite C# ;)
using System;
Namespace MyNamespace {
Public Class MyClass {
Public String MyString == "Text";
}
}
Är dock osäker på syntaxen..
Om du "bara" ska lagra information i variabler är en klass overkill. Då är som sagt en module betydligt effektivare, eftersom den är gjord för det. ;)
public [b]sealed[/b] class MinaGlobalaVariabler //Tillåt inte arv.
{
[b]private[/b] MinaGlobalaVariabler()
{
// Tillåt inte instansiering.
}
public static int MinGlobalaInt;
// osv ..
}
// .. Någon annanstans i samma namespace.
MinaGlobalaVariabler.MinGlobalaInt = 7
Pace:
Vad menar du med "module"? Som jag förstått det är en "module" som vilken IL-fil som helst förutom att den saknar manifest. Den innehåller alltså klasser på samma sätt som en exe eller dll. (Moduler går inte att kompilera i Visual Studio.)
Jag menar i stil med
Namespace rymd
Module Globalt
Public Variabel1 As String = "text"
Public Function Variabel2() As String
Return "text"
End Function
End Module
End Namespace
Vet inte motsvarigheten till C# (om det rentav är module {} kanske).
Nikos svar fungerade alldeles förträffligt! Jag bugar och bockar! :)
En följdfråga bara:
Vad menas med
private MinaGlobalaVariabler()
{
// Tillåt inte instansiering.
}
Du kommer inte åt den utanför klassen.
Marcus E skrev:
Det finns inga moduler i C#. Det enda som finns är det som niko visade.
Det är nog ganska många här som är insnöade i antingen VB.NET eller C# och inte vet något om det andra språket. Jag är en av dem, men jag försöker lära mig om VB.NET för att kunna porta koden till C#. §jr
Sant. :)
Jag skriver i VB eftersom jag alltid har gjort det (och för att jag gillar det såklart). Men jag har inga problem att läsa och översätta C# (det är ju faktiskt bara syntaxskillnader i princip), men jag har inte nått nivån av att skriva C# helt självständigt ännu.
Gein skrev:
En följdfråga bara:
Vad menas medprivate MinaGlobalaVariabler() { // Tillåt inte instansiering. }
Det är ju egentligen lite fel. Det är klassen som instansieras - metoder körs på insansen så att säga. Denna metoden går dock inte att komma åt utanför classen eftersom den är deklarerad private.
r) Fan vad jag skriver illa.
"private MinaGlobalaVariabler()" betyder att konstruktören är skyddad och därför inte går att anropa utifrån eller från en ärvtagare (att ärva går dock inte p.g.a. sealed). Om det inte finns någon publik konstruktör går det inte att skapa en instans av klassen utifrån.
Det går dock fortfarande att komma åt klassens statiska publika medlemmar utifrån. Dessa kan sedan skapa en instans av klassen. Om de inte gör det, kan klassen motsvaras av VBs Module. Det finns klasser som man skapar genom statiska funktioner. Graphics är en sådan klass.
Hoppas det blev rätt. :)
Pace skrev:
Gein skrev:
En följdfråga bara:
Vad menas medprivate MinaGlobalaVariabler() { // Tillåt inte instansiering. }Det är ju egentligen lite fel. Det är klassen som instansieras - metoder körs på insansen så att säga. Denna metoden går dock inte att komma åt utanför classen eftersom den är deklarerad private.
Hmm. Om jag ställer frågan såhär istället. Vad gör dessa rader för skillnad? Måste dom vara där? Den e ju tom iaf?
Måste dom vara där?
Ja, annars kommer kompilatorn att slänga in en publik default-kontruktor. Ingen katastrof, men en skönhetsfläck eftersom det då går att instansiera en klass som inte är avsedd för att kunna instansieras.
/red:
En nyhet(?) i .NET är att du även kan lägga in en public static konstruktor som kommer att köras första gången klassen refereras till (oavsett om du skapar en instans eller inte).
En metod som är deklarerad public kan köras från andra classer.
En metod som är deklarerad private kan bara köras inifrån metoden:
[b]VB[/b]
Public Class myc
[blue]Public Sub wazap()
_wee() ' Här kör vi den "interna" metoden.
End Sub[/blue]
[red]Private Sub _wee()
response.write("Detta")
End Sub[/red]
End Class
[b]C#[/b]
public class myc {
[blue]public void wazap() {
_wee(); // Här kör vi den "interna" metoden.
}[/blue]
[red]private void _wee() {
response.write("Detta");
}[/red]
}
Om vi nu ska köra koden ovan så kan vi göra på följande sätt:
[b]VB[/b]
Dim a As New myc()
a.wazap() ' Går utmärkt.
a._wee() ' Går INTE då den är private och kan endast köras inifrån classen.
[b]C#[/b]
myc a = new myc();
a.wazap(); // Går utmärkt.
a._wee(); // Går INTE då den är private och kan endast köras inifrån classen.
Jag brukar sätta _ som prefix framför variabler/metoder som är privata (m_ är också vanligt, så kallad medlemsvariabel). Det underlättar att se vad som är vad, plus att man inte blandar ihop med globala metoder, variabler eller properties.
Okej, tack för svaren!
Klasser, metoder, instanser, public, private... jag är ny vad gäller detta. Ni som verkar kunna detta bra, har ni något tips på vart jag kan samla ökad förståelse?
En bra tutorial, hemsida, bok, etc, som tar upp detta med OO. För det här är väl typisk OO-programmering?