C# Methods

Paso por valor o por referencia

En C# se puede elegir si quieres pasar a un método el valor o la referencia de una variable.

// pasar por valor
int numero = 25;
CambiarPorValor(numero); 
Console.Write(numero); // prints 25

// pasar por ref
CambiarPorReferencia(ref numero);
Console.Write(numero); // prints 12
// this is the same as in Java
public static void CambiarPorValor(int numero)
{
	numero = 12;
}
// referencia(!)
public static void CambiarPorReferencia(ref int numero)
{
	numero = 12;
}

out vs ref

(!) You should use out unless you explicitly need ref (!)

The difference is ref needs the variables to be initialized first, while out does not. This could confuse readers as it looks the initial values are relevant.

out example (remember it also has to be marked in the method)

string a,b;
person.GetBothNames(out a, out b);
string a = String.empty, b = String.empty;
person.GetBothNames(ref a, ref b);

Devolver 2 valores desde una función

Al poder pasarse referencias, esto es posible.

public static void Devuelve2Valores(ref int numero1, ref int numero2)
{
	numero1 = 10;
	numero2 = 20;
}

Interpolar Strings

Aparte del + igual que Java se puede concatenar hacer asi

string cadena1 = "test";
string cadena2 = "test2";
string todasCadenas = string.Concat(cadena1, cadena2);

O también se pueden interpolar:

string cadena1 = "test";
string cadena2 = "test2";
string interpolacion = $"{cadena1} texto aparte {cadena2}";

También se puede usar StringBuilder pero se usa igual a Java.

Función Local

Se pueden meter funciones dentro de funciones. Las que están dentro, solo se pueden ejecutar y ver desde el contexto de la función padre.

class Program
{
	static void Main(string[] args)
	{
		FuncionPrincipal(12);
	}
	
	public static void FuncionPrincipal(int numero)
	{
		Console.WriteLine("Dentro de la funcion principal");
		numero = numero + 10;
		FuncionLocal(numero);

		void FuncionLocal(int numeroLocal)
		{
			numeroLocal = numeroLocal * 15;
			Console.WriteLine(numeroLocal);
		}
	}
}