C ++. Net ใช้อย่างกว้างขวางหรือไม่?


25

ฉันเป็นคนทำรหัส C ++ ตามธรรมเนียม ในช่วง 12 เดือนที่ผ่านมาฉันใช้รหัส C # มากและรู้สึกประหลาดใจอย่างมากกับวิธีการปฏิบัติของ C # (เมื่อฉันหยุดพยายามที่จะโค้ดมันราวกับว่ามันเป็น "C ++ พร้อมการเก็บขยะ")

เมื่อไม่นานมานี้เรามีผู้สำเร็จการศึกษาบางคนและเมื่อช่วยเหลือหนึ่งในนั้นฉันก็รู้ว่าเธอกำลังใช้. Net ใน C ++ หลังจากถามเธอว่าทำไมเธอบอกว่าเธอถูก "บอกให้ใช้ C ++ โดยผู้จัดการของเธอ" ปัญหาการสื่อสารที่เห็นได้ชัดฉันคิดว่าเธอใช้. Net เพราะนั่นเป็นเพียงกรอบการทำงานที่เธอได้สัมผัส

จากนั้นฉันเจอโครงการเก่าโดยนักพัฒนาอาวุโสที่ใช้ C ++ เพื่อขับเคลื่อนส่วนหน้าของแบบฟอร์ม ตอนนี้มันจะถูกเขียนขึ้นในช่วงเวลา. Net ปรากฏตัวครั้งแรกดังนั้นฉันจึงคิดว่ามันเป็นการออกกำลังกายการเรียนรู้ในส่วนของเขาที่จะเล่นกับ. Net มันเป็นเพียงแอพยูทิลิตี้ขนาดเล็ก

ฉันต้องใช้การดัดแปลงเล็กน้อยในแอพนี้ฉันคิดว่าการใช้ C ++ เพื่อขับเคลื่อน. Net ช่วยให้คุณแย่ที่สุดในโลกทั้งสอง ไม่มีการรวบรวมขยะหรือความปลอดภัยของหน่วยความจำ แต่ไม่มีโอกาสในการเพิ่มประสิทธิภาพ / การเพิ่มประสิทธิภาพที่คล้ายกันเนื่องจากคุณกำลังจัดการกับกรอบงานที่มีการจัดการ

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

คำตอบ:


32

c ++. NET (หรืออย่างแม่นยำ, C ++ / CLI) ไม่ได้มีการเก็บขยะเช่นเดียวกับทุกสิ่งทุกอย่างที่วิ่งอยู่บนยอด .NET เพื่อให้บรรลุสิ่งนี้ในขณะที่เหลือเข้ากันได้กับ C ++ ที่เหมาะสมจะใช้^ไวยากรณ์และgcnewตัวชี้การเก็บขยะ ('ปลอดภัย')

C ++ / CLI นั้นถือว่าเป็นสิ่งที่น่ารังเกียจโดยหลาย ๆ คนมันไม่น่าพอใจที่จะทำงานกับ C # หรือ C ++ ที่เหมาะสมและมีความซับซ้อนมากกว่าทั้งสองอย่าง (เพียงเพราะมันทำให้ C + + ของตัวเองซับซ้อนลงในตารางและเพิ่มสิ่งที่ต้องใช้ในการทำงาน ด้วย. NET เพื่อการมิกซ์) การเรียนรู้ C # มักจะจ่ายแม้ในขอบเขตของโครงการขนาดกลางเดียว อย่างไรก็ตามมีสิ่งหนึ่งที่สามารถทำได้ที่ทั้ง C # และ C ++ ไม่สามารถทำได้: คอมไพล์ C ++ ที่มีอยู่กับ. NET และให้พูดคุยกับคอมโพเนนต์. NET อื่น ๆ

ดังนั้นมันไม่สมเหตุสมผลเลยที่จะใช้ C ++ / CLI สำหรับโครงการแบบเริ่มต้น - อะไรก็ตามที่เกี่ยวข้องกับ. NET ที่สามารถทำได้ด้วยก็สามารถทำได้ใน C # ด้วยไวยากรณ์ที่ดีกว่าและความปลอดภัยที่เพิ่มขึ้นของการไม่เปิดเผยดิบ ตัวชี้ตามค่าเริ่มต้น raison-d'etre ที่โดดเด่นที่สุดของมันคือการย้ายฐานรหัสที่มีอยู่ไปยัง. NET บริษัท ที่ตัดสินใจเริ่มใช้. NET แต่ไม่เต็มใจ (หรือไม่สามารถทำได้เนื่องจากข้อ จำกัด ด้านทรัพยากรและเวลา) ในการเขียนซอฟต์แวร์ทุกชิ้นที่ผลิตมาจนถึงตอนนี้สามารถใช้ C ++ / CLI เพื่อให้ใช้ codebase ที่มีอยู่โดยมีการเปลี่ยนแปลงเพียงเล็กน้อยเท่านั้น จากนั้นเขียนองค์ประกอบของระบบใน C # หนึ่งต่อหนึ่ง อย่างน้อยนั่นก็คือทฤษฎี ฉันไม่เคยเห็นมันทำมาเพื่อฝึกฝนตัวเองดังนั้นฉันจึงบอกไม่ได้ว่ามันใช้งานได้ดีแค่ไหน

โปรดทราบว่า C # สามารถเชื่อมต่อกับไลบรารีดั้งเดิมได้แม้ว่าคุณจะต้องใช้รหัส C ++ ที่มีอยู่แล้วคุณไม่จำเป็นต้องคอมไพล์พวกเขาอีกครั้งกับ. NET: บ่อยครั้งที่การติดต่อกับพวกเขาผ่าน COM หรือ P / Invoke เป็นทางออกที่ดีกว่า .


10
โปรดทราบว่า 'การเชื่อมต่อกับไลบรารีเนทีฟ' ด้วย P / Invoke นั้น จำกัด เพียง dll ที่มีฟังก์ชั่นคงที่และ COM นั้นสร้างความยุ่งยากให้กับตัวเอง wrapper ใน C ++ / CLR ช่วยให้คุณสามารถเข้าถึงแบ็คเอนด์ดั้งเดิม / โปรเจ็กต์ขนาดเต็มได้อย่างหมดจดในรหัส C # ของคุณด้วยข้อ จำกัด น้อยมาก ฉันจะไม่ใช้มันเพื่อการพัฒนา แต่เป็นกาวมันสะอาดกว่า P / Invoke และมันก็เป็น marshalling
สูงสุด

อย่างที่สอง - และฉันคิดว่า Microsoft เห็นด้วยอย่างเงียบ ๆ ตัดสินโดยวิธีที่พวกเขาปรับ C ++ ใหม่ให้เข้ากับตำแหน่งที่ถูกต้องในการพัฒนาดั้งเดิม
Josh Greifer

2
โปรดทราบว่าภาษานั้นเรียกว่า C ++ / CLI ไม่ใช่ C ++. NET
svick

@svick: ถูกต้อง แก้ไข
tdammers

1
@Max TBH Microsoft ทำให้ทุกอย่างเป็นภาษาพื้นเมือง ดังนั้นตอนนี้คุณไม่จำเป็นต้องใช้ C ++ / CLI เลยคุณไม่จำเป็นต้องเขียน wraps ที่น่ารังเกียจเหล่านั้นเพื่อเชื่อมต่อ C # กับโค้ดเนทีฟ - ตรวจสอบให้แน่ใจว่าพวกเขาเป็นวัตถุ WinRT / COM แล้ว
gbjbaanb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.