PARAM es un argumento de parámetro de un método que toma un número variable de argumentos.
public class MyClass
{
public static void UseParams(params int[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
public static void UseParams2(params object[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
static void Main()
{
UseParams(1, 2, 3, 4);
UseParams2(1, 'a', "test");
UseParams2();
int[] myIntArray = { 5, 6, 7, 8, 9 };
UseParams(myIntArray);
object[] myObjArray = { 2, 'b', "test", "again" };
UseParams2(myObjArray);
// The following call causes a compiler error because the object
// array cannot be converted into an integer array.
//UseParams(myObjArray);
// The following call does not cause an error, but the entire
// integer array becomes the first element of the params array.
UseParams2(myIntArray);
}
}
/*
Output:
1 2 3 4
1 a test
5 6 7 8 9
2 b test again
System.Int32[]
*/
OUT y REF son parámetros de métodos que hacen referencia al parámetro pasado como argumento.
OUT no tiene valor al ser declarado como parámetro, sino que el método tiene que asignarle un valor antes de ser devuelto. En caso contrario dará error. Este argumento de parámetro es muy útil cuando se necesita un método que devuelva varios valores.
REF necesita tener valor al ser declarado como parámetro, el método, al ser invocado puede modificar o no, este valor del parámetro.
* Es un error sobrecargar métodos con la única diferencia de REF o OUT. Otro error es pasar una propiedad de la clase (como si fuera una variable) como argumento out de un método.
//valid
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(out int i) {i = 10;}
}
public static void MyMethod(out int[] arr)
{
arr = new int[10];
}
public static void MyMethod(ref int[] arr)
{
arr = new int[10];
}
//invalid
class MyClass
{
public void MyMethod(ref int i) {i = 10;}
public void MyMethod(out int i) {i = 10;}
}
MSDN out
MSDN ref
MSDN params
MSDN Method Parameters