Jak clovek pozna jestli se jedna o typ s hodnotou predavanou odkazem (class) nebo s hodnotou predavanou hodnotou (struct)

je celkem jednoduchy.
a) Dokumentace
b) Vyvojovy prostredi na ne maji v napovidani jinou ikonku
c) Porad dokola pouzivas par zakladnich typu takze si to zapamatujes
I pokud budes pouzivat usnafe kod (= ukazatele) je v podste jedno kde ti co lezi, dulezity je, ze se jinak chovaj pri pouziti = a predani jako parametru do funkce
A hlavne to potrebujes jenom v pripade, ze resis pouziti absurdne velkyho mnozstvi vlaken a nastavujes jim maly lokalni stacky.
int[] ar = new int[5];
Teď když jsem použil new, čekal bych, že inty budou na haldě a měly by tam být už jen proto, že kdykoliv můžu zavolat Array.Resize(...). Znamená to ale, že je "ar" automaticky referenční typ, nebo v tom mám zmatek?
Pole na cokoliv je vzdycky referencni typ odvozeny od System.Array je uplne jedno co do toho davas. Rozdil od c++ je v tom, ze Array je objekt = typ odvozenej od system.Object a ne jenom ukazatel na kus alokovany pameti = chova se jako vsechny ostatni classy.
struct Struktura {...}
a můžu ji instanciovat buď jako
Struktura s1;
- to bych hledal na zásobníku jako hodnotový typ, ale zdá se mi, že můžu napsat také
Struktura s2 = new Struktura();
a tam bych čekal, že "s2" bude už na haldě.
new Struktura() ber v podstate syntaktickej cukr. Je to tam kvuli tomu, ze Struktury muzou obsahovat "konstruktor" s parametrama pro snadnejsi inicializaci new Struktura(int, int, int) ( = proste metoda co nejak inicializuje hodnoty aniz bys to musel porad dokola psat struktura.x = 1; struktura.y=2 atd..). Takze kdyby to tam nebylo tak je to ponekud nekonzistentni chovani.
Je, prosím, správné předjímat, že to, co vytvořím na haldě budou referenční typy? Snad vyjma toho, že součástí referenčního typu - např. proměnná typu int byť jako member instance třídy se samozřejmě referenčním typem nestane.
Jaké vodítko, prosím, používáte Vy?
Děkuji.
No hlavne neni dobry predjimat to, ze si neco vytvoril na halde

. Proc povazujete za dulezite, jestli promenna lezi na halde nebo na stacku?
Ale funguje takhle:
1)"veci" o kterych kompilator vi kdy je muze smazat. Typicky lokalni promenne.
- tim padem se tam vykytuji reference na objekt a struktury
- ve chvili kdy vypadnete z metody stack se posune a tim je postarano o cisteni pameti
- u struktur se posunutim stacku uvolni vsechna pamet kterou zabiraji
- potom co se smaze reference na objekt zustavaji clensky data na heapu, pokud se to to nepostara GC (nebo finalizer)
2) "veci" o kterych kompilator nevi kdy jim konci platnost
- jsou na heape vzdycky. Vcetne struktur
Pokud to chcete brat z pohledu dat tak:
Na stacku jsou jenom struktury deklarovany jako lokalni promenne, nebo predane jako parametry funkce
vsechno ostani je na heapu
(Jinak na stacku jeste lezej reference na lokalni objekty)
Jenze se to chova prave takhle, protoze je to nejlepsi reseni na ktery kdo zatim prisel. U dalsi verze .NETu se klidne muzou rozhodnout davat maly classy taky na stack, nikdo nemuze zarucit, ze se to bude takhle chovat vzdycky .)