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

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

7
หากฟังก์ชั่นต้องทำการตรวจสอบโมฆะก่อนที่จะทำการออกแบบที่ไม่ดี
ดังนั้นฉันไม่รู้ว่านี่เป็นการออกแบบรหัสที่ดีหรือไม่ดีดังนั้นฉันจึงคิดว่าฉันควรถาม ฉันมักจะสร้างวิธีการที่ทำการประมวลผลข้อมูลที่เกี่ยวข้องกับคลาสและฉันมักจะตรวจสอบวิธีการต่าง ๆ มากมายเพื่อให้แน่ใจว่าฉันจะไม่ได้รับการอ้างอิงเป็นโมฆะหรือข้อผิดพลาดอื่น ๆ ก่อนถึงมือ สำหรับตัวอย่างพื้นฐานมาก: // fields and properties private Entity _someEntity; public Entity SomeEntity => _someEntity; public void AssignEntity(Entity entity){ _someEntity = entity; } public void SetName(string name) { if (_someEntity == null) return; //check to avoid null ref _someEntity.Name = name; label.SetText(_someEntity.Name); } ดังนั้นคุณจะเห็นการตรวจสอบ im สำหรับ …
67 c#  design  validation 

10
อะไรคือการใช้ downcasting ที่เหมาะสม?
Downcasting หมายถึงการคัดเลือกจากคลาสพื้นฐาน (หรืออินเทอร์เฟซ) ไปยังคลาสย่อยหรือคลาสลีฟ ตัวอย่างของการดาวน์สตรีมอาจเป็นหากคุณส่งจากSystem.Objectประเภทอื่น Downcasting นั้นเป็นที่นิยมอาจจะเป็นกลิ่นรหัส: หลักคำสอนเชิงวัตถุนั้นต้องการที่จะยกตัวอย่างเช่นการกำหนดและการเรียกวิธีเสมือนหรือนามธรรมแทนที่จะเป็นการลดทอน หากมีกรณีใดบ้างเป็นกรณีการใช้งานที่เหมาะสมและเหมาะสมสำหรับการลดความเร็ว? นั่นคือในสถานการณ์ใดมันเป็นสิ่งที่เหมาะสมในการเขียนรหัสที่ downcasts? หากคำตอบของคุณคือ "none" ดังนั้นทำไมระบบ downcasting จึงรองรับภาษานี้

16
โปรแกรมเมอร์ควรมีเสรีภาพเท่าไรในการเลือกภาษาและกรอบงาน?
ฉันเริ่มทำงานกับ บริษัท ที่เน้นภาษา C # เป็นหลัก เรามีบางคนที่ชอบ Java และ JRuby แต่โปรแกรมเมอร์ส่วนใหญ่ที่นี่เช่น C # ฉันถูกจ้างเพราะฉันมีประสบการณ์มากมายในการสร้างเว็บแอปพลิเคชันและเพราะฉันพึ่งพาเทคโนโลยีใหม่ ๆ เช่น JRuby บน Rails หรือ nodejs ฉันเพิ่งเริ่มต้นในโครงการสร้างเว็บแอปพลิเคชันโดยมุ่งเน้นที่การทำสิ่งต่าง ๆ มากมายในระยะเวลาอันสั้น ซอฟต์แวร์ที่เป็นผู้นำได้บอกว่าฉันใช้ mvc4 แทนราง อาจเป็นสิ่งที่ดียกเว้นฉันไม่รู้ mvc4 ฉันไม่รู้ C # และฉันเป็นคนเดียวที่รับผิดชอบในการสร้างเว็บแอปพลิเคชันเซิร์ฟเวอร์และ UI ส่วนหน้า มันจะไม่สมเหตุสมผลที่จะใช้เฟรมเวิร์กที่ฉันรู้จักดีมาก (Rails) แทนที่จะใช้ mvc4 หรือไม่? เหตุผลเบื้องหลังการตัดสินใจคือหัวหน้าฝ่ายเทคโนโลยีไม่ทราบว่า Jruby / ทางรถไฟและจะไม่มีทางนำรหัสนี้กลับมาใช้ใหม่ได้ อาร์กิวเมนต์ตัวนับ: เขาจะไม่ให้รหัสและตรงไปตรงมาไม่จำเป็นใน โครงการนี้ ดังนั้นมันไม่สำคัญว่าเขาจะรู้จัก JRuby / …

12
นวกรรมิกที่ตรวจสอบความถูกต้องของข้อโต้แย้งนั้นละเมิด SRP หรือไม่?
ฉันพยายามปฏิบัติตาม Single Responsibility Principle (SRP) ให้มากที่สุดเท่าที่จะเป็นไปได้และคุ้นเคยกับรูปแบบที่แน่นอน (สำหรับ SRP เกี่ยวกับวิธีการ) อาศัยการมอบหมายอย่างมาก ฉันต้องการทราบว่าวิธีการนี้เป็นวิธีที่ดีหรือหากมีปัญหารุนแรงกับมัน ตัวอย่างเช่นในการตรวจสอบอินพุตให้กับ constructor ฉันสามารถแนะนำวิธีต่อไปนี้ ( Streamอินพุตเป็นแบบสุ่มอาจเป็นอะไรก็ได้) private void CheckInput(Stream stream) { if(stream == null) { throw new ArgumentNullException(); } if(!stream.CanWrite) { throw new ArgumentException(); } } วิธีนี้ (arguably) ทำมากกว่าหนึ่งอย่าง ตรวจสอบอินพุต โยนข้อยกเว้นที่แตกต่างกัน เพื่อให้เป็นไปตาม SRP ฉันจึงเปลี่ยนตรรกะเป็น private void CheckInput(Stream stream, params (Predicate<Stream> …

12
มีการตั้งค่าสถานะเพื่อระบุว่าเราควรผิดพลาดหรือไม่
ฉันเพิ่งเริ่มทำงานในที่ที่มีผู้พัฒนาอายุมาก (ประมาณ 50 ปีขึ้นไป) พวกเขาทำงานเกี่ยวกับแอพพลิเคชั่นที่สำคัญเกี่ยวกับการบินที่ระบบไม่สามารถลงได้ เป็นผลให้โปรแกรมเมอร์ที่มีอายุมากกว่ามีแนวโน้มที่จะรหัสด้วยวิธีนี้ เขามีแนวโน้มที่จะวางบูลีนในวัตถุเพื่อระบุว่าควรโยนข้อยกเว้นหรือไม่ ตัวอย่าง public class AreaCalculator { AreaCalculator(bool shouldThrowExceptions) { ... } CalculateArea(int x, int y) { if(x < 0 || y < 0) { if(shouldThrowExceptions) throwException; else return 0; } } } (ในโครงการของเราวิธีการอาจล้มเหลวเนื่องจากเราพยายามใช้อุปกรณ์เครือข่ายที่ไม่สามารถแสดงได้ในเวลาตัวอย่างพื้นที่เป็นเพียงตัวอย่างของการตั้งค่าสถานะข้อยกเว้น) สำหรับฉันนี่ดูเหมือนรหัสกลิ่น การเขียนการทดสอบหน่วยจะซับซ้อนกว่าเล็กน้อยเนื่องจากคุณต้องทดสอบการตั้งค่าสถานะข้อยกเว้นในแต่ละครั้ง นอกจากนี้หากมีสิ่งผิดปกติคุณไม่ต้องการรู้ทันทีหรือไม่? ไม่ควรเป็นความรับผิดชอบของผู้โทรที่จะกำหนดวิธีดำเนินการต่อ ตรรกะ / เหตุผลของเขาคือโปรแกรมของเราต้องการทำสิ่งหนึ่งแสดงข้อมูลให้ผู้ใช้ ข้อยกเว้นอื่นใดที่ไม่ได้ห้ามไม่ให้เราทำเช่นนั้นควรเพิกเฉย ฉันยอมรับว่าพวกเขาไม่ควรเพิกเฉย แต่ควรทำให้เกิดฟองและจัดการโดยบุคคลที่เหมาะสมและไม่จำเป็นต้องจัดการกับสถานะสำหรับสิ่งนั้น นี่เป็นวิธีที่ดีในการจัดการข้อยกเว้นหรือไม่ …

11
ฉันจะโน้มน้าวหัวหน้าของฉันได้อย่างไรว่า ANSI C ไม่เพียงพอสำหรับโครงการใหม่ของเรา [ปิด]
ไม่กี่เดือนที่ผ่านมาเราเริ่มพัฒนาแอพเพื่อควบคุมอุปกรณ์ทดสอบที่พัฒนาขึ้นภายใน บริษัท และบันทึกชุดการวัด ควรมี UI อย่างง่ายและอาจต้องใช้เธรดเนื่องจากการบันทึกอย่างต่อเนื่องที่ต้องดำเนินการ แอปพลิเคชั่นนี้จะถูกใช้เป็นเวลาสองสามปีและจะได้รับการดูแลโดยนักศึกษาวิทยาศาสตร์คอมพิวเตอร์จำนวนหนึ่งในช่วงเวลานี้ เจ้านายของเราจบการศึกษาเมื่อ 30 ปีที่แล้ว (เพื่อไม่ให้ทำผิดฉันมีเวลามากกว่าครึ่งบนหลังของฉันด้วย) และได้รับคำสั่งให้เราพัฒนาแอปพลิเคชั่นนี้ใน ANSI C เหตุผลก็คือเขาเป็นคนเดียวที่ จะอยู่ตลอดเวลาและดังนั้นเขาจะต้องสามารถเข้าใจสิ่งที่เรากำลังทำอยู่ เขาตัดสินว่าเราไม่ควรใช้ประเภทข้อมูลนามธรรม เขายังให้รายชื่อเราด้วยชื่อตัวแปรทั่วโลก (ถอนหายใจ) ที่เขาต้องการให้เราใช้ ฉันลองใช้วิธีนั้นซักพัก แต่ก็ทำให้ฉันช้าลงเพื่อให้แน่ใจว่าการทำงานของตัวชี้ทั้งหมดนั้นปลอดภัยและสตริงทั้งหมดมีขนาดที่ถูกต้อง นอกจากนี้จำนวนบรรทัดของรหัสที่เกี่ยวข้องกับปัญหาที่เกิดขึ้นจริงเป็นเพียงส่วนเล็ก ๆ ของฐานรหัสของเรา หลังจากไม่กี่วันฉันก็ทิ้งทั้งสิ่งและเริ่มต้นใหม่โดยใช้ C # หัวหน้าของเราได้เห็นโปรแกรมกำลังทำงานอยู่และเขาชอบวิธีการทำงาน แต่เขาไม่รู้ว่ามันเขียนในภาษาอื่น สัปดาห์หน้าเราสองคนจะประชุมกันเพื่อดูซอร์สโค้ดเพื่อให้เขา "จะรู้วิธีรักษามัน" ฉันกลัวและฉันอยากได้ยินจากพวกคุณว่าข้อโต้แย้งใดที่ฉันสามารถใช้เพื่อสนับสนุนการตัดสินใจของฉัน คุณขี้ขลาด

5
อะไรคือความแตกต่างระหว่างการใช้อินเทอร์เฟซอย่างชัดเจนหรือโดยปริยาย?
ใน Visual Studio ฉันสามารถคลิกขวาที่อินเทอร์เฟซและเลือกที่จะใช้อินเตอร์เฟสหรือใช้อินเตอร์เฟสได้อย่างชัดเจน public class Test : ITest { public string Id // Generated by Implement Interface { get { throw new NotImplementedException(); } } string ITest.Id // Generated by Implement Interface Explicitly { get { throw new NotImplementedException(); } } } ความแตกต่างเพียงอย่างเดียวที่ฉันเห็นระหว่างสองคือชื่ออินเทอร์เฟซถูกเพิ่มเข้ากับคุณสมบัติของอินเทอร์เฟซและวิธีการเมื่อพวกเขาสร้างถ้าคุณเลือกที่จะใช้อินเทอร์เฟซอย่างชัดเจน ฉันพบว่ามันทำให้โค้ดอ่านง่ายขึ้นเล็กน้อยเนื่องจากฉันสามารถดูว่าวิธีการ / คุณสมบัตินั้นมาจากที่ใด แต่สิ่งนี้สร้างความแตกต่างในวิธีการใช้หรือการคอมไพล์ของคลาสหรือไม่? และมันจะสำคัญหรือไม่ถ้าฉันใช้อินเทอร์เฟซของฉันโดยนัยหรือชัดเจน?
64 c#  syntax 

11
นิพจน์บูลีนขนาดใหญ่สามารถอ่านได้มากกว่านิพจน์เดียวกันที่แบ่งออกเป็นวิธีเพรดิเคตหรือไม่ [ปิด]
จะเข้าใจอะไรได้ง่ายกว่าคำสั่งบูลีนขนาดใหญ่ (ค่อนข้างซับซ้อน) หรือคำเดียวกันนี้แบ่งออกเป็นเมธอดเพรดิเคต (มีโค้ดพิเศษมากมายให้อ่าน) ตัวเลือก 1 นิพจน์บูลีนขนาดใหญ่: private static bool ContextMatchesProp(CurrentSearchContext context, TValToMatch propVal) { return propVal.PropertyId == context.Definition.Id && !repo.ParentId.HasValue || repo.ParentId == propVal.ParentId && ((propVal.SecondaryFilter.HasValue && context.SecondaryFilter.HasValue && propVal.SecondaryFilter.Value == context.SecondaryFilter) || (!context.SecondaryFilter.HasValue && !propVal.SecondaryFilter.HasValue)); } ตัวเลือก 2 เงื่อนไขแบ่งออกเป็นวิธีเพรดิเคต: private static bool ContextMatchesProp(CurrentSearchContext context, TValToMatch propVal) { return …
63 c#  readability 

11
การออกแบบระดับนี้ละเมิดหลักการความรับผิดชอบเดี่ยวหรือไม่?
วันนี้ฉันมีข้อโต้แย้งกับใครบางคน ฉันอธิบายถึงประโยชน์ของการมีรูปแบบโดเมนที่หลากหลายซึ่งต่างจากแบบจำลองโดเมนแบบโลหิตจาง และฉันสาธิตจุดของฉันด้วยคลาสที่เรียบง่ายที่ดูเหมือนว่า: public class Employee { public Employee(string firstName, string lastName) { FirstName = firstName; LastName = lastname; } public string FirstName { get private set; } public string LastName { get; private set;} public int CountPaidDaysOffGranted { get; private set;} public void AddPaidDaysOffGranted(int numberOfdays) { // Do stuff …

3
&& และ || ไม่ได้เป็นตรรกะ แต่ผู้ประกอบการตามเงื่อนไข?
ฉันเป็นบิตสับสนโดยเอกสาร # MSDN C ซึ่งระบุว่า&และ|ผู้ประกอบการเชิงตรรกะและที่&&และ||ผู้ประกอบการที่มีเงื่อนไข ฉันให้โทร&&, ||และ!ดำเนินการทางตรรกะดังนั้นผมผิดหรือเปล่า?

6
เหตุใด C # จึงสร้างด้วยคำหลัก“ ใหม่” และ“ เสมือน + แทนที่” ซึ่งไม่เหมือนกับ Java
ใน Java ไม่มีvirtual, new, overrideคำหลักสำหรับความหมายวิธีการ ดังนั้นการทำงานของวิธีจึงง่ายต่อการเข้าใจ สาเหตุถ้าDerivedClassขยายBaseClassและมีเมธอดที่มีชื่อเดียวกันและลายเซ็นเดียวกันของBaseClass การแทนที่จะเกิดขึ้นที่ polymorphism แบบรันไทม์ (จัดเตรียมเมธอดไม่ใช่static) BaseClass bcdc = new DerivedClass(); bcdc.doSomething() // will invoke DerivedClass's doSomething method. ตอนนี้มาถึง C # จะมีความสับสนมากและยากที่จะเข้าใจวิธีการnewหรือvirtual+deriveหรือใหม่ + เสมือนแทนที่คือการทำงาน ฉันไม่สามารถเข้าใจว่าทำไมในโลกนี้ฉันจะเพิ่มวิธีการในDerivedClassชื่อและลายเซ็นเดียวกันกับBaseClassและกำหนดพฤติกรรมใหม่ แต่ที่ polymorphism เวลาทำงานBaseClassวิธีการจะถูกเรียก! (ซึ่งไม่ใช่การเอาชนะ แต่ควรมีเหตุผล) ในกรณีที่virtual + overrideแม้ว่าการใช้งานเชิงตรรกะที่ถูกต้อง แต่โปรแกรมเมอร์ต้องคิดว่าวิธีการที่เขาควรให้สิทธิ์แก่ผู้ใช้ในการแทนที่ในเวลาที่เข้ารหัส ซึ่งมีข้อดีบางอย่าง(อย่าไปที่นั่นตอนนี้) เหตุใดใน C # จึงมีพื้นที่เหลือเฟือสำหรับการใช้เหตุผลและความสับสน ดังนั้นฉันจึงอาจ reframe คำถามของฉันเป็นที่บริบทของโลกแห่งความจริงฉันควรคิดว่าการใช้งานvirtual + overrideแทนnewและยังใช้newแทนvirtual + …

17
เหตุใดจึงต้องใช้วิธีการ OO แทนคำสั่ง“ สวิตช์” ขนาดใหญ่
ฉันทำงานใน. Net, C # shop และฉันมีเพื่อนร่วมงานที่คอยยืนยันว่าเราควรใช้คำสั่ง Switch ขนาดใหญ่ในรหัสของเราด้วย "คดี" จำนวนมากแทนที่จะเป็นวิธีเชิงวัตถุมากกว่า การโต้เถียงของเขากลับไปอย่างต่อเนื่องตามข้อเท็จจริงที่ว่าคำสั่ง Switch รวบรวมเป็น "ตารางกระโดด cpu" และเป็นตัวเลือกที่เร็วที่สุด (แม้ว่าในสิ่งอื่น ๆ ทีมของเราบอกว่าเราไม่สนใจความเร็ว) ฉันไม่ได้โต้แย้งเรื่องนี้ ... เพราะฉันไม่รู้ว่าเขากำลังพูดถึงเรื่องอะไร เขาพูดถูกมั้ย เขาเพิ่งพูดถึงลาของเขาหรือไม่? แค่พยายามเรียนรู้ที่นี่

7
คุณเข้ารหัสชนิดข้อมูลพีชคณิตในภาษา C # - หรือภาษา Java ได้อย่างไร
มีปัญหาบางอย่างที่แก้ไขได้อย่างง่ายดายโดย Algebraic Data Types เช่น List type สามารถแสดงออกได้อย่างชัดเจนว่า: data ConsList a = Empty | ConsCell a (ConsList a) consmap f Empty = Empty consmap f (ConsCell a b) = ConsCell (f a) (consmap f b) l = ConsCell 1 (ConsCell 2 (ConsCell 3 Empty)) consmap (+1) l ตัวอย่างเฉพาะนี้อยู่ใน Haskell แต่มันจะคล้ายกันในภาษาอื่นที่มีการสนับสนุนเนทิฟสำหรับประเภทข้อมูลพีชคณิต …

9
ความสามารถในการอ่านและการบำรุงรักษากรณีพิเศษของการเขียนการเรียกฟังก์ชันที่ซ้อนกัน
รูปแบบการเข้ารหัสของฉันสำหรับการเรียกใช้ฟังก์ชันที่ซ้อนกันมีดังต่อไปนี้: var result_h1 = H1(b1); var result_h2 = H2(b2); var result_g1 = G1(result_h1, result_h2); var result_g2 = G2(c1); var a = F(result_g1, result_g2); ฉันเพิ่งเปลี่ยนเป็นแผนกที่ใช้รูปแบบการเข้ารหัสต่อไปนี้เป็นอย่างมาก: var a = F(G1(H1(b1), H2(b2)), G2(c1)); ผลของวิธีการเข้ารหัสของฉันคือในกรณีที่ฟังก์ชั่นการขัดข้อง Visual Studio สามารถเปิดการถ่ายโอนข้อมูลที่สอดคล้องกันและระบุบรรทัดที่ปัญหาเกิดขึ้น (ฉันกังวลเป็นพิเศษเกี่ยวกับการละเมิดการเข้าถึง) ฉันกลัวว่าในกรณีที่เกิดความผิดพลาดเนื่องจากปัญหาเดียวกันที่ตั้งโปรแกรมไว้ในวิธีแรกฉันจะไม่สามารถรู้ได้ว่าฟังก์ชันใดที่ทำให้เกิดความผิดพลาด ในทางกลับกันยิ่งการประมวลผลที่คุณใส่ในบรรทัดมากขึ้นเท่าไรคุณก็ยิ่งได้รับตรรกะมากขึ้นในหน้าเดียวซึ่งจะช่วยเพิ่มความสามารถในการอ่าน ความกลัวของฉันถูกต้องหรือฉันขาดอะไรไปและโดยทั่วไปแล้วสิ่งใดที่เป็นที่นิยมในสภาพแวดล้อมเชิงพาณิชย์ อ่านหรือบำรุงรักษา? ฉันไม่รู้ว่ามันเกี่ยวข้องหรือไม่ แต่เรากำลังทำงานใน C ++ (STL) / C #

6
เราควรสร้าง HttpClient อินสแตนซ์ใหม่สำหรับคำขอทั้งหมดหรือไม่
เมื่อเร็ว ๆ นี้ฉันได้พบกับบล็อกโพสต์นี้จากอสุรกาย asp.net ซึ่งพูดถึงปัญหาเกี่ยวกับการใช้HttpClientในวิธีต่อไปนี้: using(var client = new HttpClient()) { } ตามโพสต์ในบล็อกถ้าเรากำจัดHttpClientหลังจากทุกคำขอมันสามารถเปิดการเชื่อมต่อ TCP ได้ System.Net.Sockets.SocketExceptionนี้อาจจะนำไปสู่การ วิธีที่ถูกต้องตามโพสต์คือการสร้างอินสแตนซ์เดียวHttpClientซึ่งจะช่วยลดการสิ้นเปลืองซ็อกเก็ต จากโพสต์: หากเราแบ่งปัน HttpClient อินสแตนซ์เดียวเราสามารถลดการใช้ซ็อกเก็ตได้โดยการใช้ซ้ำ: namespace ConsoleApplication { public class Program { private static HttpClient Client = new HttpClient(); public static void Main(string[] args) { Console.WriteLine("Starting connections"); for(int i = 0; i<10; i++) { …
57 c#  http-request 

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