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#).