ฉันจะกำจัดคำเตือนคอมไพเลอร์“ [บางเหตุการณ์] ไม่เคยใช้” ใน Visual Studio ได้อย่างไร


93

ตัวอย่างเช่นฉันได้รับคำเตือนของคอมไพเลอร์นี้

ไม่เคยใช้เหตุการณ์ 'Company.SomeControl.SearchClick'

แต่ฉันรู้ว่ามันถูกใช้เพราะการแสดงความคิดเห็นมันทำให้ฉันเหมือน 20 คำเตือนใหม่ของหน้า XAML ที่พยายามใช้เหตุการณ์นี้!

สิ่งที่ช่วยให้? มีเคล็ดลับในการกำจัดคำเตือนนี้หรือไม่?


1
คุณช่วยโพสต์ตัวอย่างได้ไหม
John Saunders

คำตอบ:


145

สิ่งนี้ดูเหมือนจะเป็นการเตือน 67และสามารถระงับได้ด้วย:

#pragma warning disable 67

อย่าลืมเรียกคืนโดยเร็วที่สุด (หลังจากประกาศเหตุการณ์) ด้วย:

#pragma warning restore 67

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

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

คำตอบที่ถูกต้องคือต้องชัดเจนเกี่ยวกับสิ่งที่คุณคาดหวังจากเหตุการณ์ซึ่งในกรณีนี้คืออะไร:

public event EventHandler Unimportant
{
    add { }
    remove { }
}

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

public event EventHandler Unsupported
{
    add { throw new NotSupportedException(); }
    remove { }
}

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


นั่นคือสิ่งที่ฉันต้องการ! ขอบคุณ! ข้อแตกต่างเพียงอย่างเดียวคือฉันเพิ่มความคิดเห็นของตัวเองข้าง 67 เพื่อให้ฉันรู้ว่ามันคืออะไรในอนาคต นี่คือสิ่งที่ "ตรง" ที่ฉันพิมพ์ ... #pragma คำเตือนปิดการใช้งาน 67 // เหตุการณ์ไม่เคยใช้เหตุการณ์สาธารณะ RoutedEventHandler SearchClick; #pragma คำเตือนคืนค่า 67
jedmao

12
นั่นเป็นลิงค์ที่ดี ขอบคุณ.
Max Palmer

สิ่งนี้มีประโยชน์ จะไม่อยู่ในสถานที่ แต่เป็นเพียงบางสิ่งบางอย่างเพื่อให้ความคิดปัจจุบันทำงาน ...
dudeNumber4

78

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

public event EventHandler CanExecuteChanged { add{} remove{} }

ถ้าฉันทำเช่นนี้จะมีข้อความในไฟล์ที่ฉันทำในภายหลังif(OnCompleteOpenEvent != null) OnCompleteOpenEvent();ว่า "OnCompleteEvent ไม่มีในบริบทปัจจุบัน"
Almo

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

มันนานเกินไป แต่เราได้รับข้อผิดพลาดนี้แม้ว่าจะมีการใช้งานอยู่ก็ตาม มีบางอย่างที่เกี่ยวข้องกับการกำหนดวิธีที่ทำให้คอมไพเลอร์หลอกให้คิดว่ามันไม่ได้ใช้
Almo

ขอบคุณมากสำหรับวิธีแก้ปัญหาง่ายๆสำหรับสถานการณ์ที่น่าสยดสยอง!
M463

16

วิธีที่ดีที่สุดประการที่สองคือ imho ต้องระบุให้ชัดเจนว่ากิจกรรมไม่ได้รับการสนับสนุนโดยการยกเว้นหากมีคนพยายามสมัครรับข้อมูล

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { throw new NotSupportedException(); }
}

เนื่องจากตัวแปรนี้คุณสามารถปล่อยaddและremoveวิธีการว่างไว้เพื่อเพิกเฉยต่อการสมัครสมาชิกในกิจกรรม

ทางออกที่ดีที่สุดคือการ refactor โค้ดโดยอาจดึงการประกาศของเหตุการณ์ไปยังผู้ดำเนินการหากเป็นไปได้

เป็นทางเลือกสุดท้ายคุณสามารถปิดการใช้งานคำเตือนเช่นนี้ได้

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67

ฉันไม่เห็นว่าที่นี่เกี่ยวข้องกับวัตถุว่างอย่างไร
vidstige

ฉันรู้ว่าวัตถุว่างคืออะไรและกรณีการใช้งานนี้ครอบคลุมในย่อหน้าสุดท้าย โปรดอ่านคำตอบทั้งหมดอย่างละเอียด
vidstige

ฉันรู้ว่าวัตถุว่างคืออะไร ฉันเชื่อว่ากรณีการใช้งานนี้ครอบคลุมในย่อหน้าสุดท้ายของฉัน
vidstige


1

เห็นได้ชัดว่าคอมไพเลอร์ไม่ทราบว่ามีการใช้งานในโค้ด XAML ลองระงับคำเตือนในนิยามเหตุการณ์ของคุณ

ตรวจสอบให้แน่ใจว่าคุณกำลังจัดงานอยู่ที่ไหนสักแห่ง


นั่นคือสิ่งที่ฉันคิดเช่นกันดังนั้นฉันจึงย้ายรหัส XAML ไปที่โค้ดด้านหลังและมันก็แสดงคำเตือนแบบเดียวกัน! และใช่ฉันแน่ใจ 100% ว่าเหตุการณ์นี้กำลังเกิดขึ้นที่ไหนสักแห่ง ฉันกำลังมองหามัน มีสายเข้ากับปุ่ม
jedmao

1

คุณสามารถระงับคำเตือนแต่ละรายการได้

\Program.cs(13,20): warning CS0219: The variable 'foo' is assigned but its value is never used

ในกรณีนี้ CS0219 คือคำเตือนเกี่ยวกับตัวแปรที่กำหนด แต่ไม่ได้ใช้ คุณสามารถใช้แฟล็ก / nowarn: 0219 หรือเพิ่มหมายเลขข้อผิดพลาดในบานหน้าต่างคุณสมบัติสำหรับโปรเจ็กต์ (ภายใต้ "Build" อย่าลืมลบ CS ที่นำหน้าออก) จำคำเตือนทั้งหมดของคลาสนี้


1

หรือคุณสามารถเพิ่มลง<NoWarn>67</NoWarn>ในโครงการของคุณ

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>

9
การดำเนินการนี้จะปิดใช้งานคำเตือนในโปรเจ็กต์ทั้งหมดที่อาจซ่อนปัญหาจริงกับเหตุการณ์ที่ไม่ได้ใช้
vidstige
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.