นี่เป็นคำถามที่ดีมากเพราะฉันเห็นนักพัฒนา C ++ เขียนรหัส C # จำนวนมาก
วิธีที่ดีที่สุดคืออย่าคิดว่า C # เป็น "C ++ ที่มีไวยากรณ์ของ nicer" พวกเขาเป็นภาษาที่แตกต่างกันซึ่งต้องการแนวทางที่แตกต่างในการคิด C ++ บังคับให้คุณต้องคิดอย่างต่อเนื่องเกี่ยวกับสิ่งที่ CPU และหน่วยความจำจะทำ C # ไม่ใช่อย่างนั้น C # ได้รับการออกแบบมาโดยเฉพาะเพื่อให้คุณไม่ได้คิดเกี่ยวกับ CPU และหน่วยความจำและกำลังคิดถึงโดเมนธุรกิจที่คุณกำลังเขียนแทน
ตัวอย่างหนึ่งของสิ่งนี้ที่ฉันได้เห็นคือนักพัฒนา C ++ จำนวนมากจะชอบใช้ลูปเพราะพวกเขาเร็วกว่ารุ่นก่อนหน้า นี่เป็นความคิดที่ไม่ดีใน C # เพราะมันจะ จำกัด ประเภทที่เป็นไปได้ของการรวบรวมซ้ำ (ดังนั้นการใช้งานใหม่และความยืดหยุ่นของรหัส)
ฉันคิดว่าวิธีที่ดีที่สุดในการปรับจาก C ++ ถึง C # คือการลองและเขียนโค้ดจากมุมมองที่ต่างออกไป ในตอนแรกสิ่งนี้จะยากเพราะในช่วงหลายปีที่ผ่านมาคุณจะคุ้นเคยกับการใช้เธรด "CPU และหน่วยความจำทำอะไร" ในสมองของคุณเพื่อกรองรหัสที่คุณเขียน แต่ใน C # คุณควรคิดถึงความสัมพันธ์ระหว่างวัตถุในโดเมนธุรกิจแทน "ฉันต้องการทำอะไร" ตรงข้ามกับ "คอมพิวเตอร์กำลังทำอะไร"
หากคุณต้องการทำบางสิ่งกับทุกสิ่งในรายการออบเจ็กต์แทนที่จะเขียนลูป for for ในรายการให้สร้างเมธอดที่รับIEnumerable<MyObject>
และใช้การforeach
วนซ้ำ
ตัวอย่างเฉพาะของคุณ:
การควบคุมอายุการใช้งานของทรัพยากรที่ต้องมีการล้างข้อมูลที่กำหนด (เช่นไฟล์) นี่เป็นเรื่องง่ายที่จะมีการใช้งานอยู่ในมือ แต่จะใช้งานได้อย่างถูกต้องเมื่อมีการถ่ายโอนความเป็นเจ้าของทรัพยากร [... betwen threads]? ใน C ++ ฉันจะใช้พอยน์เตอร์ที่ใช้ร่วมกันและปล่อยให้มันดูแล 'การรวบรวมขยะ' ในเวลาที่เหมาะสม
คุณไม่ควรทำสิ่งนี้ใน C # (โดยเฉพาะระหว่างกระทู้) หากคุณต้องการทำบางสิ่งกับไฟล์ให้ทำในที่เดียวในคราวเดียว มันก็โอเค (และเป็นแนวปฏิบัติที่ดี) ในการเขียนคลาส wrapper ซึ่งจัดการทรัพยากรที่ไม่มีการจัดการซึ่งถูกส่งผ่านระหว่างคลาสของคุณ แต่อย่าพยายามส่งไฟล์ระหว่างเธรดและมีคลาสแยกต่างหากเขียน / อ่าน / ปิด / เปิด อย่าแชร์การเป็นเจ้าของทรัพยากรที่ไม่มีการจัดการ ใช้Dispose
รูปแบบเพื่อจัดการกับการล้างข้อมูล
การดิ้นรนอย่างต่อเนื่องกับฟังก์ชั่นการเอาชนะสำหรับ generics เฉพาะ (ฉันชอบสิ่งต่าง ๆ เช่นความเชี่ยวชาญเทมเพลตบางส่วนใน C ++) ฉันควรละทิ้งความพยายามในการเขียนโปรแกรมทั่วไปใน C # หรือไม่ บางทียาชื่อสามัญอาจมีข้อ จำกัด ในวัตถุประสงค์และไม่ใช่ C # -ish ที่จะใช้ยกเว้นโดเมนที่ระบุปัญหา
ยาสามัญใน C # ได้รับการออกแบบให้เป็นยาสามัญ ความเชี่ยวชาญของยาชื่อสามัญควรได้รับการจัดการโดยคลาสที่ได้รับ ทำไมควรList<T>
ทำงานแตกต่างกันถ้าเป็นList<int>
หรือList<string>
? ทั้งหมดของการดำเนินงานเกี่ยวกับการList<T>
ให้ทั่วไปที่จะนำไปใช้กับการใด ๆ List<T>
หากคุณต้องการเปลี่ยนพฤติกรรมของ.Add
เมธอดบน a List<string>
ให้สร้างคลาสที่ได้รับมาMySpecializedStringCollection : List<string>
หรือคลาสที่ประกอบขึ้นMySpecializedStringCollection : IList<string>
ซึ่งใช้สามัญภายใน แต่ทำสิ่งต่าง ๆ ในแบบที่ต่างกัน สิ่งนี้จะช่วยให้คุณหลีกเลี่ยงการละเมิดหลักการทดแทน Liskov และทำให้ผู้อื่นที่ใช้คลาสของคุณรู้สึกผิด
ฟังก์ชั่นเหมือนมาโคร ในขณะที่โดยทั่วไปเป็นความคิดที่ไม่ดีสำหรับโดเมนของปัญหาบางอย่างไม่มีวิธีแก้ปัญหาอื่น ๆ (เช่นการประเมินเงื่อนไขของคำสั่งเช่นกับบันทึกที่ควรไปที่ Debug release เท่านั้น) การไม่มีพวกเขาหมายความว่าฉันต้องใส่ให้มากขึ้นถ้า (เงื่อนไข) {... } สำเร็จรูปและยังคงไม่เท่ากันในแง่ของการเรียกผลข้างเคียง
อย่างที่คนอื่นพูดคุณสามารถใช้คำสั่ง preprocessor เพื่อทำสิ่งนี้ คุณสมบัติดียิ่งขึ้น โดยทั่วไปคุณสมบัติเป็นวิธีที่ดีที่สุดในการจัดการสิ่งต่าง ๆ ซึ่งไม่ใช่ฟังก์ชั่น "แกนกลาง" สำหรับชั้นเรียน
กล่าวโดยย่อเมื่อเขียน C # โปรดจำไว้ว่าคุณควรคำนึงถึงโดเมนธุรกิจทั้งหมดโดยไม่คำนึงถึง CPU และหน่วยความจำ คุณสามารถปรับให้เหมาะสมในภายหลังหากจำเป็นแต่รหัสของคุณควรสะท้อนถึงความสัมพันธ์ระหว่างหลักการทางธุรกิจที่คุณพยายามทำแผนที่
C#
เพื่อสร้างรหัสอื่น คุณสามารถอ่านCSV
หรือXML
หรือสิ่งที่คุณได้ยื่นเป็น input และสร้างC#
หรือSQL
ไฟล์ สิ่งนี้มีประสิทธิภาพมากกว่าการใช้มาโครที่ใช้งานได้