A ver yo lo entiendo de tal forma y a ver si lo entendí bien..
Tipo valor:
static void Incrementar(int param)
{
param++;
}
static void Main()
{
int arg = 42;
Incrementar(arg);
console.writeline(arg);
}
Mi conclusión: Escribe 42 y no 43, entonces mi manera de entenderlo:
int arg = 42 ---> Aquí crea un ESPACIO en memoría con el valor 42
Incrementar(arg) ---> Aquí el espacio sigue siendo el mismo en memoria, es decir 42
static void Incrementar(int param): Aquí crea un NUEVO ESPACIO en memoria con el valor 0 y cuando se llama al método ese valor 0 aumenta en 1, pero aumenta en 1 el espacio de memoria que a sido creado con el int param, osea es totalmente independiente de arg. ¿creo que lo entendí perfectamente o nanai?

Es decir, param = 1, y arg = 42, por que son totalmente INDEPENDIENTES
Si el ejercicio anterior lo hubieramos hecho por REFERENCIA, no seria el resultado 42, si no 1.

Es decir param valdría 1 y arg = 1
Si estoy en lo cierto, entonces creo que lo comprendí ESTUPENDAMENTE

Ahora parametros Ref:
static void Incrementar(ref int param)
{
param++;
}
static void Main()
{
int arg = 42;
Incrementar( ref arg);
console.writeline(arg);
}
El valor que imprime es 43 ¿por que? por que el valor de param ahora es de referencia es decir coge el valor que tiene arg y desde un principio tiene el valor 42, y al hacer param++; toma el valor 43 por que los 2 son de referencia la dirección va al mismo sitio con el mismo valor(43): creo que también lo entendí perfecto

y con el parametro out, significa que sacamos a FUERA del método el valor del parametro es decir, en el ejemplo anterior daría error ya que no se puede aumentar la variable param ya que no tiene NINGUN valor, pero si ponemos param = 32; se mostraría en consola 32