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

Actualización: noviembre 2007

Un método es un bloque de código que contiene una serie de instrucciones. Los programas hacen que las instrucciones se ejecuten mediante una llamada al método y la especificación de los argumentos de método necesarios. En C#, cada instrucción se ejecuta en el contexto de un método. El método Main es el punto de entrada de cada aplicación C# al que llama Common Language Runtime (CLR) cuando se inicia el programa.

Nota:

En este tema se analizan los métodos con nombre. Para obtener más información sobre las funciones anónimas, vea Funciones anónimas (Guía de programación de C#).

Firmas de método

Los métodos se declaran en una clase o estructura mediante la especificación del nivel de acceso como public o private, modificadores opcionales como abstract o sealed, el valor devuelto, el nombre del método y cualquier parámetro de método. Todos esos elementos constituyen la firma del método.

Nota:

Un tipo de valor devuelto desde un método no forma parte de su firma a efectos de la sobrecarga de métodos. Sin embargo, sí forma parte de la firma del método a la hora de determinar la compatibilidad entre un delegado y el método al que apunta.

Los parámetros del método se encierran entre paréntesis y se separan por comas. Los paréntesis vacíos indican que el método no requiere ningún parámetro. Esta clase contiene tres métodos:

abstract class Motorcycle
{
    // Anyone can call this.
    public void StartEngine() {/* Method statements here */ }

    // Only derived classes can call this.
    protected void AddGas(int gallons) { /* Method statements here */ }

    // Derived classes can override the base class implementation.
    public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }

    // Derived classes must implement this.
    public abstract double GetTopSpeed(); 
}

Acceso al método

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

class TestMotorcycle : Motorcycle
{

    public override double GetTopSpeed()
    {
        return 108.4;
    }

    static void Main()
    {

        TestMotorcycle moto = new TestMotorcycle();

        moto.StartEngine();
        moto.AddGas(15);
        moto.Drive(5, 20);
        double speed = moto.GetTopSpeed();
        Console.WriteLine("My top speed is {0}", speed);            
    }
}

Parámetros y argumentos de método

La definición de método especifica los nombres y tipos de cualquier parámetro que se requiera. Cuando el código de llamada llama al método, proporciona valores concretos denominados argumentos a cada parámetro. Los argumentos deben ser compatibles con el tipo de parámetro pero el nombre del argumento (si existe) que se utiliza en el código de llamada no tiene que ser igual que el nombre de parámetro definido en el método. Por ejemplo:

public void Caller()
{
    int numA = 4;
    // Call with an int variable.
    int productA = Square(numA);

    int numB = 32;
    // Call with another int variable.
    int productB = Square(numB);

    // Call with an integer literal.
    int productC = Square(12);

    // Call with an expression that evaulates to int.
    productC = Square(productA * 3);
}

int Square(int i)
{
    // Store input argument in a local variable.
    int input = i;
    return input * input;
}

Pasar por referencia y pasar por valor

De forma predeterminada, cuando un tipo de valor se pasa a un método, se pasa una copia en lugar del propio objeto. Por tanto, los cambios en el argumento no tienen ningún efecto en la copia original del método de llamada. Puede pasar un tipo de valor por referencia mediante la palabra clave ref. Para obtener más información, vea Pasar parámetros de tipo de valor (Guía de programación de C#). Para obtener una lista de los tipos de valor integrados, vea Tabla de tipos de valores (Referencia de C#).

Los tipos de referencia se pasan por referencia. Cuando un objeto de un tipo de referencia se pasa a un método, la referencia señala al objeto original, no a una copia. 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 utilizando la palabra clave class como en el ejemplo 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);
    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#).

Valores devueltos

Los métodos pueden devolver un valor al llamador. Si el tipo de valor devuelto (el que aparece antes del nombre del 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 se corresponda 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 desde un método, el método que realiza la llamada puede utilizar la propia llamada al otro método en cualquier parte donde pueda aparecer un valor del mismo tipo. 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 local, en este caso result, para almacenar un valor es opcional. Puede ayudar a la legibilidad del código o puede ser necesaria si necesita almacenar el valor original del argumento para todo el ámbito del método.

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

Especificación del lenguaje C#

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

  • 1.6.6 Métodos

  • 10,6 Métodos

Vea también

Conceptos

Guía de programación de C#

Referencia

Clases y estructuras (Guía de programación de C#)

Modificadores de acceso (Guía de programación de C#)

Clases estáticas y sus miembros (Guía de programación de C#)

Herencia (Guía de programación de C#)

Clases y miembros de clase abstractos y sellados (Guía de programación de C#)

params (Referencia de C#)

return (Referencia de C#)

out (Referencia de C#)

ref (Referencia de C#)

Pasar parámetros (Guía de programación de C#)