Gå til innhold

Anbefalte innlegg

Skrevet (endret)

Hvordan kan jeg la et program gi navn til nye objekter?

 

       public class Monitor
       {
           private string orig;

           public string getOrig()
           {
               return orig;
           }

           public void setOrig(string plass)
           {
               orig = plass;
           }
       }

 

Hvordan kan programmet lage flere slike og gi dem navn?

Endret av cub71
Videoannonse
Annonse
Skrevet
Hvordan kan jeg la et program gi navn til nye objekter?

 

       public class Monitor
       {
           private string orig;

           public string getOrig()
           {
               return orig;
           }

           public void setOrig(string plass)
           {
               orig = plass;
           }
       }

 

Hvordan kan programmet lage flere slike og gi dem navn?

6695101[/snapback]

først og fremst må du ha en konstruktør for å oprette et objekt av klassen:

       public class Monitor
       {
           private string orig;

           //Konstruktør 1 - uten parameter
           public Monitor(){
           }

           //Konstruktør 2 - med paramenter
           public Monitor(string orig){
               setOrig(orig);
           }

           public string getOrig()
           {
               return orig;
           }

           public void setOrig(string plass)
           {
               orig = plass;
           }
       }

 

så kan du hvor som helst i kjørbar kode lage objekter slik:

   //Opprette objekt uten parameter, og sette verdi
   Monitor monitor1 = new Monitor();
   monitor1.setOrig("plassen");

   //Opprette objekt med parameter
   Monitor monitor2 = new Monitor("plassen");

 

var det dette du tenkte på?

Skrevet
først og fremst må du ha en konstruktør for å oprette et objekt av klassen:

nei, man MÅ ikke ha en konstruktør, en konstruktør er bare en metode som kjøres når en klasse instansieres.

Skrevet (endret)

...men det gjør ting veldig mye enklere.

 

Dessuten kan du bytte ut getOrig og setOrig med en property istedet

 

public class Monitor
{
 protected string orig;

 public Monitor()
 {
   orig = ""; // Stringer burde instansieres til "" for å unngå feil med BinaryWriter etc.
 }
 public Monitor(string plass)
 {
   this.orig = plass
 }
 public string Orig
 {
   get { return orig; }
   set { orig = value; }
 }
}

 

Ofte legger man til default constructoren i alle andre constructorer

med : this()

slik:

Monitor(string plass) : this()

{...}

for at den alltid kaller default constructoren, for å sette evt. andre verdier også.

 

Og med en constructor, kan man lage setninger som:

 

System.Collection.ObjectModel.Collection<Monitor> list;
list.Add(new Monitor("Ialla"));

Istedet for

System.Collection.ObjectModel.Collection<Monitor> list;
Monitor mon = new Monitor();
mon.Orig = "Ialla";
list.Add(mon);

Som dessuten er mer effektivt, på et ubetydelig plan, men likevel mer effektivt, AddRef blir kalt en gang, og RemoveRef blir ikke kalt før list forsvinner ut av scope.

Endret av GeirGrusom
Skrevet

Jeg har kanskje ikke formulert spørsmålet mitt godt nok. La meg prøve igjen.

 

Hvis jeg skal opprette et stort antall Monitor-objekter må alle disse ha hvert sitt navn. Jeg tenkte da å gi dem navn monitor + et nummer. Men dette får jeg ikke til. Hadde tenkt meg noe slikt:

 

string nyttNavn = "";
int antallMonitorer;

nyttNavn = "Monitor" + antallMonitorer.ToString();
Monitor nyttNavn.Value = new Monitor();

 

Å bruke en string slik funker ikke. Noen bedre forslag?

Skrevet

Det er da man bruker f.eks. en array:

 

Monitor[] monitor = new Monitor[100];
monitor[0] = new Monitor();
monitor[1] = new Monitor();
etc...

 

Øyvind

Skrevet

Du kan bruke List eller Dictionary:

 

using System.Collections.Generic;
// ...
// ...
List<Monitor> m = new List<Monitor>();
m.Add(new Monitor("a", "b"));
m.Add(new Monitor("c", "d"));

// eller Dictionary
Dictionary<string, Monitor> d = new Dictionary<string, Monitor>();
d.Add("Skjermnavn", new Monitor("a", "b");
d.Add("Skjermnavn2", new Monitor("c", "d");

// Loope gjennom Dictionary:
foreach (KeyValuePair<string, Monitor> kvp in d)
{
   Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
}

// Loope gjennom List
IEnumerator<Monitor> enumerableList = m.GetEnumerator();
while(enumerableList.GetEnumerator())
{
   Console.WriteLine("{0} ", enumerableList.Current);
}

Skrevet (endret)

public string GetUniqueName(Monitor mon, List<Monitor> lst, string name)
{
 string out = name;
 int x;
 int index = 0;
 for(x = 0; x <lst.Length;x++)
 {
   m = lst[x];
   if(m != mon) // Sjekk at vi ikke tester mot objektet vi skal navngi.
   {
      if(m.orig == out) // Sjekk om denne
      {
         index++; // legg til en
         out = name + index.ToString();
         x = 0; // restart, for å sjekke at det ikke er noen tidligere med navnet.
         continue; // Gå tilbake, egentlig ikke nødvendig (må x bli satt til -1?)
      }
   }
 }
 return out; // Ingen flere invendinger fra for loopen, returner verdien.
}

 

Denne koden skal i teorien gå gjennom alle og sjekke først om f.eks. "monitor" allerede er brukt, hvis den er det, legg til "1" på slutten, hvis "monitor1" er brukt, prøv med "monitor2" etc.

Endret av GeirGrusom
Skrevet

Takk for alle forslag. For min del var det forslaget fra oyvind_b som funket for meg.

 

PS Øyvind: Er det du som har skrevet odalizer.com ? Den er konge!

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...