---
title: "Delade variabler"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/99083-delade-variabler"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Gein"
published: "2004-03-09T14:30:52.000Z"
updated: "2004-04-18T14:12:35.000Z"
replies: 58
views: 1827
page: 1
pages: 3
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/99083-delade-variabler"
---

# Delade variabler

_Sida 1 av 3._

## #1 — Gein, 2004-03-09T14:30Z

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.

Permalänk: https://www.webforum.nu/p/99083

## #2 — Pace, 2004-03-09T15:15Z

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");
```

Permalänk: https://www.webforum.nu/p/1294717

## #3 — Vimp, 2004-03-09T15:18Z

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

Permalänk: https://www.webforum.nu/p/1294718

## #4 — Gein, 2004-03-09T15:20Z

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?

Permalänk: https://www.webforum.nu/p/1294722

## #5 — Vimp, 2004-03-09T15:23Z

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

Permalänk: https://www.webforum.nu/p/1294724

## #6 — Pace, 2004-03-09T15:36Z

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

Permalänk: https://www.webforum.nu/p/1294730

## #7 — niko, 2004-03-09T15:52Z

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

Permalänk: https://www.webforum.nu/p/1294748

## #8 — Pace, 2004-03-09T16:26Z

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

Permalänk: https://www.webforum.nu/p/1294764

## #9 — Marcus E, 2004-03-09T16:46Z

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

Permalänk: https://www.webforum.nu/p/1294780

## #10 — niko, 2004-03-09T17:10Z

Pace:

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

Permalänk: https://www.webforum.nu/p/1294801

## #11 — Gein, 2004-03-09T17:13Z

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

Permalänk: https://www.webforum.nu/p/1294805

## #12 — Vimp, 2004-03-09T17:27Z

Du kommer inte åt den utanför klassen.

Permalänk: https://www.webforum.nu/p/1294815

## #13 — Pace, 2004-03-09T17:31Z

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

Permalänk: https://www.webforum.nu/p/1294817

## #14 — Marcus E, 2004-03-09T17:37Z

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

Permalänk: https://www.webforum.nu/p/1294827

## #15 — Gein, 2004-03-09T19:28Z

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

Permalänk: https://www.webforum.nu/p/1294878

## #16 — niko, 2004-03-09T19:35Z

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

Permalänk: https://www.webforum.nu/p/1294891

## #17 — Pace, 2004-03-09T19:39Z

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.

Permalänk: https://www.webforum.nu/p/1294895

## #18 — Gein, 2004-03-09T19:44Z

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?

Permalänk: https://www.webforum.nu/p/1294901

## #19 — Vimp, 2004-03-09T20:32Z

Köp en bok om OOP :)

/r
Grov felstavning :OO  :e

Permalänk: https://www.webforum.nu/p/1294940

## #20 — Gein, 2004-03-09T21:04Z

> **Vimp skrev:**
>
> Köp en bok om OOP :)

Jaja, men vilken? Rekommendera gärna.

Permalänk: https://www.webforum.nu/p/1294962

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/99083-delade-variabler  
Nästa sida: https://www.webforum.nu/amne/dotnet/99083-delade-variabler/page2.md
