Esta documentación está archivada y no tiene mantenimiento.

Métodos (Guía de programación de C#)

Los métodos son un bloque de código que contiene una serie de instrucciones. En C#, cada instrucción se ejecuta en el contexto de un método.

Los métodos se declaran en una clase o estructura especificando el nivel de acceso, el valor devuelto, el nombre del método y los parámetros de método. Los parámetros de método se incluyen entre paréntesis y separados por comas. Los paréntesis vacíos indican que el método no requiere ningún parámetro. Esta clase contiene tres métodos:

class Motorcycle
{
    public void StartEngine() { }
    public void AddGas(int gallons) { }
    public int Drive(int miles, int speed) { return 0; }
}

Llamar a un método en un objeto es similar a tener acceso a un campo. Después del nombre de objeto, agregue un punto, el nombre del método y paréntesis. Los argumentos se enumeran entre paréntesis y separados por comas. Por tanto, se puede llamar a los métodos de la clase Motorcycle del modo siguiente:

Motorcycle moto = new Motorcycle();

moto.StartEngine();
moto.AddGas(15);
moto.Drive(5, 20);

Como se muestra en el fragmento de código anterior, para pasar argumentos a un método simplemente hay que proporcionarlos entre paréntesis cuando se llama al método. En el método al que se llama, los argumentos de entrada se denominan parámetros.

Los parámetros que un método recibe también se proporcionan entre paréntesis, pero se debe especificar el tipo y nombre de cada parámetro. El nombre no tiene por qué ser igual que el argumento. Por ejemplo:

public static void PassesInteger()
{
    int fortyFour = 44;
    TakesInteger(fortyFour);
}
static void TakesInteger(int i)
{
    i = 33;
}

Aquí un método denominado PassesInteger pasa un argumento a un método denominado TakesInteger. En PassesInteger el argumento se denomina fortyFour, pero en TakeInteger es un parámetro denominado i. Este parámetro sólo existe dentro del método TakesInteger. Otras variables también pueden denominarse i y pueden ser de cualquier tipo, siempre y cuando no sean parámetros o variables declaradas en ese método.

Observe que TakesInteger asigna un nuevo valor al argumento proporcionado. Se podría esperar que este cambio se reflejara en el método PassesInteger una vez que TakeInteger devuelve un valor, pero de hecho, el valor de la variable fortyFour se mantiene sin cambios. Esto se debe a que int es un tipo de valor. De forma predeterminada, cuando un tipo de valor se pasa a un método, se pasa una copia en lugar del propio objeto. Dado que son copias, cualquier cambio realizado en el parámetro no tiene ningún efecto en el método de llamada. Los tipos de valor reciben su nombre del hecho de que se pasa una copia del objeto en lugar del propio objeto. Se pasa el valor, pero no el objeto mismo.

Para obtener más información sobre el paso de tipos de valor, vea Pasar parámetros de tipo de valor (Guía de programación de C#). Para obtener una lista de tipos de valores integrales de C#, vea Tabla de tipos de valores (Referencia de C#).

Esto es diferente de los tipos de referencia, que se pasan por referencia. Cuando un objeto basado en un tipo de referencia se pasa a un método, no se realiza ninguna copia del objeto. En su lugar, se hace una referencia al objeto que se utiliza como argumento del método y se pasa dicha referencia. Los cambios realizados a través de esta referencia se reflejarán por consiguiente en el método de llamada. Un tipo de referencia se crea con la palabra clave class, de la forma siguiente:

public class SampleRefType
{
    public int value;
}

Ahora, si un objeto basado en este tipo se pasa a un método, se pasará por referencia. Por ejemplo:

public static void TestRefType()
{
    SampleRefType rt = new SampleRefType();
    rt.value = 44;
    ModifyObject(rt);
    System.Console.WriteLine(rt.value);
}
static void ModifyObject(SampleRefType obj)
{
    obj.value = 33;
}

Este ejemplo hace esencialmente lo mismo que el ejemplo anterior. Pero, como se utiliza un tipo de referencia, la modificación realizada por ModifyObject se efectúa en el objeto creado en el método TestRefType. Por consiguiente, el método TestRefType mostrará el valor 33.

Para obtener más información, vea Pasar parámetros Reference-Type (Guía de programación de C#) y Tipos de referencia (Referencia de C#).

Los métodos pueden devolver un valor al llamador. Si el tipo de valor devuelto (el que aparece antes del nombre de método) no es void, el método puede devolver el valor mediante la palabra clave return. Una instrucción con la palabra clave return, seguida de un valor que coincida con el tipo de valor devuelto, devolverá ese valor al llamador del método. La palabra clave return también detiene la ejecución del método. Si el tipo de valor devuelto es void, una instrucción return sin ningún valor sigue siendo útil para detener la ejecución del método. Sin la palabra clave return, el método detendrá la ejecución cuando llegue al fin del bloque de código. Es necesario que los métodos con un tipo de valor devuelto no nulo utilicen la palabra clave return para devolver un valor. Por ejemplo, estos dos métodos utilizan la palabra clave return para devolver enteros:

class SimpleMath
{
    public int AddTwoNumbers(int number1, int number2)
    {
        return number1 + number2;
    }

    public int SquareANumber(int number)
    {
        return number * number;
    }
}

Para emplear un valor devuelto por un método, el método de llamada puede utilizar la propia llamada del método en cualquier parte donde un valor del mismo tipo sea suficiente. El valor devuelto también se puede asignar a una variable. Por ejemplo, los dos ejemplos de código siguientes logran el mismo objetivo:

int result = obj.AddTwoNumbers(1, 2);
obj.SquareANumber(result);

obj.SquareANumber(obj.AddTwoNumbers(1, 2));

El uso de una variable intermedia, en este caso result, para almacenar un valor es opcional. La legibilidad del código puede ser útil o puede ser necesaria si el valor se va a utilizar más de una vez.

Para obtener más información, vea return (Referencia de C#).

Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#:

  • 1.6.5 Métodos

  • 10.5 Métodos

Mostrar: