Struct gebruik.

  • Onderwerp starter Onderwerp starter baws
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

baws

Terugkerende gebruiker
Lid geworden
9 apr 2010
Berichten
1.258
Hallo

voor een opdracht moet ik gebruik maken van een struct, dit is helemaal nieuw voor mij.
ik moet mp3 spelers aan een lijst kunnen toevoegen. met de volgende gegevens:

ID: Een uniek nummer, ter identificatie van de mp3 speler.

Make: Het merk van de mp3 speler.

Model: Het model van de mp3 speler.

MBSize: De opslagcapaciteit van de mp3 speler in MegaBytes.

Price: De prijs per stuk.

en dit zijn de eisen.
- Maak gebruik van een Struct (C#) om de gegevens over een mp3 speler gezamenlijk op te kunnen slaan.

- Zorg voor een method die een mp3 speler aanmaakt, initialiseert en vervolgens als struct terug geeft.


ik heb geen idee hoe ik dit doe wie kan mij helpen mvg sb
 
Ik heb iets kleins gemaakt voor je ;) Misscien helpt dit wel.
[CPP]
public struct MP3
{
public int ID;
public string MERK;
public string MODEL;
public double MBSIZE;
public double PRICE;
public MP3(int id, string merk, string model, double mbSize, double Price)
{
ID = id;
MERK = merk;
MODEL = model;
MBSIZE = mbSize;
PRICE = Price;
}
public int id
{
set { ID = value; }
get { return ID; }
}
public string merk
{
set { MERK = value; }
get { return MERK; }
}
public string model
{
set { MODEL = value; }
get { return MODEL; }
}
public double mbSize
{
set { MBSIZE = value; }
get { return MBSIZE; }
}
public double price
{
set { PRICE = value; }
get { return PRICE; }
}
}
[/CPP]
 
Vergeet niet dat een "struct" een value type is. In onderstaand voorbeeld kun je goed zien dat wanneer je een struct meegeeft aan een functie, er een kopie (in plaats van een referentie) van de struct wordt meegegeven.

[CPP]class TheClass
{
public int x;
}

struct TheStruct
{
public int x;
}

class TestClass
{
public static void structtaker(TheStruct s)
{
s.x = 5;
}
public static void classtaker(TheClass c)
{
c.x = 5;
}
public static void Main()
{
TheStruct a = new TheStruct();
TheClass b = new TheClass();
a.x = 1;
b.x = 1;
structtaker(a);
classtaker(b);
Console.WriteLine("a.x = {0}", a.x);
Console.WriteLine("b.x = {0}", b.x);
}
}[/CPP]

Output:
a.x = 1
b.x = 5
 
Kleine verbeteringen ten opzichte van de code van "beginnertje":

[CPP] public struct Mp3Player
{
private int _id;
private string _brand;
private string _model;
private double _capacity;
private double _price;

public int Id { get { return _id; } set { _id = value; } }
public string Brand { get { return _brand; } set { _brand = value; } }
public string Model { get { return _model; } set { _model = value; } }
public double Capacity { get { return _capacity; } set { _capacity = value; } }
public double Price { get { return _price; } set { _price = value; } }

public Mp3Player(int id, string brand, string model, double capacity, double price)
{
_id = id;
_brand = brand;
_model = model;
_capacity = capacity;
_price = price;
}
}
[/CPP]
 
Kleine verbeteringen ten opzichte van de code van "beginnertje":

Als je dan toch bezig gaat, doe het dan goed:
[CPP] public struct Mp3Player
{
public int Id { get; private set; }
public string Brand { get; private set; }
public string Model { get; private set; }
public double Capacity { get; private set; }
public double Price { get; set; }

public Mp3Player(int id, string brand, string model, double capacity, double price)
{
this.Id = id;
this.Brand = brand;
this.Model = model;
this.Capacity = capacity;
this.Price = price;
}
}
[/CPP]

Ik ben er vanuit gegaan dat sommige eigenschappen niet van 'buitenaf' te wijzigen zijn (id, brand en model zullen niet zo snel veranderen van een reeds bestaand iets). Vandaar de "private set").
 
Als je dan toch bezig gaat, doe het dan goed:
[CPP] public struct Mp3Player
{
public int Id { get; private set; }
public string Brand { get; private set; }
public string Model { get; private set; }
public double Capacity { get; private set; }
public double Price { get; set; }

public Mp3Player(int id, string brand, string model, double capacity, double price)
{
this.Id = id;
this.Brand = brand;
this.Model = model;
this.Capacity = capacity;
this.Price = price;
}
}
[/CPP]

Ik ben er vanuit gegaan dat sommige eigenschappen niet van 'buitenaf' te wijzigen zijn (id, brand en model zullen niet zo snel veranderen van een reeds bestaand iets). Vandaar de "private set").

Dat had ik in eerste instantie ook, maar dat compiled niet om de volgende reden: "The 'this' object cannot be used before all of its fields are assigned to".

Ik kan echter niet beredeneren waarom dat niet werkt.. Misschien jij wel?

Het is ook op te lossen door :this() toe te voegen aan je constructor.

*De "this" qualifiers voor Id, Brand, enz. zijn overigens redundant ;)

[CPP] public struct Mp3Player
{
public int Id { get; private set; }
public string Brand { get; private set; }
public string Model { get; private set; }
public double Capacity { get; private set; }
public double Price { get; set; }

public Mp3Player(int id, string brand, string model, double capacity, double price) : this()
{
Id = id;
Brand = brand;
Model = model;
Capacity = capacity;
Price = price;
}
}[/CPP]
 
Ok nu maak ik een mp3 speler aan in de
Code:
  static void Main(string[] args)
        {
als volgt
Code:
MP3 mp31 = new  MP3(2,"philips","seat",200,10);
en nu wil ik ze uitlezen met een andere methode
Code:
 static void Show()
        {
            Console.WriteLine("{0} {1} {2}", mp31.ID, mp31.MBSIZE, mp31.MODEL);

maar mp31 wordt nu niet herkent (does not exist in the current context
nu
 
Laatst bewerkt:
Probeer:

PHP:
//Globale MP3 aanmaken, die in elke void(functie) aangeroepen kan worden.
//Als je een MP3 aanmaakt in een void, kan deze alleen in de void gebruikt worden, en niet in andere voids.
MP3 mp31;
static void Main(string[] args)
{
//De globale MP3 waardes geven.
mp31 = new MP3(2,"philips","seat",200,10);
Show();
}
static void Show()
{
//Waardes naar het scherm schrijven.
 Console.WriteLine("{0} {1} {2}", mp31.ID, mp31.MBSIZE, mp31.MODEL);
}
 
Laatst bewerkt:
Probeer:

PHP:
MP3 mp31;
static void Main(string[] args)
{
mp31 = new MP3(2,"philips","seat",200,10);
Show();
}
static void Show()
{
 Console.WriteLine("{0} {1} {2}", mp31.ID, mp31.MBSIZE, mp31.MODEL);
}

Kleine uitleg zou niet verkeerd zijn, misschien snapt hij dan wat hij fout doet ;) Nu doet meneer weer copy-paste en verrek! het werkt!
 
idd waarom staat er bijvoorbeeld
Code:
MP3 mp31;
als eerste regel nog voor de main?
 
Kijk eens boven u topic ;) captainrbi heeft er eigenlijk wel de uitleg bijgegeven ;)
 
Laatst bewerkt:
Uitleg had ik er bij gezet nadat xxmart reageerde =)

Enne baws, als je niet snapt waarom die "MP3 mp31;" buiten een void staat, kan ik je aanraden om even wat basis stof te lezen.
Je kan dit even lezen: Global Variables

Succes.
 
Dat had ik in eerste instantie ook, maar dat compiled niet om de volgende reden: "The 'this' object cannot be used before all of its fields are assigned to".

Ik kan echter niet beredeneren waarom dat niet werkt.. Misschien jij wel?

Het is ook op te lossen door :this() toe te voegen aan je constructor.

*De "this" qualifiers voor Id, Brand, enz. zijn overigens redundant ;)

Klopt, "this" is redundant, maar ik gebruik ze zelf wel altijd: zo zie ik direct welke variabele wordt gebruikt (zeker als de functie param dezelfde naam heeft).

Over het "this" in de struct: volgens example 2 op http://msdn.microsoft.com/en-us/library/ah19swz4(v=vs.71).aspx zou het gewoon moeten werken.
 
Klopt, maar in dat voorbeeld op msdn gebruiken ze geen automatisch property implementatie.

Dit is de bijbehorende compile error:

"Backing field for automatically implemented property 'Mp3Player2.Id' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer."

Meer over dit verhaal is hier te vinden: klik
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan