ทำไมคำสั่ง“ ใช้” และคำสั่ง“ ใช้” ใช้คำหลักเดียวกันใน C #


10

usingสั่งให้เราสามารถเข้าถึงประเภทโดยไม่ต้องใช้ชื่อที่มีคุณสมบัติครบถ้วนของพวกเขา

using MyNamespace.Foo.Bar;

usingงบทำหน้าที่เป็นน้ำตาลประโยคสำหรับtry/ finallyบล็อกซึ่งมั่นใจว่าวัตถุที่มีการกำจัดอย่างถูกต้อง

using(var x = new MyDisposableClass()) { ... }

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

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


นอกจากนี้ฉันได้อ่านเกี่ยวกับการใช้สองครั้งclassใน C ++ เช่นกัน (อันหนึ่งสำหรับการประกาศคลาส, หนึ่งสำหรับการกำหนดพารามิเตอร์เทมเพลต) แต่ในที่สุดกรณีที่สองมีคำสำคัญของตัวเองtypenameซึ่งทำให้ฉันมีเหตุผลมากขึ้น

คำตอบ:


7

คุณมีสิทธิ์ในการใช้ทั้งสองอย่างusingนั้นไม่เกี่ยวข้องกัน

อย่างไรก็ตามมีเหตุผลที่ดีหลายประการที่จะใช้usingในทั้งสองกรณี

  • usingคำสั่งที่ถูกสร้างขึ้นสำหรับ NET 1.0 และทำให้รู้สึกความหมาย ( "ฉันใช้ namespace นี้ในรหัสต่อไป")
  • ในทั้งสองกรณีusingทำให้รู้สึกความหมาย ในภาษาอังกฤษธรรมดาคุณusingเป็นเนมสเปซหรือคุณเป็นusingวัตถุสำรองที่ประกาศแล้ว
  • ด้วยการใช้usingคำหลักมากเกินไปนักออกแบบภาษาไม่จำเป็นต้องสร้างคำสงวนอีกคำในภาษานั้น สิ่งนี้จะช่วยรักษาความสะอาดของภาษา

เป็นไปได้ที่ให้เวลากับพวกเขาอีกครั้งนักออกแบบภาษาอาจเลือกที่จะใช้importสำหรับการประกาศ namespace เพื่อแยกแยะตัวเลือกทั้งสอง ( usingวัตถุที่ใช้แล้วทิ้งมาใน. NET รุ่นที่ใหม่กว่า) เราจะไม่มีทางรู้และไม่สำคัญจริง ๆ เนื่องจากมีความชัดเจนมากซึ่งความหมายสองประการที่คุณใช้เนื่องจากบริบท

ต้องบอกว่าทั้งหมดไม่ไปและทิ้งรหัสของคุณด้วยusing MyNamespace.DisposableObject = DisposableObject;นามแฝง namespace ทุกที่


ขอบคุณ คุณช่วยขยายความหมายของ "ช่วยให้ภาษาสะอาดยิ่งขึ้น" ในใจของฉันการใช้คำหลักมากเกินไปทำให้ภาษาสะอาดน้อยลง ฉันคิดว่าการทำคำหลักใหม่และการใช้คำหลักแยกต่างหากสำหรับฟังก์ชั่นแยกต่างหาก
eigenchris

5
คำหลักไม่สามารถใช้เป็นตัวระบุได้ การแนะนำคำหลักใหม่จะแบ่งแต่ละโปรแกรมที่เกิดขึ้นเพื่อใช้คำหลักนั้นเป็นตัวระบุ คุณสามารถแนะนำคำหลักในลักษณะที่เข้ากันได้แบบย้อนหลังหากคุณสามารถเข้าถึงซอร์สโค้ดทุกบรรทัดที่เคยเขียนในประวัติศาสตร์ทั้งหมดของC♯รวมถึงซอร์สโค้ดที่เป็นกรรมสิทธิ์รหัสแหล่งที่มาลับรหัสแหล่งทหารและอื่น ๆ
Jörg W Mittag

@ JörgWMittagไม่เป็นความจริงอย่างสมบูรณ์ C # มีคำหลักตามบริบทจำนวนมากที่เพิ่มขึ้นในรูปแบบที่หมายถึงตัวระบุที่มีอยู่ในชื่อนั้นไม่ขัดแย้งกับรหัส varเป็นตัวอย่างคลาสสิกที่มีประเภทในขอบเขตชื่อvarมีความสำคัญมากกว่าคำหลัก
David Arno

@ JörgWMittagหรือทางเลือกอื่นคือการทำให้รุ่นภาษาของคอมไพเลอร์สามารถเลือกได้ (เช่นg++ --std=c++11หรืออนุญาตให้ไฟล์ต้นฉบับเพื่อระบุภาษา (เช่นใน Haskell (?), Racket, Perl, แม้แต่ Python) นอกจากนี้ยังสามารถออกแบบภาษาใน วิธีที่คำหลักไม่เคยขัดแย้งกับตัวระบุที่เป็นไปได้โดยไม่ต้องจองตัวระบุบางตัว (แม้ว่าอาจเป็นเรื่องยากสำหรับการใช้งานภาษาที่ไม่ได้ใช้งานของคุณโดยใช้ตัวแยกวิเคราะห์ LALR ที่มีตัวอ่านเล็ก ๆ )
amon

1
@eigenchris คุณสามารถนำหน้า keword ด้วย @ เพื่อใช้เป็นตัวระบุเช่นได้@using
Bill Tür

4

โดยทั่วไปแล้วนักออกแบบภาษาพยายาม จำกัด จำนวนคำหลัก เมื่อจองคำหลักแล้วจะไม่สามารถใช้เป็นตัวระบุในรหัสผู้ใช้ซึ่งน่ารำคาญหากเป็นเพียงคำที่คุณต้องการ นอกจากนี้ยังเป็นอุปสรรคเมื่อทำการย้ายรหัสจากภาษาอื่น - และ Microsoft ต้องการให้ผู้คนใส่รหัสพอร์ตจาก Java เป็น C # C # มีคำหลักมากกว่า Java แต่คำหลักใหม่แต่ละคำจะทำให้ยากขึ้น นอกจากนี้ภาษา. net ได้รับการออกแบบให้โต้ตอบกับ API ที่เขียนในภาษาต่างๆซึ่งอาจไม่มีคำหลักเดียวกันซึ่งนำไปสู่ความรำคาญหากสมาชิกสาธารณะเป็นคำหลัก

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

  • new ในข้อ จำกัด ทั่วไป
  • inในforeachและในพารามิเตอร์ประเภทตัวแปร
  • defaultเป็นข้อในswitchและในฐานะผู้ประกอบการ ( default(T))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.