Bagikan melalui


Anggota bertubuh ekspresi (panduan pemrograman C#)

Definisi isi ekspresi memungkinkan Anda memberikan implementasi anggota dalam bentuk ringkas dan dapat dibaca. Anda dapat menggunakan definisi isi ekspresi setiap kali logika untuk anggota yang didukung, seperti metode atau properti, terdiri dari satu ekspresi. Definisi isi ekspresi memiliki sintaks umum berikut:

member => expression;

dengan ekspresi adalah ekspresi yang valid.

Definisi isi ekspresi dapat digunakan dengan anggota tipe berikut:

Metode

Metode bertubuh ekspresi terdiri dari ekspresi tunggal yang mengembalikan nilai yang jenisnya cocok dengan jenis pengembalian metode, atau, untuk metode yang mengembalikan void, yang melakukan beberapa operasi. Misalnya, jenis yang mengambil alih metode ToString biasanya menyertakan ekspresi tunggal yang mengembalikan representasi string objek saat ini.

Contoh berikut mendefinisikan kelas Person yang mengambil alih metode ToString dengan definisi isi ekspresi. Ini juga mendefinisikan metode DisplayName yang menampilkan nama ke konsol. Kata return kunci tidak digunakan dalam definisi isi ToString ekspresi.

using System;

namespace ExpressionBodiedMembers;

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();
   }
}

Untuk informasi selengkapnya, lihat Metode (Panduan Pemrograman C#).

Properti baca-saja

Anda dapat menggunakan definisi isi ekspresi untuk mengimplementasikan properti baca-saja. Untuk melakukannya, gunakan perintah berikut:

PropertyType PropertyName => expression;

Contoh berikut mendefinisikan kelas Location yang properti Name baca-sajanya diimplementasikan sebagai definisi isi ekspresi yang mengembalikan nilai bidang privat locationName:

public class Location
{
   private string locationName;

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

   public string Name => locationName;
}

Untuk informasi selengkapnya tentang properti, lihat Properti (Panduan Pemrograman C#).

Properti

Anda dapat menggunakan definisi isi ekspresi untuk mengimplementasikan properti get dan set aksesor. Contoh berikut menunjukkan cara memperbaiki kode:

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

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

Untuk informasi selengkapnya tentang properti, lihat Properti (Panduan Pemrograman C#).

Acara

Demikian pula, peristiwa add dan remove aksesor dapat bertumpuk ekspresi:

public class ChangedEventArgs : EventArgs
{
   public required int NewValue { get; init; }
}

public class ObservableNum(int _value)
{
   public event EventHandler<ChangedEventArgs> ChangedGeneric = default!;

   public event EventHandler Changed
   {
      // Note that, while this is syntactically valid, it won't work as expected because it's creating a new delegate object with each call.
      add => ChangedGeneric += (sender, args) => value(sender, args);
      remove => ChangedGeneric -= (sender, args) => value(sender, args);
   }

   public int Value
   {
      get => _value;
      set => ChangedGeneric?.Invoke(this, new() { NewValue = (_value = value) });
   }
}

Untuk informasi selengkapnya tentang peristiwa, lihat Peristiwa (Panduan Pemrograman C#).

Konstruktor

Definisi isi ekspresi untuk konstruktor biasanya terdiri dari ekspresi penugasan tunggal atau panggilan metode yang menangani argumen konstruktor atau menginisialisasi status instans.

Contoh berikut mendefinisikan Location kelas yang konstruktornya memiliki satu parameter string bernama nama. Definisi isi ekspresi menetapkan argumen ke properti Name.

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

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

Untuk informasi selengkapnya, lihat Konstruktor (Panduan Pemrograman C#).

Finalizer

Definisi isi ekspresi untuk finalizer biasanya berisi pernyataan pembersihan, seperti pernyataan yang merilis sumber daya yang tidak dikelola.

Contoh berikut mendefinisikan finalizer yang menggunakan definisi isi ekspresi untuk menunjukkan bahwa finalizer telah dipanggil.

public class Destroyer
{
   public override string ToString() => GetType().Name;

   ~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}

Untuk informasi selengkapnya, lihat Finalizers (Panduan Pemrograman C#).

Pengindeks

Seperti halnya properti get, pengindeks set dan pengakses get terdiri dari definisi isi ekspresi jika pengakses terdiri dari satu ekspresi yang mengembalikan nilai atau pengakses set melakukan penugasan sederhana.

Contoh berikut mendefinisikan kelas bernama Sports yang menyertakan array internal String yang berisi nama beberapa olahraga. Pengindeks get dan pengakses set diimplementasikan sebagai definisi isi ekspresi.

using System;
using System.Collections.Generic;

namespace SportsExample;

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;
   }
}

Untuk informasi selengkapnya, lihat Pengindeks (Panduan Pemrograman C#).

Lihat juga