ฉันมีพื้นหลัง C ++ และฉันเข้าใจและเห็นด้วยอย่างยิ่งกับคำตอบของคำถามนี้: เหตุใด“ ใช้ namespace std;” ถือว่าเป็นการปฏิบัติที่ไม่ดี?
ดังนั้นฉันประหลาดใจที่มีประสบการณ์กับ C # ตอนนี้ฉันเห็นตรงข้ามแน่นอน:
using Some.Namespace;
มีการใช้อักษรทุกที่ เมื่อใดก็ตามที่คุณเริ่มใช้ประเภทคุณเพิ่มคำสั่งที่ใช้สำหรับเนมสเปซก่อน (ถ้ายังไม่มีอยู่) ฉันไม่สามารถจำได้เห็น.cs
แฟ้ม: using System; using System.Collections.Generic; using X.Y.Z; etc...
ที่ไม่ได้เริ่มต้นด้วย ในความเป็นจริงถ้าคุณเพิ่มไฟล์ใหม่ผ่านวิซาร์ด Visual Studio มันจะเพิ่มไฟล์บางไฟล์โดยใช้คำสั่งที่นั่นแม้ว่าคุณอาจไม่ต้องการมันก็ตาม ดังนั้นในขณะที่ในชุมชน C ++ คุณจะได้รับการลงโทษโดยทั่วไป C # ก็สนับสนุนให้ทำเช่นนี้ อย่างน้อยนี่คือสิ่งที่ฉันเห็น
ตอนนี้ฉันเข้าใจแล้วว่าการใช้คำสั่งใน C # และ C ++ ไม่ใช่สิ่งเดียวกัน นอกจากนี้ฉันจะเข้าใจว่าหนึ่งในสิ่ง nastiest ที่คุณสามารถทำอะไรกับusing namespace
ใน C ++ คือวางไว้ในไฟล์ส่วนหัวที่ไม่มีค่าเท่าคู่ที่น่ารังเกียจใน C # #include
เนื่องจากการขาดของแนวคิดของไฟล์ส่วนหัวและ
อย่างไรก็ตามแม้จะมีความแตกต่างกันก็ตามการใช้คำสั่งใน C # และ C ++ มีจุดประสงค์เดียวกันซึ่งจะต้องพิมพ์SomeType
ตลอดเวลาแทนที่จะใช้นานกว่านั้นSome.Namespace.SomeType
(ใน C ++ ด้วย::
แทนที่จะเป็น.
) และด้วยจุดประสงค์เดียวกันนี้อันตรายก็เหมือนกันกับฉัน: การตั้งชื่อการชน
ในกรณีที่ดีที่สุดส่งผลให้เกิดข้อผิดพลาดในการรวบรวมดังนั้นคุณ "เท่านั้น" ต้องแก้ไข ในกรณีที่เลวร้ายที่สุดมันยังคงรวบรวมและโค้ดจะทำสิ่งต่าง ๆ อย่างเงียบ ๆ กว่าที่คุณตั้งใจจะทำ ดังนั้นคำถามของฉันคือ: ทำไม (เห็นได้ชัด) กำลังใช้คำสั่งที่ถือว่าไม่ดีเท่ากันใน C # และ C ++?
ความคิดบางอย่างของคำตอบที่ฉันมี (ไม่มีสิ่งเหล่านี้ทำให้ฉันพึงพอใจจริงๆ):
เนมสเปซมีแนวโน้มที่จะยาวและซ้อนกันมากขึ้นใน C # มากกว่าใน C ++ (
std
เทียบกับSystem.Collection.Generic
) ดังนั้นจึงมีความต้องการมากขึ้นและได้รับมากขึ้นในการขจัดรหัสด้วยวิธีนี้ แต่แม้ว่าสิ่งนี้จะเป็นจริงการโต้แย้งนี้จะใช้เฉพาะเมื่อเราดูเนมสเปซมาตรฐาน Custom สามารถมีชื่อย่อใด ๆ ที่คุณชอบทั้งใน C # และ C ++ดูเหมือนว่าเนมสเปซมี "ละเอียดละเอียดมาก" ใน C # มากกว่าใน C ++ ตัวอย่างเช่นใน C ++ ห้องสมุดมาตรฐานทั้งหมดที่มีอยู่ใน
std
(บวกบาง namespaces ซ้อนกันเล็ก ๆ ชอบchrono
) ในขณะที่ใน C # คุณมีSystem.IO
,System.Threading
,System.Text
ฯลฯ ดังนั้นความเสี่ยงของการมีการชนกันตั้งชื่อมีขนาดเล็ก อย่างไรก็ตามนี่เป็นเพียงความรู้สึก ฉันไม่ได้จริงนับจำนวนชื่อคุณ "นำเข้า" กับและusing namespace std
using System
และอีกครั้งแม้ว่านี่จะเป็นจริงอาร์กิวเมนต์นี้ใช้เฉพาะเมื่อดูเนมสเปซมาตรฐาน คนของคุณสามารถออกแบบได้อย่างละเอียดตามที่คุณต้องการทั้งใน C # และ C ++
มีข้อโต้แย้งมากกว่านี้ไหม? ฉันสนใจข้อเท็จจริงที่ยากจริง ๆ (ถ้ามี) โดยเฉพาะและไม่ค่อยมีความคิดเห็น
Ext(this T t, long l)
t.Ext(0)
หากคุณเพิ่มเนมสเปซอื่นที่มีเมธอดส่วนขยายExt(this T t, int i)
แอปนั้นจะถูกเรียกแทน แต่ฉันไม่ใช่ผู้เชี่ยวชาญใน C # (ยัง)