Toon posts:

structs in vb.net wanneer te kiezen tussen dit en objecten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo ik heb een vraag over structs wanneer ik hieromtrent lees zie ik dat dit niet veel verschilt van een klasse gewoon dat dit gewoon gekopieerd wordt by value en niet by reference
en dat een struct ook methoden heeft.

nu heb ik ook gelezen dat dit gebruikt wordt voor eigenlijk makkelijke structuren te maken
wanneer maken jullie nu structs en wanneer objecten in mijn boek staat er niet echt eenverschil ingemeld en wanneer ik zoek op internet krijg ik enkel dat men structs gebruikt voor simpele dingen om minder geheugen gebruik te hebben dan een klasse klopt dit ?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hoi
Allereerst, zinnen beginnen met een Hoofdletter en eindigen in een punt. Dat zeg ik niet om te zeiken, maar zonder die dingen leest het gewoon heel lastig omdat je niet weet wanneer de ene zin ophoudt en de andere weer begint :).

Over je vraag: classes zijn reference types en structs zijn value types. Dat houdt in dat een object variabele slechts een referentie bijhoudt naar een stukje geheugen waar de class instance staat. Je moet deze objecten aanmaken met new en als je ze aan een functie geeft geef je ook slechts die referentie, en als je het object aanpast dan zullen die veranderingen ook te zien zijn in de aanroepende functie. Bij structs heb je geen referentie, de variabele omvat alle data uit de struct en wordt dus op de stack gealloceerd. Als je 'm aan een functie geeft wordt er een kopie gemaakt van al die data en aan de functie gegeven1. Een aanpassing in die functie zal niet reflecteren op de aanvullende functie.

Over het algemeen is memorymanagement duur, dus als het slechts kleine objectjes zijn die eigenlijk niet meer doen dan wat data bijhouden (bijvoorbeeld een punt in 3d) is het vaak een goede optimalisatie om er een struct van te maken. Daarnaast is het natuurlijk ook logischer; het zijn niet echt een object met verantwoordelijkheden, het zijn slechts typen die wat data bijhouden.

1 Dit kan geoptimaliseerd worden door alsnog een referentie mee te sturen, maar ik heb geen idee hoe de .Net virtual machine of de compiler ermee omgaat.

[ Voor 7% gewijzigd door .oisyn op 21-01-2005 19:44 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op vrijdag 21 januari 2005 @ 19:38:
1 Dit kan geoptimaliseerd worden door alsnog een referentie mee te sturen, maar ik heb geen idee hoe de .Net virtual machine of de compiler ermee omgaat.
Ik weet het niet 100% zeker maar volgens mij wordt de de struct nog steeds byvalue doorgegeven en na het voltooien weer als soort van return value over de oude waarde geschreven. Het is dus niet echt efficient om valuetypes byref door te geven, maar als je valuetypes vaak byref doorgeeft had je het ook al geen valuetype moeten maken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik bedoelde eerder dat de compiler byvalue doorgestuurde structs kon optimizen door ze ipv byvalue byref mee te sturen en indien nodig pas in de functie zelf een kopie te maken (zodat als een functie de data niet veranderd je al die kopieën niet hoeft te maken).

Maar goed, misschien kun je ook helemaal niet bij de aanroepende stackframe komen, en moet het byref passen dus op een andere manier opgelost worden door de vm. Dan werkt bovenstaande optimalisatie natuurlijk ook niet.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Hier stond wat niet relevante tekst...
.oisyn schreef op vrijdag 21 januari 2005 @ 21:48:
[...]
Het heeft ook niets te maken met de struct uit C of C++, behalve dat ze het keyword geleend hebben.
Ik dacht inderdaad dat het hetzelfde was.

[ Voor 90% gewijzigd door Daos op 21-01-2005 22:18 . Reden: Alles weg ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uh, ga anders eerst even bijlezen over structs in .Net, want volgens mij heb je het niet helemaal begrepen :) (Je komt ook met allemaal onrelevante info. C, QuickBasic, VBA? Daar gaat het hier allemaal niet om)

[ Voor 35% gewijzigd door .oisyn op 21-01-2005 21:09 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Daos
  • Registratie: Oktober 2004
  • Niet online
.oisyn schreef op vrijdag 21 januari 2005 @ 21:03:
Uh, ga anders eerst even bijlezen over structs in .Net, want volgens mij heb je het niet helemaal begrepen :) (Je komt ook met allemaal onrelevante info. C, QuickBasic, VBA? Daar gaat het hier allemaal niet om)
OK, dat van die methoden is fout.

Maar de rest:
Eerst was er GWBasic, daarna QuickBasic, Visual Basic (for Applications) en nu hebben we VB.Net.
Elke keer heeft microsoft iets in de taal gewijzigd maar het is nooit veel geweest. Ik geef toe dat ik zelf geen VB.Net heb, maar aan de hand van code die ik gezien heb trek ik de conclusie dat microsoft met een nieuwe naam wat meer producten wil verkopen.
Of is VB.Net iets heel anders en is zelfs het aanroepen van functies gewijzigd?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Elke keer heeft microsoft iets in de taal gewijzigd maar het is nooit veel geweest. Ik geef toe dat ik zelf geen VB.Net heb, maar aan de hand van code die ik gezien heb trek ik de conclusie dat microsoft met een nieuwe naam wat meer producten wil verkopen.
Nee jij moet echt je mond houden als je ergens niets over weet :X VB.net is een compleet herontworpen taal om de globale syntax van VB in het moderne object-oriented tijdperk binnen te laten treden. Tis vrijwel 100% incompatible met VB6/VBA, compleet object-georienteerd en heeft alle moderne mechanismes als exceptions, structs, classes en dynamisch memory management aan boord. Iow.: go buy a book ;)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

maar aan de hand van code die ik gezien heb trek ik de conclusie dat microsoft met een nieuwe naam wat meer producten wil verkopen.
Onzin, maar je wilt zeggen dat je het hele .Net platform niet kent? Want daar gaat het nou juist om, de topicstarter gebruikt VB.Net maar het gaat net zo goed op voor C# en andere .Net talen. Met class definieer je een type dat je moet new'en, zoals in Java. Met struct definieer je een value-type, die je op de stack aanmaakt of in de objecten zelf. Het heeft ook niets te maken met de struct uit C of C++, behalve dat ze het keyword geleend hebben.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:54
Ik ben lui vandaag, en ik heb gewoon ff uit de MSDN gecopy-pasted:
Structs may seem similar to classes, but there are important differences that you should be aware of. First of all, classes are reference types and structs are value types. By using structs, you can create objects that behave like the built-in types and enjoy their benefits as well.

When you call the New operator on a class, it will be allocated on the heap. However, when you instantiate a struct, it gets created on the stack. This will yield performance gains. Also, you will not be dealing with references to an instance of a struct as you would with classes. You will be working directly with the struct instance. Because of this, when passing a struct to a method, it's passed by value instead of as a reference.


Structs are simple to use and can prove to be useful at times. Just keep in mind that they're created on the stack and that you're not dealing with references to them but dealing directly with them. Whenever you have a need for a type that will be used often and is mostly just a piece of data, structs might be a good option.

https://fgheysels.github.io/

Pagina: 1