คำถามติดแท็ก c#

C # เป็นภาษาการเขียนโปรแกรมเชิงวัตถุที่มีการจัดการและรวบรวมขยะที่สร้างขึ้นโดย Microsoft ควบคู่ไปกับแพลตฟอร์ม. NET

5
สำหรับเทียบกับ foreach กับ LINQ
เมื่อฉันเขียนโค้ดใน Visual Studio, ReSharper (ขอให้พระเจ้าคุ้มครองมัน!) มักจะแนะนำให้ฉันเปลี่ยนโรงเรียนเก่าของฉันสำหรับวงในรูปแบบ foreach ขนาดกะทัดรัดมากขึ้น และบ่อยครั้งที่ฉันยอมรับการเปลี่ยนแปลงนี้ ReSharper ก้าวไปข้างหน้าและแนะนำให้ฉันเปลี่ยนอีกครั้งในรูปแบบ LINQ ดังนั้นฉันสงสัยว่า: มีข้อได้เปรียบจริงบ้างไหมในการปรับปรุงเหล่านี้ ในการใช้งานโค้ดอย่างง่าย ๆ ฉันไม่เห็นการเพิ่มความเร็ว (ชัด) แต่ฉันเห็นโค้ดน้อยลงและอ่านง่ายขึ้น ... ดังนั้นฉันจึงสงสัยว่า: มันคุ้มหรือไม่
86 c#  linq 

11
คงเป็น "ความชั่วร้าย" ในระดับสากลสำหรับการทดสอบหน่วยและถ้าเป็นเช่นนั้นทำไม Resharper จึงแนะนำ [ปิด]
ฉันได้พบว่ามีเพียง 3 วิธีในการทดสอบหน่วยอ้างอิง (จำลอง / ต้นขั้ว) ที่คงที่ใน C # .NET: ไฝ TypeMock JustMock เนื่องจากว่าสองสิ่งนี้ไม่ฟรีและไม่มีการปล่อยรุ่น 1.0 การเยาะเย้ยสิ่งคงไม่ง่ายเกินไป นั่นทำให้วิธีการคงที่และ "ความชั่วร้าย" (ในแง่การทดสอบหน่วย) หรือไม่? และถ้าเป็นเช่นนั้นทำไม resharper จึงต้องการให้ฉันทำอะไรที่คงที่ (การสมมติว่า resharper ไม่ได้เป็น "ความชั่วร้าย" ด้วย) ชี้แจง: ฉันกำลังพูดถึงสถานการณ์เมื่อคุณต้องการทดสอบหน่วยวิธีและวิธีการที่เรียกว่าวิธีการคงที่ในหน่วย / ระดับที่แตกต่างกัน โดยคำจำกัดความส่วนใหญ่ของการทดสอบหน่วยหากคุณเพียงให้วิธีการทดสอบเรียกวิธีการคงที่ในหน่วย / ชั้นเรียนอื่น ๆ แล้วคุณไม่ได้ทดสอบหน่วยคุณกำลังทดสอบบูรณาการ (มีประโยชน์ แต่ไม่ใช่การทดสอบหน่วย)

4
รูปแบบโดเมนที่หลากหลาย - พฤติกรรมนั้นเข้ากันได้อย่างไร
ในการอภิปรายเกี่ยวกับโมเดลโดเมน Rich and Anemic อินเทอร์เน็ตเต็มไปด้วยคำแนะนำทางปรัชญา แต่ย่อมาจากตัวอย่างที่เชื่อถือได้ วัตถุประสงค์ของคำถามนี้คือการหาแนวทางที่ชัดเจนและตัวอย่างที่เป็นรูปธรรมของโมเดลการออกแบบที่ขับเคลื่อนด้วยโดเมนที่เหมาะสม (นึกคิดใน C #.) สำหรับตัวอย่างในโลกแห่งความจริงการใช้ DDD นี้ดูเหมือนจะผิด: โดเมน WorkItem รุ่นด้านล่างไม่มีอะไรนอกจากถุงคุณสมบัติซึ่ง Entity Framework ใช้สำหรับฐานข้อมูลรหัสแรก ต่อฟาวเลอร์ก็เป็นโรคโลหิตจาง เห็นได้ชัดว่าชั้น WorkItemService เป็นความเข้าใจผิดทั่วไปของบริการโดเมน มันมีพฤติกรรม / ตรรกะทางธุรกิจทั้งหมดสำหรับ WorkItem ต่อ Yemelyanov และคนอื่น ๆ ก็เป็นขั้นตอน (หน้า 6) ดังนั้นถ้าด้านล่างผิดฉันจะทำให้ถูกต้องได้อย่างไร พฤติกรรมเช่นAddStatusUpdateหรือCheckoutควรเป็นของคลาส WorkItem ที่ถูกต้องหรือไม่ แบบจำลอง WorkItem ควรพึ่งพาอะไร? public class WorkItemService : IWorkItemService { private IUnitOfWorkFactory _unitOfWorkFactory; …

8
คืนค่าเวทย์มนตร์โยนข้อยกเว้นหรือคืนเท็จเมื่อล้มเหลว?
บางครั้งฉันต้องเขียนวิธีหรือคุณสมบัติสำหรับไลบรารี่คลาสที่ไม่ได้ยอดเยี่ยมที่จะไม่มีคำตอบจริง แต่เป็นความล้มเหลว ไม่สามารถระบุบางสิ่ง, ไม่พร้อมใช้, ไม่พบ, ไม่สามารถทำได้ในปัจจุบันหรือไม่มีข้อมูลเพิ่มเติม ฉันคิดว่ามีวิธีแก้ปัญหาสามประการที่เป็นไปได้สำหรับสถานการณ์ที่ไม่เป็นพิเศษเช่นนี้เพื่อระบุความล้มเหลวใน C # 4: คืนค่าเวทย์มนตร์ที่ไม่มีความหมายเป็นอย่างอื่น (เช่นnullและ-1); โยนข้อยกเว้น (เช่นKeyNotFoundException); ส่งคืนfalseและระบุค่าส่งคืนจริงในoutพารามิเตอร์ (เช่นDictionary<,>.TryGetValue) ดังนั้นคำถามคือ: ในสถานการณ์ใดที่ฉันไม่ควรพลาด และถ้าฉันไม่ควรโยน: เมื่อส่งคืนค่าเวทมนตร์ที่อ้างถึงข้างต้นใช้Try*วิธีการที่มีoutพารามิเตอร์หรือไม่ (สำหรับฉันoutพารามิเตอร์ดูเหมือนว่าสกปรกและใช้งานได้อย่างถูกต้องมากกว่า) ฉันกำลังมองหาคำตอบที่เป็นจริงเช่นคำตอบที่เกี่ยวข้องกับแนวทางการออกแบบ (ฉันไม่รู้อะไรเกี่ยวกับTry*วิธีการ) ความสามารถในการใช้งาน (เมื่อฉันขอสิ่งนี้สำหรับห้องสมุดคลาส) ความสอดคล้องกับ BCL และความสามารถในการอ่าน ในไลบรารีคลาสพื้นฐาน. NET Framework ใช้วิธีการทั้งสาม: คืนค่าเวทย์มนตร์ที่ไม่มีความหมายเป็นอย่างอื่น: Collection<T>.IndexOf ผลตอบแทน -1 StreamReader.Read ผลตอบแทน -1 Math.Sqrt ส่งกลับ NaN Hashtable.Item ผลตอบแทนที่เป็นโมฆะ; โยนข้อยกเว้น: Dictionary<,>.Item พ่น KeyNotFoundException Double.Parseพ่น FormatException; …

11
นักพัฒนาซอฟต์แวร์ของ Java ได้ละทิ้ง RAII หรือไม่?
ในฐานะโปรแกรมเมอร์ C # เป็นเวลานานฉันเพิ่งได้เรียนรู้เพิ่มเติมเกี่ยวกับข้อดีของการได้มาซึ่งทรัพยากรคือการเริ่มต้น (RAII) โดยเฉพาะฉันได้ค้นพบว่าสำนวน C #: using (var dbConn = new DbConnection(connStr)) { // do stuff with dbConn } มี C ++ ที่เทียบเท่า: { DbConnection dbConn(connStr); // do stuff with dbConn } หมายความว่าการจดจำการใช้ทรัพยากรเช่นDbConnectionในusingบล็อกนั้นไม่จำเป็นใน C ++! สิ่งนี้ดูเหมือนจะเป็นข้อได้เปรียบที่สำคัญของ C ++ สิ่งนี้น่าเชื่อถือยิ่งขึ้นเมื่อคุณพิจารณาคลาสที่มีสมาชิกอินสแตนซ์ของประเภทDbConnectionตัวอย่างเช่น class Foo { DbConnection dbConn; // ... } ใน …
82 java  c#  c++  language-design 

10
ข้อยกเว้นรหัสข้อผิดพลาดและสหภาพที่ถูกเลือกปฏิบัติ
ฉันเพิ่งเริ่มงานเขียนโปรแกรม C # แต่ฉันมีพื้นหลังค่อนข้างน้อยใน Haskell แต่ฉันเข้าใจว่า C # เป็นภาษาที่เน้นวัตถุฉันไม่ต้องการบังคับให้หมุดกลมกลายเป็นช่องสี่เหลี่ยม ฉันอ่านบทความException Throwingจาก Microsoft ซึ่งระบุว่า: อย่าส่งคืนรหัสข้อผิดพลาด แต่เมื่อใช้กับ Haskell ฉันใช้ชนิดข้อมูล C # OneOfคืนผลลัพธ์เป็นค่า "right" หรือข้อผิดพลาด (ส่วนใหญ่มักจะเป็น Enumeration) เป็นค่า "left" นี่เป็นเหมือนการประชุมของEitherHaskell สำหรับฉันดูเหมือนปลอดภัยกว่าข้อยกเว้น ใน C # การละเว้นข้อยกเว้นจะไม่ทำให้เกิดข้อผิดพลาดในการคอมไพล์และหากพวกมันไม่ถูกจับพวกมันก็จะทำให้โปรแกรมของคุณพัง นี่อาจจะดีกว่าการละเว้นรหัสข้อผิดพลาดและทำให้เกิดพฤติกรรมที่ไม่ได้กำหนด แต่การหยุดทำงานซอฟต์แวร์ไคลเอ็นต์ของคุณยังคงไม่ดีโดยเฉพาะอย่างยิ่งเมื่อทำงานด้านธุรกิจที่สำคัญอื่น ๆ ในพื้นหลัง ด้วยOneOfจะต้องมีความชัดเจนมากเกี่ยวกับการเปิดออกและการจัดการค่าส่งคืนและรหัสข้อผิดพลาด และหากไม่มีใครรู้วิธีจัดการกับมันในขั้นตอนนั้นใน call stack จะต้องใส่ค่าส่งคืนของฟังก์ชันปัจจุบันเพื่อให้ผู้โทรทราบว่าอาจเกิดข้อผิดพลาดได้ แต่นี่ไม่ใช่วิธีการที่ Microsoft แนะนำ ใช้OneOfแทนข้อยกเว้นในการจัดการข้อยกเว้น "สามัญ" (เช่น File Not Found …
80 c#  exceptions 

6
เมื่อใดจะไปได้อย่างคล่องแคล่วใน C #?
ในหลาย ๆ แง่มุมฉันชอบความคิดของอินเทอร์เฟซ Fluent แต่ด้วยคุณลักษณะที่ทันสมัยทั้งหมดของ C # (initializers, lambdas, พารามิเตอร์ที่มีชื่อ) ฉันคิดว่าตัวเองคิดว่า "มันคุ้มค่าหรือไม่" และ "นี่เป็นรูปแบบที่เหมาะสมหรือไม่ ใช้?". ใครช่วยฉันได้บ้างถ้าไม่ใช่วิธีปฏิบัติที่ได้รับการยอมรับอย่างน้อยประสบการณ์ของพวกเขาหรือเมทริกซ์การตัดสินใจว่าจะใช้รูปแบบ Fluent ได้เมื่อใด สรุป: กฎง่ายๆที่ดีจากคำตอบจนถึงตอนนี้: ส่วนต่อประสานที่คล่องแคล่วช่วยได้อย่างมากเมื่อคุณมีการดำเนินการมากกว่าตัวตั้งค่าเนื่องจากการโทรได้รับประโยชน์มากขึ้นจากบริบทการส่งผ่าน อินเทอร์เฟซที่ใช้งานได้ควรถือเป็นเลเยอร์ที่อยู่เหนือสุดของ api ไม่ใช่วิธีการใช้งานเพียงอย่างเดียว คุณสมบัติที่ทันสมัยเช่น lambdas, initializers และพารามิเตอร์ที่มีชื่อสามารถทำงานได้ด้วยมือเพื่อให้ส่วนต่อประสานที่คล่องแคล่วเป็นมิตรมากยิ่งขึ้น นี่คือตัวอย่างของสิ่งที่ฉันหมายถึงโดยคุณสมบัติที่ทันสมัยทำให้รู้สึกไม่จำเป็น ยกตัวอย่างเช่นอินเทอร์เฟซแบบคล่องแคล่ว (อาจเป็นตัวอย่างไม่ดี) ที่ให้ฉันสร้างพนักงานเช่น: Employees.CreateNew().WithFirstName("Peter") .WithLastName("Gibbons") .WithManager() .WithFirstName("Bill") .WithLastName("Lumbergh") .WithTitle("Manager") .WithDepartment("Y2K"); สามารถเขียนด้วย initializers ได้อย่างง่ายดายเช่น: Employees.Add(new Employee() { FirstName = "Peter", LastName = …
78 c#  .net 

17
แนวทางการเข้ารหัส: วิธีการไม่ควรมีคำสั่งมากกว่า 7 รายการ?
ฉันกำลังดูแนวทางการเข้ารหัสของ AvSolสำหรับ C # และฉันเห็นด้วยกับเกือบทุกอย่าง แต่ฉันอยากรู้จริง ๆ ว่าคนอื่นคิดอย่างไรกับกฎข้อหนึ่ง AV1500 วิธีการไม่ควรเกิน 7 ข้อความวิธีที่ต้องใช้มากกว่า 7 ข้อความกำลังทำมากเกินไปหรือมีความรับผิดชอบมากเกินไป นอกจากนี้ยังต้องใช้ความคิดของมนุษย์ในการวิเคราะห์งบที่แน่นอนเพื่อให้เข้าใจว่ารหัสกำลังทำอะไรอยู่ ทำลายมันลงในวิธีการเล็ก ๆ และเน้นด้วยชื่ออธิบายตนเอง คุณส่วนใหญ่ปฏิบัติตามกฎนี้หรือไม่? แม้ว่าจะมีน้อยที่จะถูกบันทึกจากการสร้างวิธีการใหม่ (รหัสของคุณยังคงแห้ง ) นอกเหนือจากการอ่านที่เพิ่มขึ้นอย่างมาก? และหมายเลขของคุณยังต่ำอยู่ที่ 7 หรือไม่ ฉันจะมีแนวโน้มมากขึ้นต่อ 10 ฉันไม่ได้บอกว่าฉันละเมิดกฎนี้ทั่วทุกที่ - ในทางตรงกันข้ามวิธีการของฉันเล็ก 95% และเน้น แต่บอกว่าคุณไม่ควรละเมิดกฎนี้จริงๆพัดฉันออกไป ฉันแค่อยากจะรู้ว่าสิ่งที่ทุกคนคิดว่าไม่เคยละเมิดกฎนี้ (มัน '1' ในมาตรฐานการเข้ารหัส - ความหมายไม่เคยทำเช่นนี้) แต่ฉันคิดว่าคุณมีปัญหาในการค้นหา codebase ที่ไม่ได้

11
เป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ที่จะแก้ไขโค้ดอย่างเคร่งครัดเพื่อการทดสอบ
ฉันมีการถกเถียงกับเพื่อนร่วมงานโปรแกรมเมอร์เกี่ยวกับว่ามันเป็นการปฏิบัติที่ดีหรือไม่ดีในการปรับเปลี่ยนรหัสการทำงานเพียงเพื่อให้สามารถทดสอบได้ (ผ่านการทดสอบหน่วยตัวอย่าง) ความคิดเห็นของฉันคือว่ามันใช้ได้ภายในขอบเขตของการบำรุงรักษาวัตถุที่ดีและการปฏิบัติด้านวิศวกรรมซอฟต์แวร์ที่แน่นอน (ไม่ใช่ "ทำให้ทุกอย่างเป็นสาธารณะ" ฯลฯ ) ความคิดเห็นของเพื่อนร่วมงานของฉันคือการแก้ไขรหัส (ใช้งานได้) เพื่อการทดสอบเท่านั้นผิด เป็นเพียงตัวอย่างง่ายๆลองนึกถึงโค้ดชิ้นนี้ที่ใช้โดยองค์ประกอบบางส่วน (เขียนใน C #): public void DoSomethingOnAllTypes() { var types = Assembly.GetExecutingAssembly().GetTypes(); foreach (var currentType in types) { // do something with this type (e.g: read it's attributes, process, etc). } } ฉันได้แนะนำว่ารหัสนี้สามารถแก้ไขเพื่อเรียกวิธีอื่นที่จะทำงานจริง: public void DoSomething(Assembly asm) { // not …

8
การใช้ประโยชน์จากคำหลัก "ผลตอบแทน" ใน C # [ปิด]
หลังจากประสบการณ์เกือบ 4 ปีฉันไม่ได้เห็นรหัสที่ใช้คำหลักผลตอบแทน ใครสามารถแสดงให้ฉันเห็นการใช้งานจริง (ตามคำอธิบาย) ของคำหลักนี้และถ้าเป็นเช่นนั้นจะไม่มีวิธีอื่น ๆ ที่จะเติมเต็มสิ่งที่มันสามารถทำได้หรือไม่?
76 c#  syntax 

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

5
ทำไมคุณไม่ใช้คำสั่ง 'use' ใน C #
มาตรฐานการเข้ารหัสที่มีอยู่ในโครงการ C # ขนาดใหญ่มีกฎที่ชื่อประเภททั้งหมดมีคุณสมบัติครบถ้วนโดยห้ามใช้คำสั่ง 'การใช้' ดังนั้นแทนที่จะคุ้นเคย: using System.Collections.Generic; .... other stuff .... List<string> myList = new List<string>(); (อาจไม่แปลกใจที่varห้ามใช้เช่นกัน) ท้ายที่สุดฉัน: System.Collections.Generic.List<string> myList = new System.Collections.Generic.List<string>(); นั่นคือการเพิ่มขึ้นของการพิมพ์ 134% โดยไม่มีการเพิ่มที่ให้ข้อมูลที่เป็นประโยชน์ ในมุมมองของฉันการเพิ่มขึ้น 100% คือเสียง (ความยุ่งเหยิง) ที่ขัดขวางการทำความเข้าใจ ในการเขียนโปรแกรมกว่า 30 ปีฉันได้เห็นมาตรฐานที่เสนอหนึ่งครั้งหรือสองครั้ง แต่ไม่เคยนำมาใช้ เหตุผลเบื้องหลังมันหนีฉันไป คนที่กำหนดมาตรฐานไม่ใช่คนโง่และฉันไม่คิดว่าเขาเป็นอันตราย ซึ่งทำให้เข้าใจผิดว่าเป็นทางเลือกอื่นเท่านั้นเว้นแต่ฉันจะพลาดบางสิ่งบางอย่าง คุณเคยได้ยินเกี่ยวกับมาตรฐานดังกล่าวหรือไม่? ถ้าเป็นเช่นนั้นอะไรคือเหตุผลที่อยู่เบื้องหลัง คุณนึกถึงข้อโต้แย้งอื่น ๆ ที่ไม่ใช่ "มันโง่" หรือ "คนอื่นทุกคนusing" ซึ่งอาจโน้มน้าวให้บุคคลนี้ลบข้อห้ามนี้ได้หรือไม่? เหตุผล เหตุผลในการห้ามนี้คือ: …

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

3
เราควรรวมโฟลเดอร์ Nuget PACKAGE ไว้ในการควบคุมเวอร์ชันหรือไม่?
ผมอยากจะรู้ว่า ในโครงการ C # หรือ VB.NET เราควรรวมโฟลเดอร์ PACKAGE (โฟลเดอร์แพคเกจ nugget ที่สร้างขึ้นเพื่อรูทของโครงการของฉันที่มีไฟล์ nupkg และเนื้อหาอื่น ๆ ) ไปยังแหล่งเก็บข้อมูลแหล่งควบคุม (Git เป็นต้น)

8
ปัญหาการตั้งชื่อ: ควรเปลี่ยนชื่อ“ ISomething” เป็น“ Something” หรือไม่ [ปิด]
บทของลุงบ็อบเกี่ยวกับชื่อในClean Codeแนะนำให้คุณหลีกเลี่ยงการเข้ารหัสในชื่อส่วนใหญ่เกี่ยวกับสัญกรณ์ฮังการี เขายังกล่าวถึงการลบIคำนำหน้าจากอินเทอร์เฟซโดยเฉพาะ แต่ไม่แสดงตัวอย่างของสิ่งนี้ สมมติว่า: การใช้อินเตอร์เฟสเป็นส่วนใหญ่เพื่อให้สามารถทดสอบได้ผ่านการฉีดแบบพึ่งพา ในหลายกรณีสิ่งนี้นำไปสู่การมีอินเทอร์เฟซเดียวกับตัวดำเนินการเดียว ยกตัวอย่างเช่นสองคนนี้ควรตั้งชื่ออะไร ParserและConcreteParser? ParserและParserImplementation? public interface IParser { string Parse(string content); string Parse(FileInfo path); } public class Parser : IParser { // Implementations } หรือฉันควรเพิกเฉยต่อข้อเสนอแนะนี้ในกรณีการดำเนินการแบบครั้งเดียวเช่นนี้หรือไม่?

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