webForumDet fria alternativet

Delade variabler

.NET

58 svar · 1 796 visningar · startad av Gein · sida 3 av 3

Frågan, av Gein

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.

Läs frågan i sin helhet →
Medlem sedan juni 20022 599 inlägg
#41

Fast nu diskuterade vi ju principen för "globala variabler" och inte för-/nackdelar med inbyggda kontra egenskrivna sådana och är cirkeln sluten (min åsikt).

Medlem sedan nov. 2003569 inlägg
#42

Jag lägger ner att diskutera med och hänvisar istället till:

Beginning Visual C# som är den engelska versionen.
I den svenska versionen står det på sidan 129 i kapitel 6 om funktioner. i den engelska sid 145

här är en länk:
http://www.wrox.com/books/toc/0764543822_toc.shtml#Chapter7

Har ni boken kan ni "Download Code", där illustrerar han bra.

Medlem sedan maj 20018 027 inlägg
#43

Nöff skrev:

Jag lägger ner att diskutera med och hänvisar istället till:

Beginning Visual C# som är den engelska versionen.
I den svenska versionen står det på sidan 129 i kapitel 6 om funktioner. i den engelska sid 145

här är en länk:
http://www.wrox.com/books/toc/0764543822_toc.shtml#Chapter7

Har ni boken kan ni "Download Code", där illustrerar han bra.

Har inte den boken. Däremot hittade jag källkod till en del exempel där. Följande, i min mening alltför simpla, exempel, tycks bekräfta att författaren faktiskt har skrivit så:

class Class1
{
	
      static string myString;

      static void Write()
      {
         string myString = "String defined in Write()";
         Console.WriteLine("Now in Write()");
         Console.WriteLine("Local myString = {0}", myString);
         Console.WriteLine("Global myString = {0}", Class1.myString);
      }

      static void Main(string[] args)
      {
         string myString = "String defined in Main()";
         Class1.myString = "Global string";
         Write();
         Console.WriteLine("\nNow in Main()");
         Console.WriteLine("Local myString = {0}", myString);
         Console.WriteLine("Global myString = {0}", Class1.myString);
      }

}

Tyvärr har han inte kommenterat koden, varför det inte går att se om han verkligen menar det du tror. Dessutom kan man konstatera att detta exempel (samt de övriga exemplen i kapitel 6), alla bara har en enda klass. Detta gäller även exemplen i din andra bok, "C# & .Net Windowsprogrammering i Visual Studio.NET", där jag också lyckades hitta exemplen för nedladdning. Det är klart att om ett program består av endast en klass, kan man naturligtvis betrakta medlemsvariablerna som globala. Man gör ju ingenting utanför klassens scope. Men då går man miste om själva poängen med objektorienterad programmering. Det man får, är i själva verket ett procedurorienterat program, inbäddat i en klass. Det hade man lika gärna kunnat göra i något gammalt programmeringsspråk från den digitala medeltiden, utan något som helst stöd för objektorientering. Så fort som du ska ha flera klasser i ditt program, kommer du finna att de variabler du kallar globala, inte går att komma åt från några andra klasser. Åtminstone inte om de är privata. Är de publika, måste du gå via en instans av klassen för att kunna komma åt variablerna (de är alltså fortfarande inte globala, för utan en referens till någon instans av klassen, hade du ju inte kommit åt dessa variabler).

Nöff skrev:

Ulf, i Winforms så är ditt system, program, kalla det vad du vill, din klass, allt du gör i C# är definierat inom en klass. Det är därför det heter objektorientad programmering.
Och du har förmodligen förväxlat Application variablar med "global". Ni är lite insnöade på webprogram här märker jag.

Jag vet vad objektorienterad programmering handlar om, och jag håller inte alls på med särskilt mycket webprogrammering (vad nu det skulle ha för betydelse). Du skulle tjäna på att vara lite ödmjuk. Det är inte säkert att du blir en OOP-guru av att läsa två nybörjarböcker.

Medlem sedan sep. 20005 700 inlägg
#44

Jag efterfrågade tips på någon bra bok om OOP (gärna tillsammans med C#) men har inte fått något ännu. Jag är nybörjare vad gäller OO men jag är inte nybörjare vad gäller programmeringsteknik, så kanske en bok strax över nybörjarstadiet vore lämpligt.
Något tips har ni väl? :)

Medlem sedan maj 20012 812 inlägg
#45

Men Gladh. Ditt program är ju din klass, fixa upp ett winforms och titta hur det är definierat, först namespacet sen klassdefinieringen och sen klassens konstruktor. Det är ju detta som är ditt program. Hela detta missförstånd måste bero på att ni suttit för mycket med asp.net applikationer tror jag

Nöff. Jag har inget program som endast består av en class och jag hoppas verkligen att du inte kommer att ha det heller snart (när du lärt dig mer om OOP)

Visst har jag suttit mycket med ASP.NET men på den sista tiden har jag byggt mest windows applikationer bland annat en större system som ligger utspritt över flera maskiner och kommunicerar med .NET Remoting och jag lovar dig att det är mer än en WinForm class för att få ihop det, just nu är det uppdelat i 26 projekt och bra många fler klasser.

- Magnus

Medlem sedan maj 20012 812 inlägg
#46

static string myString;

Variablen är en static variable i klassen Class1 och ger då sken av att vara global eftersom övriga klasser kan komma åt den via Class1.myString, det borde dock inte fungera eftersom om man utlämnnar "protection-level" (kommer inte på vad det heter just nu) så skall den ju bli private, och då skall man inte kunna se den utifrån någon annan klass.

- Magnus

Medlem sedan juli 20011 304 inlägg
#47

Hahaha! Vilken urpårning! :D

Säkerligen måste någon här vara medveten om att det inte ska finnas globala variabler i ren oo.
Därför finns det inga globala variabler i c#
Basta! :)

Så nu är det tydliggjort även om det kanske redan mer eller mindre är sagt.

Däremot kan man ju simulera detta genom redan påtalade metoder (statiska publika variabler).

Sen är det ju rätt så logiskt att implementera detta i samma namespace som man har sin main() -metod i då denna faktiskt är ingången till alla icke webbapplikationer.

Själv föredrar jag att ha publika enums och typer i grundklassen eller en helperklass i det namespace dom hör hemma i.

Är man lite påhittig så kan man ju öven använda sig av #define.

Medlem sedan nov. 2003569 inlägg
#48

varför det inte går att se om han verkligen menar det du tror

Menar vad jag tror?, att jag inte kan läsa svenska eller?.

Eftersom ni inte tror på vad jag säger så får ni gå till akademibokhandeln och slå upp dessa sidorna så får vi det här ur världen helt enkelt.
sidorna 125,129-130 i den svenska upplagan.

Så vad ni säger är följande:

Författaren har fel! :P ?

Medlem sedan juni 20008 205 inlägg
#49

Nöff skrev:

Så vad ni säger är följande:

Författaren har fel! :P ?

Det uppenbara svaret är "ja". Det är inte nödvändigtvis sant (eller, som i detta fall, rätt) bara för att det nått tryckpressen. Allt man läser ska läsas kritiskt, även om det är något så heligt som en n00bbok i dotnet.

Det lite mer komplicerade svaret är att han inte uttrycker sig riktigt korrekt - publika statiska variabler används som globala variabler, men per definition är de inte det.

Medlem sedan juni 20022 599 inlägg
#50

Nöff skrev:

Författaren har fel!?

Fel och fel .. Som vi kom fram till redan på sida 1 (redan innan ditt första inlägg) så är den närmaste motsvarigheten till en "global" variabel i C# just en publik och statisk medlemsvariabel (hade den inte varit statisk så hade den inte varit åtkomlig från Main). Har man sen bara en enda klass så blir nyckelordet Public överflödigt.

Då är det bara ett mysterium kvar: Vad ville du tillföra med ditt första inlägg?

Medlem sedan feb. 20013 023 inlägg
#51

Det här var den roligaste tråden jag läst sedan killen som hade en sökmotor som innebar en revolution. Alltid fascinerande med människor som brister i självinsikt! En nybörjare som tror han kan smälla Niko på fingrarna när det gäller .NET! Det är lättare att lära sig om man är ödmjuk och inser sina egna brister...

Medlem sedan apr. 20012 266 inlägg
#52

Kanske dags att återknyta till Geins fråga, tyvärr har jag själv inget riktigt bra tips på böcker som strikt går igenom OOP, har lärt mig det mesta igenom att läsa om det i andra .NET böcker. Är därför lika intresserad av ett bra boktips som Gein :)

Medlem sedan apr. 2004778 inlägg
#53

I min bokhylla har jag en svensk bok som heter "OOP med Microsoft Visual Basic .NET och Microsoft Visual C# .NET Steg för Steg". Den är skriven av Robin A.Reynolds-Haertle, ISBN: 91-636-0718-2.

Den går igenom grunderna i objekt-orientering på ett bra sätt.
Jag pluggade objekt-orientering med C++ en gång i tiden och använder mest min gamla lärobok därifrån men den här boken lär ut på ett lika bra sätt.
Eftersom grunderna är detsamma så spelar det ingen roll vilket språk man lär sig OOP i. Men det är klart att det underlättar när det är "ens eget" programmeringsspråk så man får med rätt benämningar.

Det finns även mängder av bra sajter att plöja igenom. T.ex. http://www.c-sharpcorner.com/Code/2003/July/OOPIntroduction.asp

Medlem sedan okt. 2002188 inlägg
#54

renholm skrev:

Kanske dags att återknyta till Geins fråga, tyvärr har jag själv inget riktigt bra tips på böcker som strikt går igenom OOP, har lärt mig det mesta igenom att läsa om det i andra .NET böcker. Är därför lika intresserad av ett bra boktips som Gein :)

Hej

Applying UML and Patterns tycker jag är en väldigt bra bok som går igenom grunderna i tänket för oo, det mesta av koden är i java eller c++ men det är inte så svårt att se vad han menar. Han diskuterar också ett par av de mest använda design patterns. Rekommenderas varmt..

sen så är
Agile Software Development, Principles, Patterns, and Practices och Streamlined Object Modeling andra böcker som jag tycker är läsvärda..

Medlem sedan apr. 2004778 inlägg
#55

Japp, Applying UML and Patterns står i min bokhylla också och när vi ändå nämner Patterns så vill jag gärna rekommendera två andra böcker i min hylla.

Design Patterns: Elements of Reusable Object-Oriented Software

Patterns of Enterprise Application Architecture

Medlem sedan nov. 2003569 inlägg
#56

Ursäkta korspostningen, men det är absolut nödvändigt.

Clarkbones.

Jag har nu hittat 3 böcker (2 från Wrox) som skriver att globala variablar i allra högsta grad existerar.
Vilka ska jag välja att tro på?, ni eller vad 2 erkända författare skriver?.
I "Beginning ASP.NET 1.0 with C#.NET" från Wrox finns på denna Download-sida i Chapter 6 svart på vitt.
http://www.wrox.com/dynamic/books/download.aspx

Medlem sedan apr. 2004778 inlägg
#57

Nej, Nöff, korspostningen var absolut inte nödvändig men eftersom du tydligen inte läst mitt inlägg i andra forumet så får du en repris.

Nöff, du måste lära dig förstå vad du läser och vad andra säger.
Det finns globala variabler men sen måste man ta reda på var variabeln är "global". Traditionellt sett så är en Global variabel tillgänglig från alla delar av en applikation. I en webbapplikation skulle denna läggas i global.asax under Application.

Det förra exemplet du visade var en variabel som var GLOBAL för den klassen. Det vill säga den var tillgänglig för klassens alla metoder.
Exemplet du visar nu demonstrerar en variabel som är global för den sidan. Alltså Pageklassen. Den är inte global i applikationen. Endast global på den sidan.

Så man kan säga så här, du har både rätt och fel. Men lär dig att skilja på begreppen.

Medlem sedan nov. 2003569 inlägg
#58

Nej, Nöff, korspostningen var absolut inte nödvändig men eftersom du tydligen inte läst mitt inlägg i andra forumet så får du en repris.

Sorry, men jag har aldrig sagt något annat än att en global variabel lägger man utanför alla funktioner.

Medlem sedan apr. 2004778 inlägg
#59

Nej, men du har sagt

i Winforms så är ditt system, program, kalla det vad du vill, din klass, allt du gör i C# är definierat inom en klass. Det är därför det heter objektorientad programmering.
Och du har förmodligen förväxlat Application variablar med "global". Ni är lite insnöade på webprogram här märker jag.

Fel. Ditt program är inte en klass. Ditt program eller webbapplikation kan ha flera olika klasser.
Om du skaper ett WinForm eller WebForm och lägger en "global" variabel som du visat så kommer ingen annan klass i programmet eller webb-applikationen att komma åt den variabeln ändå. Den är endast global för den spedifika klassen.
För att en variabel ska vara global i en applikation (program eller webb) så måste den definieras utanför alla klasser. I en ASP.NET webbapp så skulle detta t.ex. göras i global.asax som t.ex. en config variabel.

Snälla Nöff, hur kan du vara så obenägen på att lära dig nya saker?
Vad har du jobbat med tidigare? Vad har du för utbildning? Vad jobbar du med nu? Hur gammal är du?
Har du överhuvudtaget nånsin lärt dig teorin i objekt-orientering eller är det något du börjat snappa upp nu när du börjat leka med .net?

264 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)