Apa yang Anda lihat adalah anggota bertubuh ekspresi bukan ekspresi lambda.
Ketika kompiler bertemu dengan anggota properti bertubuh ekspresi , pada dasarnya ia mengubahnya menjadi pengambil seperti ini:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(Anda dapat memverifikasi ini sendiri dengan memompa kode ke alat yang disebut TryRoslyn .)
Anggota bertubuh ekspresi - seperti kebanyakan fitur C # 6 - hanyalah gula sintaksis . Ini berarti bahwa mereka tidak menyediakan fungsionalitas yang tidak dapat dicapai melalui fitur yang ada. Sebaliknya, fitur-fitur baru ini memungkinkan sintaksis yang lebih ekspresif dan ringkas untuk digunakan
Seperti yang Anda lihat, anggota yang memiliki ekspresi tubuh memiliki beberapa pintasan yang membuat anggota properti lebih kompak:
- Tidak perlu menggunakan
return
pernyataan karena kompilator dapat menyimpulkan bahwa Anda ingin mengembalikan hasil ekspresi
- Tidak perlu membuat blok pernyataan karena tubuh hanya satu ekspresi
- Tidak perlu menggunakan
get
kata kunci karena tersirat oleh penggunaan sintaks anggota bertubuh ekspresi.
Saya telah membuat poin terakhir dengan berani karena relevan dengan pertanyaan Anda yang sebenarnya, yang akan saya jawab sekarang.
Perbedaan antara...
// expression-bodied member property
public int MaxHealth => x ? y:z;
Dan...
// field with field initializer
public int MaxHealth = x ? y:z;
Apakah sama dengan perbedaan antara ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
Dan...
public int MaxHealth = x ? y:z;
Yang - jika Anda memahami properti - harus jelas.
Hanya untuk menjadi jelas, daftar pertama adalah properti dengan pengambil di bawah kap yang akan dipanggil setiap kali Anda mengaksesnya. Daftar kedua adalah bidang dengan inisialisasi bidang, yang ekspresinya hanya dievaluasi satu kali, ketika jenisnya dipakai.
Perbedaan dalam sintaksis ini sebenarnya cukup halus dan dapat mengarah pada "gotcha" yang dijelaskan oleh Bill Wagner dalam posting berjudul "AC # 6 gotcha: Inisialisasi vs Anggota Ekspresi yang Bertubuh" .
Sementara anggota yang berekspresi adalah ekspresi seperti lambda , mereka bukan ekspresi lambda. Perbedaan mendasar adalah bahwa ekspresi lambda menghasilkan instance delegasi atau pohon ekspresi. Anggota bertubuh ekspresi hanyalah arahan ke kompiler untuk menghasilkan properti di belakang layar. Kesamaan (lebih atau kurang) dimulai dan diakhiri dengan panah ( =>
).
Saya juga akan menambahkan bahwa anggota yang bertubuh ekspresi tidak terbatas pada anggota properti. Mereka mengerjakan semua anggota ini:
- Properti
- Pengindeks
- Metode
- Operator
Ditambahkan dalam C # 7.0
Namun, mereka tidak bekerja pada anggota ini:
- Jenis bersarang
- Acara
- Bidang