Při předání hodnotou, je parametr jako lokální proměnná metody. Při předání odkazem, je ten parametr odkaz na předávanou proměnnou.
void byval(int param)
{
// parametr je hodnota, zmeni se jen lokalni hodnota param
param += 50;
}
void byref(ref int param)
{
// parametr je odkaz, zmeni se hodnota, na kterou odkazuje
param += 50;
}
int hodnota = 10;
byval(hodnota);
Console.WriteLine("hodnota {0}", hodnota); // 10
byref(ref hodnota);
Console.WriteLine("hodnota {0}", hodnota); // 60
Co se týče té vánočky, tak příkaz += není nějaká definice vazby. Je to příkaz, který se provede a šmitec.
// k hodnote `cukrovi` se pricte hodnota `vanocka`
cukrovi += vanocka;
// toto uz se `cukrovi` nijak netyka
// (teoreticky `vanocka` muze byt reference na `cukrovi`, ale dejme tomu, ze neni)
vanocka = 123;
A ta pasáž o tom, že pole je pointer, je ještě o něčem trochu jiném. Tam píšou, že když hodnotou předáváš pole (nebo jiný referenční typ), tak sice předáváš parametr hodnotou, ale ta hodnota je odkaz :-)
void arr1(int[] param)
{
// opet jen lokalni zmena
param = new int[] {4, 5, 6};
}
void arr2(int[] param)
{
// tady nemenim param, ale jeho obsah, tj. data, na ktere odkazuje
param[0] = 4;
}
int[] pole = new int[] { 1, 2, 3 };
arr1(pole);
Console.WriteLine("hodnota {0}", pole[0]); // 1
arr2(pole);
Console.WriteLine("hodnota {0}", pole[0]); // 4