Miembros con cuerpo de expresión (Guía de programación de C#)Expression-bodied members (C# programming guide)

Las definiciones de cuerpos de expresión permiten proporcionar la implementación de un miembro de una forma muy concisa y legible.Expression body definitions let you provide a member's implementation in a very concise, readable form. Se puede usar una definición de cuerpo de expresión siempre que la lógica de cualquier miembro compatible, como un método o propiedad, se componga de una expresión única.You can use an expression body definition whenever the logic for any supported member, such as a method or property, consists of a single expression. Una definición de cuerpo de expresión tiene la siguiente sintaxis general:An expression body definition has the following general syntax:

member => expression;

donde expresión es una expresión válida.where expression is a valid expression.

La compatibilidad con las definiciones de cuerpos de expresión se introdujo para los métodos y las propiedades de solo lectura en C# 6 y se expandió en C# 7.0.Support for expression body definitions was introduced for methods and read-only properties in C# 6 and was expanded in C# 7.0. Las definiciones de cuerpos de expresión se pueden usar con los miembros de tipo que se muestran en la tabla siguiente:Expression body definitions can be used with the type members listed in the following table:

MiembroMember Se admite desde...Supported as of...
MétodoMethod C# 6C# 6
Propiedad de solo lecturaRead-only property C# 6C# 6
PropertyProperty C# 7.0C# 7.0
ConstructorConstructor C# 7.0C# 7.0
FinalizadorFinalizer C# 7.0C# 7.0
IndizadorIndexer C# 7.0C# 7.0

MétodosMethods

Un método con cuerpo de expresión consta de una sola expresión que devuelve un valor cuyo tipo coincide con el tipo de valor devuelto del método, o bien, para los métodos que devuelven void, que realiza alguna operación.An expression-bodied method consists of a single expression that returns a value whose type matches the method's return type, or, for methods that return void, that performs some operation. Por ejemplo, los tipos que reemplazan el método ToString normalmente incluyen una sola expresión que devuelve la representación de cadena del objeto actual.For example, types that override the ToString method typically include a single expression that returns the string representation of the current object.

En el ejemplo siguiente se define una clase Person que reemplaza el método ToString con una definición de cuerpo de expresión.The following example defines a Person class that overrides the ToString method with an expression body definition. También define un método DisplayName que muestra un nombre en la consola.It also defines a DisplayName method that displays a name to the console. Tenga en cuenta que la palabra clave return no se usa en la definición de cuerpo de expresión de ToString.Note that the return keyword is not used in the ToString expression body definition.

using System;

public class Person
{
   public Person(string firstName, string lastName)
   {
      fname = firstName;
      lname = lastName;
   }

   private string fname;
   private string lname;
   
   public override string ToString() => $"{fname} {lname}".Trim();
   public void DisplayName() => Console.WriteLine(ToString());
}

class Example
{
   static void Main()
   {
      Person p = new Person("Mandy", "Dejesus");
      Console.WriteLine(p);
      p.DisplayName();
   }
}

Para más información, vea Métodos (Guía de programación de C#).For more information, see Methods (C# Programming Guide).

Propiedades de solo lecturaRead-only properties

A partir de C# 6, puede usar la definición de cuerpo de expresión para implementar una propiedad de solo lectura.Starting with C# 6, you can use expression body definition to implement a read-only property. Para ello, use la sintaxis siguiente:To do that, use the following syntax:

PropertyType PropertyName => expression;

En el ejemplo siguiente se define una clase Location cuya propiedad Name de solo lectura se implementa como una definición de cuerpo de expresión que devuelve el valor del campo privado locationName:The following example defines a Location class whose read-only Name property is implemented as an expression body definition that returns the value of the private locationName field:

public class Location
{
   private string locationName;
   
   public Location(string name)
   {
      locationName = name;
   }

   public string Name => locationName;
}

Para más información sobre las propiedades, vea Propiedades (Guía de programación de C#).For more information about properties, see Properties (C# Programming Guide).

PropiedadesProperties

A partir de C# 7.0, puede usar las definiciones de cuerpo de expresión para implementar los descriptores de acceso get y set de propiedades.Starting with C# 7.0, you can use expression body definitions to implement property get and set accessors. En el ejemplo siguiente se muestra cómo hacerlo:The following example demonstrates how to do that:

public class Location
{
   private string locationName;
   
   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   } 
}

Para más información sobre las propiedades, vea Propiedades (Guía de programación de C#).For more information about properties, see Properties (C# Programming Guide).

ConstructoresConstructors

Una definición de cuerpo de expresión para un constructor normalmente consta de una expresión de asignación única o una llamada de método que controla los argumentos del constructor o inicializa el estado de la instancia.An expression body definition for a constructor typically consists of a single assignment expression or a method call that handles the constructor's arguments or initializes instance state.

En el ejemplo siguiente se define una clase Location cuyo constructor tiene un único parámetro de cadena denominado name.The following example defines a Location class whose constructor has a single string parameter named name. La definición del cuerpo de expresión asigna el argumento a la propiedad Name.The expression body definition assigns the argument to the Name property.

public class Location
{
   private string locationName;
   
   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   } 
}

Para más información, vea Constructores (Guía de programación de C#).For more information, see Constructors (C# Programming Guide).

FinalizadoresFinalizers

Una definición de cuerpo de expresión para un finalizador normalmente contiene instrucciones de limpieza, como las instrucciones que liberan recursos no administrados.An expression body definition for a finalizer typically contains cleanup statements, such as statements that release unmanaged resources.

En el ejemplo siguiente se define un finalizador que usa una definición de cuerpo de expresión para indicar que el finalizador se ha llamado.The following example defines a finalizer that uses an expression body definition to indicate that the finalizer has been called.

using System;

public class Destroyer
{
   public override string ToString() => GetType().Name;
   
   ~Destroyer() => Console.WriteLine($"The {ToString()} destructor is executing.");
}

Para más información, vea Finalizadores (Guía de programación de C#).For more information, see Finalizers (C# Programming Guide).

IndizadoresIndexers

Como las propiedades, los descriptores de acceso get y set del indizador constan de las definiciones de cuerpos de expresión si el descriptor de acceso get está formado por una sola expresión que devuelve un valor o el descriptor de acceso set realiza una asignación simple.Like with properties, indexer get and set accessors consist of expression body definitions if the get accessor consists of a single expression that returns a value or the set accessor performs a simple assignment.

En el ejemplo siguiente se define una clase denominada Sports que incluye una matriz String interna que contiene los nombres de varios deportes.The following example defines a class named Sports that includes an internal String array that contains the names of a number of sports. Los descriptores de acceso get y set del indizador se implementan como definiciones de cuerpos de expresión.Both the indexer get and set accessors are implemented as expression body definitions.

using System;
using System.Collections.Generic;

public class Sports
{
   private string[] types = { "Baseball", "Basketball", "Football", 
                              "Hockey", "Soccer", "Tennis", 
                              "Volleyball" }; 

   public string this[int i]
   {
      get => types[i];
      set => types[i] = value;
   }
}

Para más información, vea Indizadores (Guía de programación de C#).For more information, see Indexers (C# Programming Guide).