ทำไมคุณควรลบ C # ที่ไม่จำเป็นโดยใช้คำสั่ง?


216

ตัวอย่างเช่นฉันไม่ค่อยต้องการ:

using System.Text;

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

นอกจากนี้มันจะสร้างความแตกต่างใด ๆ หรือไม่หากใช้ directive เดียวกันในไฟล์เดียวเทียบกับไฟล์ส่วนใหญ่ / ทั้งหมด?


แก้ไข: โปรดทราบว่าคำถามนี้ไม่ได้เกี่ยวกับแนวคิดที่ไม่เกี่ยวข้องที่เรียกว่าคำสั่งการใช้ซึ่งออกแบบมาเพื่อช่วยจัดการทรัพยากรโดยการทำให้แน่ใจว่าเมื่อวัตถุออกนอกขอบเขตIDisposable.Disposeจะเรียกวิธีการนั้น ดูการใช้ "ใช้" ใน C #

คำตอบ:


181

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

ส่วนใหญ่เป็นเพียงการทำความสะอาดสำหรับการตั้งค่าส่วนตัว


@francip - นั่นคือสิ่งที่ฉันพูด การใช้ไม่ส่งผลต่อการโหลดแอสเซมบลีแอสเซมบลีจะไม่โหลดจนกว่าจะมีการอ้างอิงชนิดที่มีอยู่ในแอสเซมบลี
Darren Kopp

69
แต่มันอาจส่งผลต่อเวลาในการรวบรวมและการตอบสนองของ Intellisense / IDE
Marchy


475

มีอยู่ไม่กี่เหตุผลที่ไม่ได้ใช้สำหรับการลบโดยใช้ (s) / namespaces นอกเหนือจากการตั้งค่าการเข้ารหัส:

  • การลบส่วนที่ไม่ได้ใช้โดยใช้ส่วนคำสั่งในโครงการสามารถทำให้การรวบรวมเร็วขึ้นเนื่องจากคอมไพเลอร์มีเนมสเปซน้อยลงสำหรับประเภทการค้นหาเพื่อแก้ไข (นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับ C # 3.0 เนื่องจากวิธีการขยายที่คอมไพเลอร์ต้องค้นหาเนมสเปซทั้งหมดสำหรับวิธีการขยายสำหรับการจับคู่ที่ดีกว่าการอนุมานประเภททั่วไปและการแสดงออกแลมบ์ดาที่เกี่ยวข้องกับประเภททั่วไป)
  • สามารถช่วยหลีกเลี่ยงการชนกันของชื่อในการสร้างในอนาคตเมื่อมีการเพิ่มประเภทใหม่ลงในเนมสเปซที่ไม่ได้ใช้ซึ่งมีชื่อเหมือนกันกับบางประเภทในเนมสเปซที่ใช้แล้ว
  • จะลดจำนวนรายการในรายการแก้ไขอัตโนมัติเมื่อเขียนโค้ดนำไปสู่การพิมพ์ที่เร็วขึ้น (ใน C # 3.0 สิ่งนี้สามารถลดรายการวิธีการขยายที่แสดง)

สิ่งที่ลบเนมสเปซที่ไม่ได้ใช้จะไม่ทำ:

  • แก้ไขในทางใด ๆ ผลลัพธ์ของคอมไพเลอร์
  • แก้ไขการดำเนินการของโปรแกรมที่รวบรวม (การโหลดเร็วขึ้นหรือประสิทธิภาพที่ดีขึ้น)

แอสเซมบลีที่ได้นั้นเหมือนกันโดยมีหรือไม่มีการใช้โดยไม่ได้ใช้งาน


3
และในขณะที่คุณแก้ไขไฟล์คุณจะท้ายเพิ่ม namespaces มากขึ้นเรื่อย ๆ จนถึงจุดเริ่มต้นของไฟล์ ดังนั้นหากคุณไม่ลบเนมสเปซที่ไม่ได้ใช้ออกไปเมื่อคุณเปิดไฟล์สิ่งที่คุณเห็นคือรายการเนมสเปซขนาดใหญ่แทนที่จะใช้งานจริง
Mert Akcakaya

5
เกี่ยวกับการรวบรวมที่เร็วขึ้น: usingคำสั่งที่ไม่ได้ใช้ใน.csไฟล์สามารถป้องกันคุณจากการลบการอ้างอิงแอสเซมบลีบางส่วน (ไม่ได้ใช้) ออกจาก.csprojโครงการของคุณ หากคุณมี "วิธีแก้ปัญหา" ของโครงการหลายโครงการการอ้างอิงที่ไม่จำเป็นระหว่างโครงการจะบังคับให้โครงการรวบรวมในลำดับเฉพาะเมื่อในความเป็นจริงพวกเขามีความเป็นอิสระและสามารถรวบรวมในแบบคู่ขนาน ดังนั้นให้ลบusingคำสั่งที่ไม่ได้ใช้ก่อนที่คุณจะตรวจสอบหาการอ้างอิงโครงการที่ไม่ได้ใช้ในการแก้ปัญหาหลายโครงการ
Jeppe Stig Nielsen

1
นี่เป็นคำอธิบายที่ดี - ในท้ายที่สุดมันไม่ได้เกี่ยวข้องกับประสิทธิภาพมากนัก แต่เป็นแนวปฏิบัติที่ดีที่สุด ขอบคุณที่อธิบาย!
GSaunders

39

ความสะอาดของรหัสเป็นสิ่งสำคัญ

หนึ่งเริ่มรู้สึกว่ารหัสอาจไม่มีสีและบนเส้นทาง Browfield เมื่อเห็นการใช้งานฟุ่มเฟือย ในสาระสำคัญเมื่อฉันเห็นข้อความที่ไม่ได้ใช้บางอย่างธงสีเหลืองเล็ก ๆ ปรากฏขึ้นที่ด้านหลังของสมองของฉันบอกให้ฉัน "ดำเนินการด้วยความระมัดระวัง" และการอ่านรหัสการผลิตไม่ควรให้ความรู้สึกนั้นกับคุณ

ดังนั้นล้างการใช้ของคุณ อย่าเลอะเทอะ สร้างแรงบันดาลใจความมั่นใจ ทำให้รหัสของคุณสวย มอบอีกหนึ่ง dev ที่ให้ความรู้สึกอบอุ่นเป็นฝอย


ตอนนี้นั่นคือสิ่งที่ฉันต้องการได้ยิน :-) ฉันเคยใช้Organize Usings -> Remove and Sortทุกครั้งแล้ว BTW สำหรับฉันตัวเลือกสองตัวเลือกในOrganize Usingsนั้นไม่มีความหมาย ฉันกำลังพูดถึง VS2013 btw
Sнаđошƒаӽ

30

ไม่มีสร้าง IL usingเป็นเรื่องที่สอดคล้องกับ ดังนั้นusingคำสั่งจะไม่เพิ่มหน่วยความจำแอปพลิเคชันของคุณเนื่องจากไม่มีรหัสหรือข้อมูลที่สร้างขึ้นสำหรับมัน

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

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


4

คุณอาจมีการปะทะกันของชื่อถ้าคุณเรียกคลาสของคุณเช่นคลาส (ไม่ได้ใช้) ในเนมสเปซ ในกรณีของ System.Text คุณจะพบปัญหาหากคุณกำหนดคลาสที่ชื่อว่า "Encoder"

อย่างไรก็ตามนี่เป็นปัญหาเล็กน้อยและตรวจพบโดยคอมไพเลอร์


2

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


2

มันเป็นความชอบส่วนตัวเป็นหลัก ฉันทำความสะอาดตัวเอง (Resharper ทำงานได้ดีในการบอกฉันเมื่อมีข้อความที่ไม่จำเป็นโดยใช้งบ)

อาจกล่าวได้ว่ามันอาจลดเวลาในการคอมไพล์ แต่ด้วยความเร็วของคอมพิวเตอร์และคอมไพเลอร์ในทุกวันนี้มันจะไม่ส่งผลกระทบใด ๆ


2

ออกusingคำสั่งพิเศษเป็นเรื่องปกติ มีค่าเล็กน้อยในการลบออก แต่ไม่มาก ตัวอย่างเช่นทำให้รายการ IntelliSense ของฉันสั้นลงและทำให้ใช้งานได้ง่ายขึ้น

ชุดประกอบที่รวบรวมจะไม่ได้รับผลกระทบจากภายนอก usingคำสั่งที่

บางครั้งฉันวางมันไว้ข้างใน#regionและทิ้งมันไว้; ทำให้การดูไฟล์เป็นเรื่องเล็กน้อย IMO นี่เป็นหนึ่งในการใช้งานที่ดีไม่กี่#regionอย่าง


1
พวกเขาสามารถยุบได้โดยไม่มีภูมิภาค
abatishchev

1
@abatishchev: ใช่นั่นเป็นความจริงใน VS2010
Jay Bazuzi

"หนึ่งในไม่กี่การใช้งานที่ดีของ#region" ดังนั้นคุณหมายถึงการใช้#regionไม่ดีในวิธีส่วนใหญ่?
สตีเวน

ใช่#regionมันเป็นกลิ่นรหัส มันบอกว่ามากเกินไปเกิดขึ้นในชั้นเรียนของคุณ
Jay

2

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


1

พวกมันใช้เป็นทางลัด ตัวอย่างเช่นคุณจะต้องเขียน: System.Int32 แต่ละครั้งหากคุณไม่ได้ใช้ระบบ ด้านบน.

การลบรายการที่ไม่ได้ใช้ออกไปจะทำให้โค้ดของคุณดูสะอาดตา


1

ข้อความสั่งการใช้งานช่วยป้องกันไม่ให้คุณมีคุณสมบัติตามประเภทที่คุณใช้ โดยส่วนตัวฉันชอบทำความสะอาด จริง ๆ แล้วมันขึ้นอยู่กับวิธีใช้ loc loc


1

การมีเฉพาะเนมสเปซที่คุณใช้จริงช่วยให้คุณสามารถเก็บรหัสของคุณไว้เป็นเอกสารได้

คุณสามารถค้นหาได้อย่างง่ายดายว่าส่วนใดของรหัสของคุณกำลังเรียกซึ่งกันและกันด้วยเครื่องมือค้นหาใด ๆ

หากคุณมีเนมสเปซที่ไม่ได้ใช้จะไม่มีความหมายใด ๆ เมื่อทำการค้นหา

ฉันกำลังทำความสะอาด namespaces ตอนนี้เพราะฉันถามอยู่เสมอว่าส่วนใดของแอปพลิเคชันที่กำลังเข้าถึงข้อมูลเดียวกันไม่ทางใดก็ทางหนึ่ง

ฉันรู้ว่าส่วนใดที่กำลังเข้าถึงข้อมูลแต่ละวิธีเนื่องจากการเข้าถึงข้อมูลที่ถูกคั่นด้วยเนมสเปซเช่นโดยตรงผ่านฐานข้อมูลและเข้าโดยตรงผ่านบริการเว็บ

ฉันไม่สามารถคิดถึงวิธีที่ง่ายกว่านี้ในการทำสิ่งนี้ทั้งหมดในครั้งเดียว

หากคุณต้องการให้รหัสของคุณเป็นกล่องดำ (สำหรับนักพัฒนา) แล้วใช่ว่าจะไม่สำคัญ แต่ถ้าคุณต้องการที่จะรักษามันเมื่อเวลาผ่านไปมันเป็นเอกสารที่มีค่าเช่นรหัสอื่น ๆ ทั้งหมด


0

คำสั่ง 'ใช้' ไม่ส่งผลต่อประสิทธิภาพเนื่องจากเป็นเพียงตัวช่วยในการระบุชื่อของตัวระบุของคุณ ดังนั้นแทนที่จะต้องชนิดSystem.IO.Path.Combine ( ... )คุณก็สามารถพิมพ์Path.Combine ( ... )ถ้าคุณได้ใช้ System.IO


0

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

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