webForumDet fria alternativet

Delade variabler

.NETur .NET

58 svar · 1 796 visningar · startad av Gein

GeinMedlem sedan sep. 20005 700 inlägg
#1

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.

PaceMedlem sedan juni 20019 024 inlägg
#2

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");
VimpMedlem sedan juli 20022 537 inlägg
#3

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

GeinMedlem sedan sep. 20005 700 inlägg
#4

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?

VimpMedlem sedan juli 20022 537 inlägg
#5

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..

PaceMedlem sedan juni 20019 024 inlägg
#6

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

nikoMedlem sedan juni 20022 599 inlägg
#7
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.)

PaceMedlem sedan juni 20019 024 inlägg
#8

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).

Marcus EMedlem sedan maj 20021 466 inlägg
#9

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

nikoMedlem sedan juni 20022 599 inlägg
#10

Pace:

OK. Du menade module à la VB.NET. Jag trodde du syftade på csc /target:module ...

GeinMedlem sedan sep. 20005 700 inlägg
#11

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.
}
VimpMedlem sedan juli 20022 537 inlägg
#12

Du kommer inte åt den utanför klassen.

PaceMedlem sedan juni 20019 024 inlägg
#13

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 med

private 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.

Marcus EMedlem sedan maj 20021 466 inlägg
#14

"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. :)

GeinMedlem sedan sep. 20005 700 inlägg
#15

Pace skrev:

Gein skrev:

En följdfråga bara:
Vad menas med

private 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?

nikoMedlem sedan juni 20022 599 inlägg
#16

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).

PaceMedlem sedan juni 20019 024 inlägg
#17

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.

GeinMedlem sedan sep. 20005 700 inlägg
#18

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?

VimpMedlem sedan juli 20022 537 inlägg
#19

Köp en bok om OOP :)

/r
Grov felstavning :OO :e

GeinMedlem sedan sep. 20005 700 inlägg
#20

Vimp skrev:

Köp en bok om OOP :)

Jaja, men vilken? Rekommendera gärna.

127 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)