แลมบ์ดาแสดงออกเช่น_=> expr
หมายถึงอะไร?
จุดประสงค์ของการ_
ป้อนข้อมูลไปยังแลมบ์ดาคืออะไร?
ตัวอย่าง:
int count = 0;
list.ForEach(_ => count += 1);
list
เป็นIEnumerable<T>
พวกเขาสามารถ(และควร)เพิ่งใช้sum = list.Count();
แลมบ์ดาแสดงออกเช่น_=> expr
หมายถึงอะไร?
จุดประสงค์ของการ_
ป้อนข้อมูลไปยังแลมบ์ดาคืออะไร?
ตัวอย่าง:
int count = 0;
list.ForEach(_ => count += 1);
list
เป็นIEnumerable<T>
พวกเขาสามารถ(และควร)เพิ่งใช้sum = list.Count();
คำตอบ:
นั่นคือหลักการที่ใช้เมื่อคุณไม่สนใจพารามิเตอร์
_
เป็นอักขระตัวแทนในการจับคู่รูปแบบ มันเป็นพื้นหมายความว่า "ฉันไม่สนใจฉันเสมออยากให้เรื่องนี้ตรงกับ" จากนั้น "ฉันไม่สนใจ" นี้จะถูกนำไปใช้เมื่อพูดถึงการตั้งชื่อสิ่งที่คุณไม่สนใจและจากนั้นมันก็แพร่กระจายไปยังภาษาโปรแกรมอื่น ๆ ตัวอย่างเช่นใช้ใน Ruby เพื่อหมายถึงสิ่งเดียวกันกับในตัวอย่างนี้แม้ว่าจะ_
ไม่มีความสำคัญเป็นพิเศษใน Ruby ก็ตาม
เป็นชื่อพารามิเตอร์แม้ว่าจะไม่ใช่ชื่อที่มีประโยชน์ แต่เป็นชื่อที่มักใช้ (ตามข้อตกลงบางประการ) เมื่อคุณต้องการระบุว่านิพจน์มีพารามิเตอร์เพื่อรับโค้ดไปคอมไพล์ แต่คุณไม่สนใจจริงๆ เกี่ยวกับเรื่องนี้ดังนั้นคุณจะเพิกเฉยต่อมัน
โดยพื้นฐานแล้วเป็นการใช้ประโยชน์จากไวยากรณ์สำหรับสิ่งที่ตัวระบุทางกฎหมายใน C # ประกอบขึ้นและเนื่องจากตัวระบุสามารถเริ่มต้นด้วยขีดล่างและไม่มีสิ่งอื่นใดจึงเป็นเพียงชื่อพารามิเตอร์
คุณสามารถเขียนได้ง่ายๆ:
var _ = 10;
Thread t= new Thread(()=>doSomething(x,y)); t.start();
_
เป็นชื่อตัวแปรที่ถูกต้อง พวกเขาแค่ใช้_
เป็นตัวแปร
เนื่องจากนิพจน์ lamda ส่วนใหญ่จะใช้ในรหัสสั้น ๆ ที่ไม่ระบุตัวตนดังนั้นบางครั้งชื่อของตัวแปรจึงไม่จำเป็นแม้ว่าจะไม่ได้ใช้ตัวแปรในบล็อกโค้ดก็ตามดังนั้นพวกเขาจึงให้ _ เป็นรูปแบบสั้น ๆ
ฉันยังใช้_ => _.method()
lambdas หนึ่งบรรทัดเพื่อเรียกวิธีการเป็นครั้งที่สองเนื่องจากจะช่วยลดน้ำหนักการรับรู้ของคำสั่ง โดยเฉพาะอย่างยิ่งเมื่อใช้ generics การเขียนx => x.method()
จะเพิ่มการพิจารณาเสี้ยววินาทีว่า "นี่คืออะไร" x "คือพิกัดในอวกาศหรือไม่"
พิจารณากรณีต่อไปนี้:
Initialize<Client> ( _=>_.Init() );
ใช้กับการเรียก Generics ขีดล่างในกรณีนี้จะทำงานเป็น "สัญลักษณ์บายพาส" หลีกเลี่ยงความซ้ำซ้อนโดยกำหนดว่าประเภทของอาร์กิวเมนต์นั้นชัดเจนและสามารถอนุมานได้จากการใช้งานเช่นเดียวกับเมื่อคุณใช้ 'var' เพื่อป้องกันการประกาศประเภทซ้ำ การเขียนclient=>client.Init()
ที่นี่จะทำให้คำสั่งยาวขึ้นโดยไม่ต้องเพิ่มความหมายใด ๆ
เห็นได้ชัดว่าสิ่งนี้ไม่ได้ใช้กับพารามิเตอร์ที่จะส่งผ่านไปยังเมธอดซึ่งควรตั้งชื่อตามคำอธิบาย เช่น.:Do( id=>Log(id) );
การใช้พารามิเตอร์ขีดล่างเดียวสำหรับการเรียกเมธอดนั้นแทบจะไม่สมเหตุสมผลเมื่อใช้บล็อกของโค้ดแทนซับเดียวเนื่องจากตัวระบุแลมบ์ดาถูกตัดการเชื่อมต่อจากนิยามทั่วไป โดยทั่วไปเมื่อต้องใช้ตัวระบุเดียวกันซ้ำให้ตั้งชื่อที่สื่อความหมาย
บรรทัดล่างคือการใช้คำฟุ่มเฟือยเป็นสิ่งที่สมเหตุสมผลสำหรับการลดความสับสนโดยเฉพาะอย่างยิ่งสำหรับ lambdas ซึ่งสร้างขึ้นเพื่อลดความซับซ้อนของการสร้างผู้รับมอบสิทธิ์ที่ไม่ระบุตัวตนในตอนแรก ไม่ว่าในกรณีใดควรใช้สามัญสำนึกโดยให้สมดุลกับความชัดเจนและความกระชับ หากสัญลักษณ์เป็นเพียง "ตะขอ" สำหรับการทำงานจริงตัวระบุอักขระหนึ่งตัวก็ใช้ได้ดี นั่นคือกรณีที่มี For-loops และตัวอักษร "i" และ "j" เป็นตัวสร้างดัชนี
Do(id => Log(id))
Do(Log)
ย่อที่ดีกว่า