เมื่อใดจึงเหมาะสมที่จะใช้สมาชิกที่มีการแสดงออก [ปิด]


24

C # 6 แนะนำสมาชิกที่มีการแสดงออกซึ่งช่วยให้โค้ดง่ายขึ้นในวิธีการและคุณสมบัติที่ส่งกลับผลลัพธ์ของการแสดงออกเท่านั้น:

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

กลายเป็น:

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

เนื่องจากขณะนี้เรามีไวยากรณ์ที่เทียบเท่าและถูกต้องสองกฎจึงต้องใช้กฎบางข้อเพื่อตัดสินใจว่าจะใช้แบบไหน ทางเลือกใหม่เหมาะสมเมื่อใด


7
อืมเมื่อร่างกายของสมาชิกแสดงออกมา?
Jörg W Mittag

1
ที่จะตอบคำถาม "เมื่อเป็นไปได้ที่จะใช้การแสดงออกสมาชิกฉกรรจ์"
Asik

7
ไม่เกี่ยวข้องอย่างสมบูรณ์ แต่คุณไม่สามารถใช้public override string ToString() => $"{_field1} {_field2}";หรือไม่
Thaoden

3
@JorgWMittag ฉันจะเพิ่ม "... ที่ไม่มีผลข้างเคียง" ลงไป การประกาศเมธอดในสไตล์การทำงานเมื่อไม่ได้ใช้งานอย่างหมดจดอาจทำให้เข้าใจผิด
จูลส์

คำตอบ:


12

ฟังก์ชั่นการเขียนโปรแกรมภาษาประกอบด้วยเพียงการแสดงออกดังนั้นส่วนใหญ่มีคุณสมบัติเช่นนี้ตั้งแต่เริ่มต้น คุณใช้มันเมื่อคุณมีนิพจน์ที่ค่อนข้างสั้นบ่อย ๆ ซ้ำ ๆ ซึ่งสามารถถูกแทนที่ด้วยชื่อที่สั้นกว่าและมีความหมายมากกว่า

ตัวอย่างทั่วไปจะเป็นเพรดิเคตที่ใช้ที่อื่นเช่น:

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

หากการแสดงออกยาวเกินไปจะเป็นการดีกว่าถ้าแยกมันออกเป็นฟังก์ชั่นที่แยกกันหรืออาจจะเป็นหนึ่งฟังก์ชันที่มีผลลัพธ์ระดับกลางที่มีชื่อ ถ้ามันสั้น แต่คุณนึกไม่ออกว่าชื่อดีแค่ไหนคุณก็แค่คัดลอกนิพจน์แทนที่จะสร้างชื่อที่น่ากลัวเหมือนcondition1หรืออะไรซักอย่าง


21

จากC # /. NET Little Wonders: สมาชิก Expression-Bodied ใน C # 6 :

ดังนั้นคุณควรใช้สิ่งนี้? ทุกอย่างมีสไตล์ ความกล้าของฉันคือการจำกัด สิ่งนี้ให้เป็นสำนวนง่าย ๆ และข้อความที่สามารถเข้าใจได้อย่างชัดเจนตั้งแต่แรกเห็น

(เน้นที่เหมือง; ดูอัปเดต 1 ด้านล่าง)

เพิ่มเติมจากบทสรุปของบทความข้างต้น:

ดังนั้นตอนนี้ C # 6 ทำให้เราสามารถระบุคุณสมบัติและเมธอดของ get-only ที่มีนิพจน์ได้ วิธีนี้จะช่วยลดภาระไวยากรณ์ของวิธีการง่ายๆเพื่อให้โค้ดของคุณกระชับยิ่งขึ้น

อย่างไรก็ตามด้วยทุกสิ่งให้ใช้วิจารณญาณของคุณว่าจะเหมาะสมกับสถานการณ์ที่กำหนดหรือไม่ เมื่อนิพจน์นั้นยาวหรือซับซ้อนมากการใช้ไวยากรณ์แบบเต็มอาจยังอ่านได้ง่ายกว่า

และอีกหนึ่งคำพูดเกี่ยวกับประสิทธิภาพการทำงานเนื่องจากปัญหาประสิทธิภาพสามารถเล่นได้เมื่อมันเหมาะสมที่จะใช้คุณสมบัติภาษาบางอย่าง:

ตอนนี้คุณอาจถามว่าสิ่งนี้มีผลกระทบต่อประสิทธิภาพที่รันไทม์หรือไม่? ที่จริงแล้วคำตอบคือไม่มี นี่เป็นเพียงน้ำตาลเชิงประโยคที่ขยายเข้าไปใน IL เดียวกันกับการเขียนทั้งร่าง มันไม่ได้สร้างตัวแทนมันเป็นเพียงการยืมไวยากรณ์การแสดงออกแลมบ์ดาเพื่อลดความซับซ้อนของการเขียนเนื้อหาที่เรียบง่ายซึ่งส่งผลให้เกิดการแสดงออก

(เน้นที่ผู้เขียน)

อัปเดต 1: @ JörgWMittagพูด

มันไม่สมเหตุสมผล "จำกัด สิ่งนี้เป็นนิพจน์และข้อความธรรมดา" หรือไม่ ฮะ? มันไม่ทำงานแม้แต่กับข้อความสั่งเฉพาะกับนิพจน์เท่านั้น!

ดูเหมือนว่าผู้เขียนต้นฉบับอาจมีการสะกดผิด เพื่อชี้แจงจากใหม่และปรับปรุง C # 6.0 :

ฟังก์ชั่น bodied ของนิพจน์เป็นการลดความซับซ้อนของไวยากรณ์ใน C # 6.0 ฟังก์ชั่นเหล่านี้เป็นฟังก์ชั่นที่ไม่มีเนื้อหาคำสั่ง แต่คุณจะใช้มันด้วยนิพจน์หลังจากการประกาศฟังก์ชัน

ต้องมีความชัดเจนนี้ไม่ได้ทำให้วิธีการหรือทรัพย์สินแสดงออก มันใช้ไวยากรณ์ Expression เพื่อลดบรรทัดของรหัส (และจำนวนของเครื่องหมายปีกกา)

คำแนะนำดั้งเดิมของฉันยังคงมีอยู่: ใช้เมื่อมันทำให้โค้ดของคุณชัดเจนและเข้าใจง่ายไม่ใช่เพราะคุณสามารถใช้มันได้


2
มันไม่สมเหตุสมผล "จำกัด สิ่งนี้เป็นนิพจน์และข้อความธรรมดา" หรือไม่ ฮะ? มันไม่ทำงานแม้แต่กับข้อความสั่งเฉพาะกับนิพจน์เท่านั้น! ฉันไม่เชื่อเช่นกันว่าการเพิ่มความยุ่งเหยิง (สองวงเล็บและreturnคำหลัก) สามารถนำไปสู่การอ่านได้มากขึ้น ท้ายที่สุดการแสดงออกที่ซับซ้อนยังคงเป็นการแสดงออกที่ซับซ้อนเหมือนกันเพียงแค่ฝังในความยุ่งเหยิงทางไวยากรณ์
Jörg W Mittag

3
จากสิ่งที่ฉันได้อ่านสมาชิกที่มีร่างกายที่แสดงออกไม่ใช่การแสดงออกจริง พวกมันคือน้ำตาลซินแทคติค เว้นแต่ว่าข้อมูลจำเพาะของ C # จะมีการเปลี่ยนแปลงตั้งแต่การโพสต์บล็อกจะสนับสนุนวิธีการที่มีประเภทการคืนเป็นโมฆะ
Greg Burghardt

1
ฉันอาจผิด แต่ฉันเชื่อว่าผลข้างเคียงไม่ได้รับอนุญาตใน Expression Statement ดังนั้นสำหรับฉันประโยชน์ของคำแถลงการณ์การแสดงออกคือคุณกำลังบอกผู้อ่านว่า "การแสดงออก" นี้บริสุทธิ์และไม่มีผลข้างเคียงใด ๆ ที่ซ่อนอยู่ซึ่งคุณผู้อ่านจำเป็นต้องมองหา
จอห์น

1
@John "ไม่อนุญาต" ผิดอย่างสิ้นเชิง คุณสามารถทำทุกอย่างเช่นสร้างการกระทำภายในการประกาศการตั้งค่าตัวแปรสมาชิกแล้วเรียกการกระทำ ดังนั้นผลข้างเคียงจึงไม่ได้รับอนุญาตอย่างชัดเจน ฉันอยากจะกีดกันพวกเขาอย่างแน่นอนพวกเขาพลาดจุดสำคัญในการแสดงออก
Mafii

@Mafii ขอบคุณ ฉันได้เรียนรู้มาตั้งแต่นั้นแล้วว่าคุณสามารถทำ "คำสั่งการแสดงออก" ซึ่งถูกอธิบายว่าเป็น "ทันสมัย" อย่างไรก็ตามสำหรับฉันแล้วความคิดอย่างมากก็แค่ทำให้เกิดความสับสน
John
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.