Miembros con cuerpo de expresión en C#

Los miembros con cuerpo de expresión proporcionan una sintaxis mínima y concisa para definir propiedades y métodos. Ayuda a eliminar el código repetitivo y ayuda a escribir código que sea más legible. La sintaxis con cuerpo de expresión se puede usar cuando el cuerpo de un miembro consiste solo en una expresión. Utiliza el operador => (f en la flecha ) para definir el cuerpo del método o la propiedad y permite deshacerse de las llaves y la palabra clave de retorno . La función se introdujo por primera vez en C# 6.

Métodos con cuerpo de expresión

En C#, un método es una colección de declaraciones que realizan una tarea determinada y devuelven el resultado a la persona que llama. Muchas veces, los métodos terminan conteniendo solo una declaración. Por ejemplo, considere el siguiente código:

int GetRectangleArea(int length, int breadth) 
{
    return length * breadth;
} 

El método anterior solo consta de una declaración de devolución única. Usando la sintaxis con cuerpo de expresión, el método anterior se puede reescribir de la siguiente manera:

int GetRectangleArea(int length, int breadth) => length * breadth;

Observe, la ausencia de las llaves y la declaración de devolución . En lugar de llaves, se ha utilizado el operador => . La expresión que sigue después de la declaración de devolución se escribe justo después del operador => .

Sintaxis

[modificador de acceso] [calificadores] tipo de retorno MethodName([parámetros]) => expresión;

Ejemplo

El siguiente ejemplo define un método booleano llamado IsEven() que devuelve verdadero si el número que se le pasa es par; de lo contrario, el método devuelve falso. El método IsEven() usa sintaxis con cuerpo de expresión.

C#

// C# program to illustrate expression bodied method
using System;
  
class GFG{
      
// Returns true if number is even
// else returns false
public static bool IsEven(int number) => number % 2 == 0;
  
// Driver code
public static void Main()
{
    int n = 10;
      
    if (IsEven(n))
    {
          Console.WriteLine("{0} is even", n);
    }
    else 
    {
        Console.WriteLine("{0} is odd", n);
    }
}
}
Producción

10 is even

Métodos de vacío con cuerpo de expresión 

Los métodos vacíos son aquellos métodos que no contienen una declaración de retorno y consisten solo en una sola declaración, también pueden usar sintaxis con cuerpo de expresión. Por ejemplo, el siguiente método:

void PrintName(string name)
{
    Console.WriteLine($"The name is {name}");
}

se puede escribir con sintaxis con cuerpo de expresión de la siguiente manera:

void PrintName(string name) => Console.WriteLine($"The name is {name}"); 

Propiedades con cuerpo de expresión

Los accesores de propiedad también pueden tener solo una declaración. Con propiedades con cuerpo de expresión, tales definiciones de propiedad se pueden simplificar.

1. Propiedades de solo lectura

Las propiedades de solo lectura son propiedades que solo tienen un descriptor de acceso get , como el siguiente:

public int Name 
{ 
    get 
    {
        return "Geeks For Geeks";
    }
}  

Usando la sintaxis con cuerpo de expresión, la propiedad se puede definir de la siguiente manera:

public int Name => "Geeks For Geeks";

Sintaxis

[modificador de acceso] [calificador] type PropertyName => expresión;

Ejemplo

El siguiente ejemplo define una clase llamada Square con un constructor que acepta la longitud del lado del cuadrado. Una vez que se establece el lado en el constructor, no se puede modificar porque la propiedad pública Side es de solo lectura. Además, el campo lateral es privado y no se puede acceder desde fuera de la clase.

C#

// C# program to illustrate expression bodied properties
using System;
  
public class Square 
{
    private int side;
    
    public Square(int side) 
    {
        this.side = side;
    }
      
    public int Side => side;
}
  
class GFG{
  
// Driver code
public static void Main()
{
    var square = new Square(4);
    Console.WriteLine($"Side is {square.Side}");
}
}
Producción

Side is 4

2. Propiedades de no solo lectura

Desde C# 7, las propiedades que no son de solo lectura también pueden tener descriptores de acceso get y set con cuerpo de expresión . En la siguiente clase Person , la propiedad Name define los accesores get y set , cada uno con una sola instrucción:

public class Person
{
    private string name;
    
    public string Name
    {
        get 
        {
            return name;
        }
        set 
        {
           name = value;
        }
    }
}

Esto se puede simplificar usando descriptores de acceso con cuerpo de expresión:

public class Person
{
    private string name;
    
    public string Name
    {
        get => name;
        set => name = value;
    }
}

Sintaxis

[modificador de acceso] [calificadores] [tipo] PropertyName

{

    obtener => expresión;

    conjunto => expresión;

}

Ejemplo

El siguiente código define una clase Square como el ejemplo anterior, pero aquí, la propiedad Side también tiene un descriptor de acceso establecido . Además, se ha utilizado un inicializador de objetos en lugar de un constructor para proporcionar el valor inicial de la propiedad Side :

C#

// C# program to illustrate expression bodied properties
using System;
  
public class Square 
{
    private int side;
    
    public int Side 
    {
        get => side;
        set => side = value;
    }
}
  
class GFG{
  
// Driver code    
public static void Main()
{
    var square = new Square{Side = 4};
    Console.WriteLine($"Side is {square.Side}");
    square.Side = 10;
      Console.WriteLine($"Side is now {square.Side}");
}
}
Producción

Side is 4
Side is now 10

Constructores y destructores con cuerpo de expresión

La sintaxis con cuerpo de expresión también se ha ampliado para usarse con constructores y destructores/finalizadores . Si cualquiera de estos métodos contiene solo una declaración, se pueden definir como con cuerpo de expresión. 

Sintaxis

  • Constructores

[modificador de acceso] ClassName([parámetros]) => expresión;

  • Destructores/Finalizadores

~ClassName()=> expresión;

Ejemplo

En el siguiente ejemplo, la clase Square define un constructor y un destructor, cada uno de los cuales contiene una definición con cuerpo de expresión:

C#

// C# program to illustrate expression-bodied 
// constructors and destructors
using System;
  
public class Square 
{
    private int side;
    
    public Square(int side) => this.side = side;
      
    ~Square() => Console.WriteLine("Square's Destructor");
    
    public int Side => side;
}
  
class GFG{
  
// Driver code
public static void Main()
{
    var square = new Square(4);
    Console.WriteLine($"Side is {square.Side}");
}
}
Producción

Side is 4
Square's Destructor

Indexadores con cuerpo de expresión

Al igual que las propiedades, los accesores de indexadores también pueden tener cuerpo de expresión. Las definiciones de indexador siguen las mismas convenciones que las propiedades, lo que implica que los indexadores de solo lectura se pueden definir sin especificar el acceso y los accesos de lectura y escritura requieren el nombre del acceso.

Sintaxis

  • Indexadores de solo lectura

[modificador de acceso] [calificadores] return-type this[ [parámetros] ] => expresión;

  • Indexadores de lectura y escritura

[modificador de acceso] [calificadores] return-type this [[parámetros]]

{

    obtener => expresión;

    conjunto => expresión;

}

Ejemplo

La siguiente clase ProgrammingLangs define un lenguaje de array de strings de lenguajes de programación y también define un indexador que reenvía los índices a la array de idiomas y devuelve el elemento (idioma) en ese índice. El indexador es de solo lectura, por lo que los idiomas de la array no se pueden modificar fuera de la clase.

C#

// C# program to illustrate expression-bodied indexers
using System;
  
public class ProgrammingLangs
{
    private string[] languages = 
    {
        "C#",
        "C",
        "C++",
        "Python",
        "Java"
    };
    
    public string this[int idx] => languages[idx];
}
  
class GFG{
  
// Driver code
public static void Main()
{
    var langs = new ProgrammingLangs();
    Console.WriteLine(langs[0]);
      Console.WriteLine(langs[2]);
      Console.WriteLine(langs[3]);
}
}
Producción

C#
C++
Python

Funciones de operador con cuerpo de expresión

Al igual que los métodos ordinarios con una sola instrucción pueden tener un cuerpo de expresión, las definiciones de métodos de operadores también pueden tener un cuerpo de expresión si su cuerpo consta de una sola declaración.

Sintaxis

[modificador de acceso] operador estático [símbolo-operador] ([parámetros]) => expresión;

Ejemplo

El siguiente ejemplo implementa una clase Complex que representa la parte real e imaginaria de un número complejo y también define el operador binario + para permitir la suma de dos objetos Complex . La función operator+ tiene cuerpo de expresión.

C#

// C# program to illustrate expression-bodied operator functions
using System;
  
public struct Complex
{
    public int Real{get; set;}
    public int Imaginary{get; set;}
    
    public Complex(int real, int imaginary)
    {
        Real = real;
        Imaginary = imaginary;
    }
     
    // Expression-bodied operator method
    public static Complex operator + (
        Complex c1, Complex c2) =>
        new Complex(c1.Real + c1.Real,
               c1.Imaginary + c2.Imaginary);
    
    public override string ToString() => 
       $"({Real}) + ({Imaginary}i)";
}
  
class GFG{
  
// Driver code 
public static void Main()
{
    var a = new Complex(3, 2);
    var b = new Complex(1, 2);
    var result = a + b;
      
    Console.WriteLine($"{a} + {b} = {result}");
}
}

Producción:

(3) + (2i) + (1) + (2i) = (6) + (4i)

Publicación traducida automáticamente

Artículo escrito por amallkrishna y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *