คำถามติดแท็ก anonymous-methods

4
มีเหตุผลสำหรับการใช้ตัวแปร C # ซ้ำใน foreach หรือไม่?
เมื่อใช้แลมบ์ดานิพจน์หรือวิธีที่ไม่ระบุตัวตนใน C # เราต้องระวังการเข้าถึงหลุมพรางปิดที่มีการแก้ไข ตัวอย่างเช่น: foreach (var s in strings) { query = query.Where(i => i.Prop == s); // access to modified closure ... } เนื่องจากการปิดการปรับเปลี่ยนรหัสดังกล่าวข้างต้นจะทำให้ทั้งหมดของคำสั่งในการค้นหาให้เป็นไปตามค่าสุดท้ายของWheres ดังที่อธิบายไว้ที่นี่สิ่งนี้เกิดขึ้นเพราะsตัวแปรที่ประกาศในforeachลูปด้านบนถูกแปลเช่นนี้ในคอมไพเลอร์: string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... } แทนที่จะเป็นเช่นนี้: while (enumerator.MoveNext()) { string s; s = enumerator.Current; ... } ดังที่กล่าวไว้ที่นี่ไม่มีข้อได้เปรียบด้านประสิทธิภาพในการประกาศตัวแปรภายนอกลูปและภายใต้สถานการณ์ปกติเหตุผลเดียวที่ฉันคิดได้สำหรับการทำเช่นนี้คือถ้าคุณวางแผนที่จะใช้ตัวแปรนอกขอบเขตของลูป: string …

11
ยกเลิกการสมัครสมาชิกแบบไม่ระบุชื่อใน C #
เป็นไปได้ไหมที่จะยกเลิกการสมัครสมาชิกโดยไม่ระบุชื่อจากกิจกรรม? ถ้าฉันสมัครสมาชิกกิจกรรมเช่นนี้: void MyMethod() { Console.WriteLine("I did it!"); } MyEvent += MyMethod; ฉันสามารถยกเลิกการสมัครสมาชิกเช่นนี้: MyEvent -= MyMethod; แต่ถ้าฉันสมัครโดยใช้วิธีไม่ระบุชื่อ: MyEvent += delegate(){Console.WriteLine("I did it!");}; เป็นไปได้ไหมที่จะยกเลิกการสมัครสมาชิกโดยไม่ระบุชื่อ ถ้าเป็นเช่นนั้นได้อย่างไร


8
วิธีไม่ระบุชื่อในการเรียกใช้
มีปัญหาเล็กน้อยกับไวยากรณ์ที่เราต้องการเรียกผู้รับมอบสิทธิ์โดยไม่ระบุชื่อภายใน Control.Invoke เราได้ลองใช้วิธีการที่แตกต่างกันมากมายซึ่งไม่เป็นประโยชน์ ตัวอย่างเช่น: myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); }); โดยที่ someParameter เป็นโลคัลสำหรับเมธอดนี้ ด้านบนจะส่งผลให้เกิดข้อผิดพลาดของคอมไพเลอร์: ไม่สามารถแปลงวิธีที่ไม่ระบุชื่อให้พิมพ์ 'System.Delegate' เนื่องจากไม่ใช่ประเภทผู้รับมอบสิทธิ์

5
ใน C # เหตุใดวิธีการที่ไม่ระบุชื่อจึงไม่มีคำสั่งผลตอบแทน
ฉันคิดว่ามันจะดีถ้าทำอะไรแบบนี้ (โดยที่แลมด้าให้ผลตอบแทน): public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() { IList<T> list = GetList<T>(); var fun = expression.Compile(); var items = () => { foreach (var item in list) if (fun.Invoke(item)) yield return item; // This is not allowed by C# } return items.ToList(); } อย่างไรก็ตามฉันพบว่าฉันไม่สามารถใช้ผลตอบแทนในวิธีที่ไม่ระบุตัวตนได้ ฉันสงสัยว่าทำไม …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.