Re: [C#] struct vs. class
Urcite ma, budou u sebe i v pameti. Kdyz udelas tridu:
class Trida
{
string polozka1;
string polozka2;
}
Tak tyto dve polozky mohou byt kazda uplne jinde v pameti -> pokud k obema chces pristoupit, tak budes muset pravdepodobne nacist minimalne 2 stranky z pameti, oproti tomu kdyz bys to mel v strukture tak oba stringy se vesly do 1 pametove stranky.
EDIT: zkousel jsem ti hrat se strukturama a prisel jsem na jednu podivnou vlastnost:
Kód:
interface intr
{
void udelej();
}
struct data : intr
{
public string polozka;
public int pocet;
public void udelej()
{
polozka = "aaaaaaaaaaaaaaa";
}
}
Kdyz vsak napisu:
Kód:
data a = new data();
intr p = a;
p.udelej();
Tak se NEzmeni obsah struktury a! :eek:
Re: [C#] struct vs. class
Ahoj,
diky za radu. Priznam se, ze jsem nikdy nepremyslel nad tim, kde jsou v pameti data ulozena. Co se tyka tveho problemu, tak jsem jeste nevidel, aby struktura implementovala rozhrani, i kdyz to asi mozne je. A co je "a"? Take struktura? Pouzils keyword "new"?
Jeste poznamka k te strukture. Nekde jsem cetl, ze by ve strukture nemelo byt moc dat. Kdyz jich je vice, melo by se prejit na tridu. Je to pravda?
Re: [C#] struct vs. class
Jo, muj haluz priklad je neuplnej, upravil jsem ho. Promenna a je samozrejme struktura data.
No myslim, ze velikost struktury by nemela byt vetsi nez velikost stranky(vetsinou 4KB), protoze pak bys vlastne kdykoli chces zmenit byt je jediny bit, tak (asi?)musis nacist celou strukturu, tedy vic stranek. Ale to uz jsou jenom moje domnenky :)
Mozna to bude jeste horsi, ze budes muset mit celou strukturu v registrech procesoru, takze to bude jeste radove min ~ 16bajtu... (vim ze registru je vic, ale prece jednou strkturou nezplacame vsechny registry...)
Re: [C#] struct vs. class
No asi bych vám spíš než místo dohadů doporučil na tohle nějakou teorii ohledně psaní překladačů (struktura je většinou jen počáteční adresa a pak kompiler dodává offsety podle prvků).
Navíc mi přijde trošku zcestné porovnávat tyhle 2 věci v managed jazyku.. Který je vlastně interpretovaný přes Virtual Machine a ta to provádí jak to páni programátoři naprogramovali..
Stručně a jednoduše, ty zdržení vás dnes štvát vážně nemusí :)
Jinak správná odpověď na rozdíl mezi třídou a strukturou v C++ v testu z předmětu programování v jazyce C++ na ČVUT, bylo že struktura má defaultně vše public :p. V jazyku C jsou to jen obyčejné balíčky dat.
Reálná interpretace musí být tedy v překladači pak vlastně stejná jako class. Jen defaultně je uvnitř vše private.
Navíc řešíte vážně blbost. V prasáckém kódu rozdíl struct a class určitě nepoznáte. Zdržení a prodlevy se hromadí úplně někde jinde. A jestli to někdo změří těším se na výsledky ;).
Jinak asi z historických důvodů se používá taková Best practice, že Struct je prostě jen datový kontejner (dnes vlastně něco jako Java Bean, jelikož Java struct nemá) a class je balík dat a operace s ním spojeným.
Re: [C#] struct vs. class
struktura v C# sa od triedy lisia hlavne tym, ze je to hodnotovy typ t.j nachadza sa v zasobniku zatial co trieda je referencny typ ulozeny v halde
vzhladom na to, ze struktura je hodnotovy typ priradenim A=B, dochadza ku kopirovaniu celeho obsahu strukturu, u triedy sa kopiruje len odkaz t.j. pouzitim stuktury dochadza k poklesu vykonu, ktory je zavisly od velkosti struktury
=> struktury je vhodne pouzivat pre male datove typy kvoli zvyseniu vykonu(vyhradenie pamati na zasobniku je rychle)
samozrejme pouzitim ref bude odovzdana len adresa t.j. bude to rovnako rychle ako v pripade triedy
Re: [C#] struct vs. class
Diky za postrehy. Struct je samozrejme hodnotovy typ a proto je pri predavani kopirovan, coz vede k poklesu vykonu. Meluzina uvadi zajimavy postreh o strankovani a maximalni velikosti 16 bajtu na strukturu. Myslim ze neni daleko od pravdy. Nekde jsem to myslim take cetl. To je ale hodne malo mista ze? Tak akorat na 4x int32.
Jeste se zeptam jinak. Jak byste postupovali pri ukladani dat z nejakeho binarniho souboru s mnoha (zakladnimi) datovymi typy? Vytvorili byste kvuli tomu struct, anebo byste ukladali primo do tridy? (zrejme otazka stylu, ale stejne me to docela zajima) :rolleyes:
Re: [C#] struct vs. class
no ze soboru, databaze ci neceho podobneho bych pouzival asi struct. A ty objekty pojmenoval ObjektTO (Transport Object) a po nacteni bych to prevedl (prekopiroval) na normalni tridu a zacal stim delat pozadovane operace.
Re: [C#] struct vs. class
Appleman Dan, Moving to VB .NET: Strategies, Concepts and Code
Malý výcuc z jedné kapitoly
Struktrury jsou hodnotový typ a jsou alokovány v zásobníku nebo v datové oblasti. Mají proto rychlejší alokaci. Navíc protože nejsou v haldě, tak nepodléhají garbage collectoru, což taky (trochu) zdržuje.
Takže podle zmíněné knihy mají být používány pro malé "objekty" skládající se z číselných hodnot. Například komplexní číslo nebo souřadnice. Je chybou do nich dávat referenční objekty, tedy reference na objekty, protože tím se předchozí výhody ztratí. Mít členem struktury například String (referenční typ) prý není dobré.
A ještě jedna důležitá věc. Když máš strukturu např.
Kód:
Public Structure Souradnice
Private memX As Double
Private memY As Double
'Tady by byly Public Property x() As Double a y() As Double
Dim pocatek As Souradnice = New Souradnice()
Dim konec As Souradnice = New Souradnice()
pocatek.x = 5
pocatek.y = 10
konec = pocatek 'v konec jsou stejne hodnoty jako v pocatek
konec.x = -5
konec.y = -10
'Ted jsou v pocatek i konec rozdilne hodnoty
Prostě se opravdu chovají jako hodnotové typy, to jest kopírují se OBSAHY struktur, ne odkazy jako u referenčních proměnných. Kdyby to byla třída, tak po konec = pocatek by obě ukazovaly na stejné objekt a následné konec.x a konec.y by změnilo hodnoty i pro pocatek. Tohle je IMHO důležité vědět.
Edit: Teď si uvědomuju, že jsem to napsal ve VB a ne v C#, ale snad je to i tak srozumitelné.