รับรายการรหัสอ้างอิงศูนย์ใน Visual Studio


133

ในสตูดิโอภาพ 2013 จำนวนการอ้างอิงของรหัสพิเศษ (วิธีคุณสมบัติฟิลด์, ... ) แสดงโดยรหัสเลนส์ ฉันต้องการรับรหัสที่ไม่ได้ใช้(การอ้างอิงเป็นศูนย์)ใน Visual Studio มีวิธีใดบ้างที่จะได้รับพวกเขา?

ฉันหมายถึงการอ้างอิงด้านล่าง:

ป้อนคำอธิบายภาพที่นี่


7
ฉันคิดว่าเขาต้องการรายการของวิธีการทั้งหมดที่ไม่ได้อ้างอิงมากกว่าที่จะทำให้จำนวนการอ้างอิงของวิธีการนั้นเป็นศูนย์
Jurgen Camilleri

1
หากคุณไม่ต้องการที่จะพบการอ้างอิงที่ไม่ได้ใช้คุณจะพบมากของคำถามที่ซ้ำกัน เพียง Google สำหรับ "c # find unused code"
Panagiotis Kanavos

1
ใช่ฉันต้องการค้นหารหัสที่ไม่ได้ใช้ทั้งหมดประกอบด้วยวิธีการคุณสมบัติ ฯลฯ
Nima Rostami

1
โปรดจำไว้ว่าคุณไม่สามารถมั่นใจได้ว่า a publicไม่ได้ใช้งานโดยไม่ต้องค้นหาฐานรหัสทั้งหมด อย่างไรก็ตามสำหรับการใช้งานภายในและส่วนบุคคลที่ไม่ได้ใช้การวิเคราะห์โค้ดจะเตือนคุณหากคุณเปิดใช้งานคำเตือนที่เหมาะสม
Matthew Watson

2
หลายปีต่อมาภาพหน้าจอยังคงทำให้เข้าใจผิด
สินจั

คำตอบ:


184

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

ด้วยเหตุนี้ฉันจึงสร้างไฟล์ชุดกฎการวิเคราะห์รหัสใหม่ (ผ่านไฟล์ -> ใหม่ -> ไฟล์ตรวจสอบให้แน่ใจว่าได้เลือกทั่วไปในบานหน้าต่างด้านซ้ายแล้วและเลื่อนลงเพื่อค้นหาชุดกฎการวิเคราะห์โค้ดตั้งชื่อไฟล์จากนั้นค้นหาและ เลือกกฎด้านล่าง) ดูเนื้อหาของไฟล์ ruleset ด้านล่างที่คุณสามารถคัดลอกและวางลงในไฟล์ใหม่ที่มีนามสกุล. ruleset เพื่อใช้

ได้รับไฟล์ ruleset หนึ่งสามารถคลิกขวาบนไฟล์โครงการในExplorer โซลูชันแผงและเลือกProperties ในหน้าต่างคุณสมบัติของโปรเจ็กต์ให้คลิกที่แท็บการวิเคราะห์โค้ดในแผงด้านซ้ายจากนั้นคลิกเปิดเพื่อเรียกดูตำแหน่งของไฟล์. ruleset หากคุณไปที่คุณสมบัติของไฟล์โซลูชัน (ตรงข้ามกับไฟล์โปรเจ็กต์) คุณสามารถตั้งค่าไฟล์การวิเคราะห์โค้ดสำหรับแต่ละโปรเจ็กต์ในโซลูชันได้ในที่เดียว (ภายใต้การตั้งค่าการวิเคราะห์โค้ดและใช้เมนูแบบเลื่อนลงเพื่อเลือก ไฟล์ ruleset หมายเหตุ: ก่อนหน้านี้คุณต้องเคยเรียกดูไฟล์ชุดกฎเพื่อให้ไฟล์นี้ปรากฏในเมนูแบบเลื่อนลงในหน้าต่างคุณสมบัตินี้)

จากนั้นคุณเพียงแค่เรียกใช้การวิเคราะห์โค้ดในโครงการ / โซลูชัน (ผ่านการวิเคราะห์ - > เรียกใช้การวิเคราะห์โค้ดบนโซลูชัน -OR- Alt + F11 ) และจะกลับมาเป็นคำเตือนวิธีการใด ๆ ที่ไม่ได้อ้างอิงหรือสมาชิกที่ไม่ได้ใช้ที่พบ มันจะพบวิธีการที่อ้างอิงโดยวิธีการที่ตัวเองไม่มีการอ้างอิงที่อื่น

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

กฎในการตรวจจับรหัสตายโดยเฉพาะ ได้แก่ :

  • เมธอดส่วนตัวที่ไม่ได้เรียกใช้จากรหัสอื่น (CA1811)
  • ตัวแปรท้องถิ่นที่ไม่ได้ใช้ (CA1804)
  • ช่องส่วนตัวที่ไม่ได้ใช้ (CA1823)
  • พารามิเตอร์ที่ไม่ได้ใช้ (CA1801)
  • คลาสภายในที่ไม่ได้สร้างอินสแตนซ์จากโค้ดอื่น ๆ (CA1812)
  • รหัสตายในสวิตช์แบบบิตหรือ จำกัด (C6259)

ด้านล่างนี้คือเนื้อหาของไฟล์. ruleset ที่สามารถมีได้โดยทำตามขั้นตอนด้านบนเพื่อความสะดวกของคุณ คุณสามารถคัดลอก XML ด้านล่างวางลงใน notepad ++ บันทึกที่ใดที่หนึ่งด้วยนามสกุล. rulesetเรียกดูและใช้ตามที่อธิบายไว้ข้างต้น:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Dead Code Rules" Description=" " ToolsVersion="12.0">
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1801" Action="Warning" />
    <Rule Id="CA1804" Action="Warning" />
    <Rule Id="CA1811" Action="Warning" />
    <Rule Id="CA1812" Action="Warning" />
    <Rule Id="CA1823" Action="Warning" />
  </Rules>
  <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
    <Rule Id="C6259" Action="Warning" />
  </Rules>
</RuleSet>

30
ฉันไม่คิดว่าสิ่งนี้จะตอบคำถามได้อย่างสมบูรณ์ ข้อแตกต่างที่สำคัญคือ CodeLens จะบอกคุณว่าวิธีการแบบ PUBLIC ไม่มีการอ้างอิงในโซลูชันทั้งหมด นี่คือกุญแจสำคัญ FxCop, R # และวิธีการของคุณสำหรับสิ่งที่ไม่เปิดเผยต่อสาธารณะ
Scott Wylie

1
@ScottWylie - ฉันไม่เห็นด้วย ฉันเพิ่งลองวิธีแก้ปัญหาข้างต้นและไม่ได้ตั้งค่าสถานะวิธีการสาธารณะที่ไม่ได้อ้างอิง CodeLens นั้นยอดเยี่ยมในการตั้งค่าสถานะรหัสตายสิ่งที่ไม่ได้อ้างอิงในเครื่องและตัวแปรที่ไม่ได้ใช้ ฉันคิดว่าสิ่งนี้ทำให้คนส่วนใหญ่ได้รับสิ่งที่พวกเขาต้องการโดยไม่ใช้เครื่องมือของบุคคลที่สาม
ไมค์

7
@mike พิจารณาสิ่งนี้: หากคุณต้องการค้นหารหัสที่ตายแล้วด้วยการดำเนินการจำนวนมากคุณมักจะไม่สนใจเกี่ยวกับสมาชิกส่วนตัว / ที่ได้รับการคุ้มครองเนื่องจากเป็นปัญหาในท้องถิ่น ตัวอย่างเช่นฉันกำลังโอนย้ายโปรเจ็กต์ 500k + LoC ที่มีโปรเจ็กต์มากกว่า 100 โปรเจ็กต์และโซลูชัน 10+ ไปยังสถาปัตยกรรมรูปแบบที่เก็บข้อมูล หลังจากย้ายคอมโพเนนต์ฉันต้องการทราบว่าอินเทอร์เฟซเก่าใดที่ฉันสามารถลบได้ IDE บางตัวเช่น Eclipse มีเครื่องมือสำหรับสิ่งนั้น วิธีการเฉพาะที่เป็นสีเทาไม่ใช่เรื่องง่ายของฉันฉันต้องการรายชื่อคลาส / อินเทอร์เฟซของ PUBLIC ที่เลนส์โค้ดบอกฉันว่า "0"
Oliver Schimmer

0

ต่อไปนี้เป็นวิธีด้วยตนเองในการทำสิ่งนี้ให้สำเร็จซึ่งฉันเคยใช้ในการค้นหาชั้นเรียนที่ไม่ได้ใช้ซึ่งทำเครื่องหมายเป็นสาธารณะ

  1. ค้นหาและแทนที่ "คลาสสาธารณะ" ทั้งหมดด้วย "คลาสส่วนตัว" สำหรับโปรเจ็กต์เดียวในโซลูชันของคุณ อาจต้องแทนที่ "คลาสคงที่สาธารณะ" และ / หรือ "คลาสนามธรรมสาธารณะ"
  2. สร้างเพื่อค้นหาข้อผิดพลาดทั้งหมด
  3. สำหรับข้อผิดพลาดแต่ละรายการในบิลด์ให้ใช้ซอร์สคอนโทรลของคุณเพื่อกู้คืนไฟล์สำหรับคลาสที่อ้างอิง
  4. ทำซ้ำทุกข้อผิดพลาดจนกว่าการสร้างจะสำเร็จ
  5. ไฟล์ที่เหลือที่ไม่ได้รับการกู้คืนมีแนวโน้มที่จะถูกลบ
  6. (ไม่บังคับ) เปลี่ยนชื่อคลาสในไฟล์ด้านบนและทำอีกหนึ่งบิลด์เพื่อค้นหาข้อผิดพลาด
  7. ทำการค้นหาชื่อคลาสที่คุณต้องการลบเป็นครั้งสุดท้ายเพื่อยืนยันว่าไม่มีอินสแตนซ์ใด ๆ ที่ใช้ในการสะท้อนหรือสายเวทย์มนตร์
  8. ลบไฟล์คลาสที่ไม่ได้ใช้ที่ระบุ
  9. ทำซ้ำสำหรับแต่ละโครงการโซลูชันที่คุณต้องการทำความสะอาด

หมายเหตุ: หากคุณไม่ปฏิบัติตามหนึ่งคลาสต่อกฎไฟล์สิ่งนี้จะต้องทำงานมากขึ้น นอกจากนี้จุดสิ้นสุดบริการ API ใด ๆ ที่คุณจะต้องตรวจสอบว่าไม่มีการใช้งานโดยโครงการภายนอกใด ๆ


14
สิ่งนี้ไม่ได้เป็นประโยชน์เลย
Don Rolling

1
มันใช้ได้กับฉันในโครงการขนาดใหญ่และเป็นทางออกหนึ่ง กรณีอาจแตกต่างกันไปที่ที่ยากกว่า แต่ฉันต้องการให้สิ่งนี้เป็นไปได้
Ulfius

0

https://scottlilly.com/c-code-quality-improvement/remove-unused-classes-properties-and-functions/

"น่าเสียดายที่ [ใน Visual Studio Analysis] คุณสามารถตรวจจับได้เฉพาะสมาชิกส่วนตัวที่ไม่ได้ใช้เท่านั้นเนื่องจากโปรแกรมวิเคราะห์โค้ดถือว่าโปรแกรมอื่นอาจใช้สมาชิกสาธารณะซึ่งอาจเป็นจริงหากคุณเผยแพร่เป็น API ผ่านบริการเว็บ หรือปล่อยรหัสของคุณเป็นไลบรารี ... ReSharper มีฟังก์ชันการวิเคราะห์โค้ดที่คล้ายกัน - ด้วยข้อดีของการตรวจสอบสมาชิกสาธารณะที่ไม่ได้ใช้ "


0

ฉันจะดูแต่ละไฟล์ทำคำสั่ง Ctrl-MO เพื่อยุบทุกอย่างจากนั้นเลื่อนไปรอบ ๆ เพื่อค้นหาการอ้างอิง 0

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