Kapan pantas menggunakan anggota bertubuh ekspresi? [Tutup]


24

C # 6 memperkenalkan anggota bertubuh ekspresi, yang memungkinkan kode disederhanakan dalam metode dan properti yang hanya mengembalikan hasil ekspresi:

public override string ToString()
{
     return string.Format("{0} {1}", _field1, _field2);
}

menjadi:

public override string ToString() =>
    string.Format("{0} {1}", _field1, _field2);

Karena kita sekarang memiliki dua sintaks yang persis sama dan valid, beberapa aturan praktis harus digunakan untuk memutuskan mana yang akan digunakan. Kapan alternatif baru sesuai?


7
Umm, kapan tubuh anggota adalah ekspresi?
Jörg W Mittag

1
Itu akan menjawab pertanyaan "kapan mungkin menggunakan ekspresi anggota bertubuh".
Asik

7
Tidak sepenuhnya terkait, tetapi tidak dapat Anda gunakan public override string ToString() => $"{_field1} {_field2}";?
Thaoden

3
@ JorgWMittag saya akan menambahkan "... itu tidak memiliki efek samping" untuk itu. Mendeklarasikan suatu metode dengan gaya fungsional ketika itu tidak sepenuhnya fungsional akan menyesatkan.
Jules

Jawaban:


12

Bahasa pemrograman fungsional hanya terdiri dari ekspresi, sehingga sebagian besar memiliki fitur seperti ini dari dasarnya. Anda menggunakannya ketika Anda memiliki ekspresi yang relatif pendek, sering sering diulang, yang dapat diganti dengan nama yang lebih pendek, lebih bermakna.

Contoh umum adalah predikat yang digunakan di tempat lain, seperti:

public static bool isOdd(int num) => (num % 2) == 1;

Jika ekspresi terlalu panjang, lebih baik membaginya menjadi fungsi yang terpisah atau mungkin satu fungsi dengan nama hasil antara. Jika pendek, tetapi Anda tidak dapat memikirkan nama yang bagus, Anda lebih baik menyalin ekspresi daripada membuat nama yang burukcondition1 atau sesuatu.


21

Dari C # /. NET Little Wonders: Anggota Berekspresi di C # 6 :

Jadi, haruskah Anda menggunakan ini? Semuanya bermuara pada gaya. Naluri saya adalah membatasi ini hanya pada ekspresi dan pernyataan sederhana yang dapat dipahami dengan jelas pada pandangan pertama.

(Penekanan, milikku; lihat Pembaruan 1 di bawah)

Lebih banyak dari Ringkasan artikel di atas:

Jadi C # 6 sekarang memberi kita kemampuan untuk menentukan properti get-only dan metode body dengan ekspresi. Ini dapat membantu mengurangi beban sintaksis dari metode yang sangat sederhana untuk membuat kode Anda lebih ringkas.

Namun, dengan semua hal, gunakan penilaian Anda apakah cocok untuk situasi tertentu. Ketika sebuah ekspresi sangat panjang atau kompleks, menggunakan sintaksis seluruh tubuh mungkin masih lebih mudah dibaca.

Dan kutipan lain tentang kinerja, karena masalah kinerja juga dapat berperan ketika layak untuk menggunakan fitur bahasa tertentu:

Sekarang, Anda mungkin bertanya, apakah ini memiliki implikasi kinerja pada saat runtime? Sebenarnya, jawabannya adalah tidak . Ini hanyalah gula sintaksis yang mengembang menjadi IL yang sama dengan menulis seluruh tubuh. Itu tidak membuat delegasi, itu hanya meminjam sintaks ekspresi lambda untuk menyederhanakan penulisan badan sederhana yang menghasilkan ekspresi.

(penekanan, penulis)

Pembaruan 1: @JörgWMittag berkata

Ini tidak masuk akal. "batasi ini untuk ekspresi dan pernyataan sederhana"? Hah? Bahkan tidak bekerja dengan pernyataan, hanya dengan ekspresi!

Tampaknya penulis asli mungkin salah mengeja. Untuk memperjelas, dari The New dan Improved C # 6.0 :

Fungsi ekspresi tubuh adalah penyederhanaan sintaksis lain dalam C # 6.0. Ini adalah fungsi tanpa badan pernyataan. Sebagai gantinya, Anda menerapkannya dengan ekspresi mengikuti deklarasi fungsi.

Agar jelas, ini tidak membuat metode atau properti Ekspresi . Ini menggunakan sintaks Expression untuk mengurangi baris kode (dan jumlah kurung kurawal).

Rekomendasi asli saya masih berlaku: Gunakan ketika kode Anda jelas dan lebih mudah dipahami, bukan hanya karena Anda dapat menggunakannya.


2
Ini tidak masuk akal. "batasi ini untuk ekspresi dan pernyataan sederhana "? Hah? Bahkan tidak bekerja dengan pernyataan, hanya dengan ekspresi! Saya juga tidak yakin bahwa menambahkan kekacauan (dua tanda kurung dan returnkata kunci) dapat membuat lebih mudah dibaca. Bagaimanapun, ekspresi kompleks masih merupakan ekspresi kompleks yang sama persis, hanya terkubur dalam kekacauan sintaksis.
Jörg W Mittag

3
Dari apa yang saya baca ekspresi anggota tubuh sebenarnya bukan ekspresi. Mereka adalah gula sintaksis. Kecuali jika spesifikasi C # telah berubah sejak posting blog, ia mendukung metode dengan tipe pengembalian yang tidak berlaku.
Greg Burghardt

1
Saya bisa saja salah, tetapi saya percaya bahwa efek samping tidak diperbolehkan dalam Pernyataan Ekspresi. Jadi bagi saya, manfaat dari pernyataan ekspresi adalah bahwa Anda memberi tahu pembaca bahwa "ungkapan" ini murni dan bahwa tidak ada efek samping tersembunyi yang perlu dicari oleh Anda, pembaca.
John

1
@ John "dilarang" sama sekali salah. Anda dapat melakukan semua shenanigans seperti membuat tindakan, di dalam deklarasi tindakan set variabel anggota dan kemudian jalankan tindakan. Oleh karena itu, efek samping jelas tidak dianulir. Saya pasti akan mengecilkan hati mereka tho, mereka kehilangan titik sintaks ekspresi.
Mafii

@Mafii. Terima kasih. Saya telah belajar bahwa Anda dapat melakukan "pernyataan ekspresi", yang digambarkan sebagai "modern". Bagi saya, ide itu sangat membingungkan.
John
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.