สิ่งที่คุณกำลังดูคือสมาชิกที่ มีการแสดงออกไม่ใช่การแสดงออกแลมบ์ดา
เมื่อคอมไพเลอร์พบสมาชิกพร็อพเพอร์ตี้ที่มีแอลกอฮอล์มันจะแปลงมันเป็นทะเยอทะยานเช่นนี้
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(คุณสามารถตรวจสอบสิ่งนี้ได้ด้วยตัวเองโดยปั๊มรหัสลงในเครื่องมือที่ชื่อว่าTryRoslyn )
สมาชิกแสดงออกฉกรรจ์ - ชอบมากที่สุด C # 6 คุณสมบัติ - มีเพียง น้ำตาลประโยค ซึ่งหมายความว่าพวกเขาไม่มีฟังก์ชั่นที่ไม่สามารถทำได้ผ่านคุณสมบัติที่มีอยู่ แต่คุณสมบัติใหม่เหล่านี้ช่วยให้สามารถใช้ไวยากรณ์ที่มีความชัดเจนและกระชับยิ่งขึ้น
อย่างที่คุณเห็นสมาชิกที่มีท่าทางแสดงออกมีทางลัดจำนวนหนึ่งที่ทำให้สมาชิกอสังหาริมทรัพย์มีขนาดกะทัดรัดมากขึ้น:
- ไม่จำเป็นต้องใช้
return
คำสั่งใดเนื่องจากคอมไพเลอร์สามารถอนุมานได้ว่าคุณต้องการส่งคืนผลลัพธ์ของนิพจน์
- ไม่จำเป็นต้องสร้างคำสั่งบล็อกเพราะร่างกายเป็นเพียงการแสดงออกเพียงครั้งเดียว
- ไม่จำเป็นต้องใช้
get
คำหลักเพราะมันจะบอกเป็นนัยโดยการใช้ไวยากรณ์สมาชิกฉกรรจ์
ฉันทำให้จุดสุดท้ายเป็นตัวหนาเพราะเกี่ยวข้องกับคำถามจริงของคุณซึ่งฉันจะตอบตอนนี้
ความแตกต่างระหว่าง...
// expression-bodied member property
public int MaxHealth => x ? y:z;
และ...
// field with field initializer
public int MaxHealth = x ? y:z;
เหมือนกับความแตกต่างระหว่าง ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
และ...
public int MaxHealth = x ? y:z;
ซึ่ง - ถ้าคุณเข้าใจคุณสมบัติ - ควรชัดเจน
เพื่อให้ชัดเจนแม้ว่า: รายชื่อแรกเป็นทรัพย์สินที่มีทะเยอทะยานภายใต้ประทุนที่จะถูกเรียกทุกครั้งที่คุณเข้าถึง รายการที่สองคือฟิลด์ที่มี initializer ฟิลด์ซึ่งนิพจน์จะถูกประเมินเพียงครั้งเดียวเมื่อประเภทถูกสร้างอินสแตนซ์
ความแตกต่างในรูปแบบนี้เป็นจริงที่ลึกซึ้งมากและสามารถนำไปสู่ "gotcha" ซึ่งจะอธิบายโดยบิลแว็กเนอร์ในโพสต์ที่มีชื่อว่า"เอซี # 6 gotcha: การเริ่มต้นกับการแสดงออก Bodied สมาชิก"
ขณะที่สมาชิกแสดงออกฉกรรจ์มีแลมบ์ดา expression- เหมือนพวกเขาจะไม่ได้แสดงออกแลมบ์ดา ความแตกต่างพื้นฐานคือการแสดงออกแลมบ์ดาส่งผลทั้งในกรณีตัวแทนหรือต้นไม้การแสดงออก สมาชิก Expression-bodied เป็นเพียงคำสั่งให้คอมไพเลอร์เพื่อสร้างสถานที่ให้บริการที่อยู่เบื้องหลัง ความคล้ายคลึงกัน (มากหรือน้อย) เริ่มต้นและสิ้นสุดด้วยลูกศร ( =>
)
ฉันจะเพิ่มว่าสมาชิกที่มีการแสดงออกไม่ได้ จำกัด อยู่ที่สมาชิกอสังหาริมทรัพย์เท่านั้น พวกเขาทำงานกับสมาชิกเหล่านี้ทั้งหมด:
- คุณสมบัติ
- indexers
- วิธีการ
- ผู้ประกอบการ
เพิ่มในC # 7.0
อย่างไรก็ตามพวกเขาไม่ได้ทำงานกับสมาชิกเหล่านี้:
- ประเภทซ้อนกัน
- เหตุการณ์ที่เกิดขึ้น
- ทุ่ง