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

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

2
เราควรรวบรวมเว็บไซต์ของเราเป็น dll เดียวหรือ dll ต่อหน้า?
เรากำลังพัฒนาโครงการใหม่ที่จะนำไปใช้กับเว็บไซต์ลูกค้าจำนวนมาก โครงการนี้มี GUI บนเว็บเป็นหนึ่งใน "จุดเชื่อมต่อ" ความเร็วของอินเทอร์เฟซทางเว็บเป็นสิ่งสำคัญสำหรับโครงการนี้รองจากความปลอดภัยเท่านั้น ในอดีตเราเคยสร้าง "เว็บไซต์" ใน Visual Studio ซึ่งเมื่อเผยแพร่แล้วจะส่งผลให้หนึ่งไฟล์ dll และไฟล์ aspx หนึ่งไฟล์สำหรับแต่ละหน้าภายในระบบ อย่างไรก็ตามฉันทราบว่าคุณสามารถสร้าง "เว็บแอปพลิเคชัน" และรวบรวมทุกอย่างให้เป็น dll เดียว สำหรับฉัน (ไม่มีข้อมูลจริงเพียงแค่ความรู้สึก) การรวบรวมเว็บไซต์เป็น dll เดียวดูเหมือนว่ามันจะดีกว่าสำหรับการรักษาความปลอดภัยและความเร็ว (ถ้าเพียงเล็กน้อย) เราควรพิจารณาถึงสิ่งใดบ้างและมีข้อผิดพลาดที่ชัดเจนใด ๆ ที่เราควรทราบเมื่อเลือกวิธีการที่เหมาะสมสำหรับเรา

5
การแก้ไขวัตถุที่ส่งผ่านโดยการอ้างอิงเป็นการปฏิบัติที่ไม่ดี
ในอดีตฉันมักจะทำการจัดการวัตถุส่วนใหญ่ด้วยวิธีการหลักที่กำลังสร้าง / อัปเดต แต่ฉันพบว่าตัวเองกำลังใช้วิธีการที่แตกต่างกันเมื่อเร็ว ๆ นี้และฉันอยากรู้ว่ามันเป็นการปฏิบัติที่ไม่ดีหรือไม่ นี่คือตัวอย่าง สมมติว่าฉันมีพื้นที่เก็บข้อมูลที่ยอมรับUserเอนทิตี แต่ก่อนที่จะแทรกเอนทิตีเราเรียกวิธีการบางอย่างเพื่อให้แน่ใจว่าฟิลด์ทั้งหมดตั้งค่าเป็นสิ่งที่เราต้องการ ตอนนี้แทนที่จะเรียกวิธีการและตั้งค่าเขตข้อมูลจากภายในวิธีการแทรกฉันเรียกชุดวิธีการเตรียมที่รูปร่างวัตถุก่อนที่จะแทรก วิธีเก่า: public void InsertUser(User user) { user.Username = GenerateUsername(user); user.Password = GeneratePassword(user); context.Users.Add(user); } วิธีการใหม่: public void InsertUser(User user) { SetUsername(user); SetPassword(user); context.Users.Add(user); } private void SetUsername(User user) { var username = "random business logic"; user.Username = username; } private …

6
อะไรคือข้อเสียของประเภทที่ไม่เปลี่ยนรูป?
ฉันเห็นตัวเองโดยใช้ประเภทมากขึ้นและเปลี่ยนรูปมากขึ้นเมื่อกรณีของชั้นไม่ได้คาดว่าจะมีการเปลี่ยนแปลง ต้องใช้งานมากขึ้น (ดูตัวอย่างด้านล่าง) แต่ทำให้การใช้ประเภทในสภาพแวดล้อมแบบมัลติเธรดง่ายขึ้น ในเวลาเดียวกันฉันไม่ค่อยเห็นประเภทที่ไม่เปลี่ยนรูปในแอปพลิเคชั่นอื่น ๆ แม้ว่าความไม่แน่นอนจะไม่เกิดประโยชน์ก็ตาม คำถาม:ทำไมประเภทที่ไม่เปลี่ยนรูปแบบจึงไม่ค่อยถูกใช้ในแอปพลิเคชันอื่น เป็นเพราะมันนานกว่าที่จะเขียนโค้ดสำหรับประเภทที่ไม่เปลี่ยนรูป หรือฉันกำลังพลาดบางสิ่งบางอย่างและมีข้อบกพร่องที่สำคัญเมื่อใช้ประเภทที่ไม่เปลี่ยนรูปแบบ? ตัวอย่างจากชีวิตจริง สมมติว่าคุณได้รับWeatherRESTful API เช่นนั้น: public Weather FindWeather(string city) { // TODO: Load the JSON response from the RESTful API and translate it into an instance // of the Weather class. } สิ่งที่เราจะเห็นโดยทั่วไปคือ (บรรทัดใหม่และความคิดเห็นถูกลบออกเพื่อย่อรหัส): public sealed class Weather { public City …
12 c#  immutability 

1
ใช้รูปแบบผู้เข้าชมที่มีลำดับชั้นวัตถุขนาดใหญ่
บริบท ฉันได้ใช้กับลำดับชั้นของวัตถุ (ต้นไม้นิพจน์) รูปแบบผู้เข้าชม "หลอก" (หลอกเพราะมันไม่ได้ใช้ส่งสองครั้ง): public interface MyInterface { void Accept(SomeClass operationClass); } public class MyImpl : MyInterface { public void Accept(SomeClass operationClass) { operationClass.DoSomething(); operationClass.DoSomethingElse(); // ... and so on ... } } การออกแบบนี้เป็นที่ตั้งคำถาม แต่ค่อนข้างสะดวกสบายเนื่องจากจำนวนการใช้งานของ MyInterface มีความสำคัญ (~ 50 หรือมากกว่า) และฉันไม่จำเป็นต้องเพิ่มการดำเนินการเพิ่มเติม การใช้งานแต่ละอย่างนั้นไม่ซ้ำกัน (เป็นนิพจน์หรือตัวดำเนินการที่แตกต่างกัน) และบางรายการเป็นคอมโพสิต (เช่นโหนดโอเปอเรเตอร์ที่จะมีโอเปอเรเตอร์ / โหนดใบไม้) Traversal …

4
วัตถุธุรกิจภายใน Data Access Layer
ดังนั้นฉันจึงสร้าง data access layer ผ่านทาง TDD และได้เข้าหาข้อกังวลเล็กน้อย ฉันไม่ควรเริ่มต้นเส้นทางที่ผิดดังนั้นฉันคิดว่าฉันขอให้พวกคุณดูว่าความคิดของฉันสอดคล้องกับสถาปัตยกรรมที่สะอาดหรือไม่ วิธีการภายใน Data Access Layer ของฉัน (สั้นสำหรับ DAL) จะค่อนข้างง่าย พวกเขาเป็นไปตามขั้นตอนการจัดเก็บในฐานข้อมูล (ไม่มีวิธีอื่นในการโทรเข้าเพื่อรักษาความสะอาด) และพวกเขามีพารามิเตอร์เดียวกันกับที่ทำ พวกเขาเพียงแค่เชื่อมต่อกับฐานข้อมูลและส่งคืนผลลัพธ์แบบสอบถาม นี่คือตัวอย่างหนึ่ง: public int DeleteRecord(int recordId) { recordId.RequireThat("recordId").NotZeroOrLess(); List<SqlParameter> parameters = new List<SqlParameter>(); parameters.Add(new SqlParameter { ParameterName = "@RecordId", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = recordId}); return this.ExecuteNonQuery("DeleteRecord", parameters.ToArray()); …

5
เหตุใดจึงมีวิธีที่ส่งกลับ bool / int และมีวัตถุจริงเป็นพารามิเตอร์ส่งออก
ฉันเห็นรูปแบบรหัสต่อไปนี้ทั่วทุกแห่งใน codebase ของ บริษัท ของฉัน (แอปพลิเคชัน. NET 3.5): bool Foo(int barID, out Baz bazObject) { try { // do stuff bazObject = someResponseObject; return true; } catch (Exception ex) { // log error return false; } } // calling code BazObject baz = new BazObject(); fooObject.Foo(barID, out baz); if (baz …

8
เป็นไปได้หรือไม่ที่จะเก็บรหัสการบันทึกไว้อย่างสมบูรณ์นอกตรรกะทางธุรกิจ
ด้วยความช่วยเหลือของ AOP ฉันสามารถลบรหัสบันทึกจากตรรกะทางธุรกิจของฉัน แต่ฉันคิดว่ามันสามารถใช้เพื่อบันทึกสิ่งที่เรียบง่ายเท่านั้น (เช่นการเข้า / ออกวิธีการและค่าพารามิเตอร์) อย่างไรก็ตามถ้าฉันต้องลงชื่อเข้าใช้บางอย่างในตรรกะทางธุรกิจของฉัน เช่น public void SomeDomainMethod(string id) { //Get user by Id User user = Users.Get(id); if (user == null) { Log.Warn("user is not existed"); //<----------------- Log A throw new InvalidOperationException("user is not existed"); } //Step 1 while(true) { //do something } Log.Info("Step 1 …

4
วิธีที่สะอาดที่สุดในการเขียนซอฟต์แวร์ที่มีขั้นตอนตามหลักเหตุผลในภาษา OO
ฉันเป็นวิศวกรไฟฟ้าและฉันไม่รู้ว่าฉันทำอะไรอยู่ โปรดบันทึกผู้ดูแลรหัสของฉันในอนาคต เมื่อเร็ว ๆ นี้ฉันได้ทำงานกับโปรแกรมขนาดเล็กจำนวนมาก (ใน C #) ซึ่งฟังก์ชั่นการใช้งานเป็น "ขั้นตอน" ตามหลักเหตุผล ตัวอย่างเช่นหนึ่งในนั้นคือโปรแกรมที่รวบรวมข้อมูลจากฐานข้อมูลต่าง ๆ ใช้ข้อมูลนั้นเพื่อสร้างเรียงลำดับของหน้าสรุปพิมพ์และจากนั้นออก ตรรกะที่จำเป็นสำหรับทั้งหมดนั้นอยู่ที่ประมาณ 2,000 บรรทัด แน่นอนฉันไม่ต้องการสิ่งทั้งหมดในที่เดียวmain()แล้ว "ทำความสะอาด" กับ#regions เป็นนักพัฒนาก่อนหน้านี้ได้ทำ (ตัวสั่น) นี่คือบางสิ่งที่ฉันได้ลองไปแล้วโดยที่ไม่พึงพอใจมาก: สร้างยูทิลิตี้แบบคงที่สำหรับการใช้งานแต่ละบิตอย่างคร่าวๆเช่น DatabaseInfoGetter, SummaryPageGenerator และ PrintUtility ทำให้ฟังก์ชั่นหลักดูเหมือนว่า: int main() { var thisThing = DatabaseInfoGetter.GetThis(); var thatThing = DatabaseInfoGetter.GetThat(); var summary = SummaryPageGenerator.GeneratePage(thisThing, thatThing); PrintUtility.Print(summary); } สำหรับโปรแกรมหนึ่งฉันยังไปกับอินเตอร์เฟส int main() …

5
ข้อผิดพลาดของการออกแบบโดเมนขับเคลื่อนด้วย Entity Framework
บทเรียนจำนวนมากเกี่ยวกับ DDD ที่ฉันศึกษาส่วนใหญ่จะครอบคลุมทฤษฎี พวกเขาทั้งหมดมีตัวอย่างรหัสพื้นฐาน (Pluralsight และคล้ายคลึงกัน) บางคนพยายามสร้างบทเรียนที่ครอบคลุม DDD ด้วย EF บนเว็บ หากคุณเริ่มศึกษาพวกเขาเพียงชั่วครู่ - คุณสังเกตได้อย่างรวดเร็วว่าพวกเขาแตกต่างกันมาก บางคนแนะนำให้แอพพลิเคชั่นมีน้อยที่สุดและเพื่อหลีกเลี่ยงการแนะนำเลเยอร์เพิ่มเติมเช่นที่เก็บข้อมูลด้านบนของ EFคนอื่น ๆ กำลังสร้างเลเยอร์เพิ่มเติมอย่างแน่นอนซึ่งมักจะละเมิด SRP ด้วยการฉีดDbContextเข้าไปใน Aggregate Roots ฉันขอโทษอย่างมากถ้าฉันถามคำถามตามความคิดเห็น แต่ ... เมื่อมาถึงการปฏิบัติ - Entity Framework เป็นหนึ่งใน ORMs ที่ทรงพลังและใช้กันอย่างแพร่หลาย คุณจะไม่พบหลักสูตรที่ครอบคลุมที่ครอบคลุม DDD ด้วยโชคไม่ดี ประเด็นสำคัญ: Entity Framework นำ UoW & Repository ( DbSet) ออกจากกล่อง รุ่นของคุณกับ EF มีคุณสมบัติการนำทาง กับ EF …

2
อินเทอร์เฟซ IComparable ล้าสมัย /“ เป็นอันตราย” หรือไม่
IComparable ใช้งานได้ทางเดียวเท่านั้น สมมติว่าคุณมีEmployeeชั้นเรียน ในมุมมองหนึ่งคุณต้องการแสดงทั้งหมดEmployeesเรียงตามชื่อ - ในอีกมุมมองตามที่อยู่ คุณจะประสบความสำเร็จได้อย่างไร ไม่อยู่กับIComparableอย่างน้อยก็ไม่มีทางที่เป็นไปได้ IComparable มีเหตุผลในสถานที่ที่ไม่ถูกต้อง .Sort()อินเตอร์เฟซที่ถูกนำมาใช้โดยการเรียก ในมุมมองที่แสดงCustomerเรียงตามชื่อไม่มีรหัสเลยที่จะบอกว่ามันจะถูกเรียงลำดับอย่างไร ในทางกลับกันCustomerคลาสจะสมมติว่ามันจะถูกใช้อย่างไรในกรณีนี้มันจะถูกใช้ในรายการเรียงตามชื่อ IComparable มีการใช้งานโดยปริยาย ในการเปรียบเทียบกับทางเลือกมันเป็นเรื่องยากมากที่จะเห็นว่ามีการใช้ตรรกะการเปรียบเทียบหรือไม่ สมมติว่า IDE มาตรฐานของคุณและเริ่มจากCustomerชั้นเรียนฉันจะต้อง ค้นหาการอ้างอิงทั้งหมดถึง Customer ค้นหาการอ้างอิงเหล่านั้นที่ใช้ในรายการ ตรวจสอบว่ารายการเหล่านั้นเคย.Sort()เรียกพวกเขา มีอะไรที่แย่กว่านั้นถ้าคุณลบการIComparableใช้งานที่ยังคงใช้อยู่คุณจะไม่ได้รับข้อผิดพลาดหรือคำเตือน สิ่งเดียวที่คุณจะได้รับคือพฤติกรรมที่ไม่ถูกต้องในทุกสถานที่ที่คลุมเครือเกินกว่าที่คุณจะนึกถึง ปัญหาเหล่านี้รวมกันรวมถึงข้อกำหนดที่เปลี่ยนแปลง เหตุผลที่ฉันมาคิดเรื่องนี้ก็เพราะมันผิดสำหรับฉัน ฉันมีความสุขที่ใช้IComparableในใบสมัครของฉันเป็นเวลา 2 ปีแล้ว ตอนนี้ความต้องการเปลี่ยนแปลงและสิ่งที่ต้องเรียงลำดับใน 2 วิธีที่แตกต่างกัน สังเกตว่าไม่มีความสนุกที่ทำตามขั้นตอนที่อธิบายไว้ในส่วนก่อนหน้า คำถาม ปัญหาเหล่านี้ทำให้ฉันคิดว่าIComparableเป็นด้อยกว่าIComparerหรือ.OrderBy()จนถึงจุดที่ไม่เห็นกรณีการใช้งานที่ถูกต้องที่จะไม่ได้รับการบริการที่ดีขึ้นโดยทางเลือกที่ จะดีกว่าเสมอที่จะใช้IComparerหรือ LINQ หรือมีข้อดี / กรณีการใช้งานที่ฉันไม่เห็นที่นี่?
11 c#  sorting  comparison 

2
การทดสอบหน่วยเพื่อทดสอบการสร้างวัตถุโดเมน
ฉันมีการทดสอบหน่วยซึ่งมีลักษณะดังนี้: [Test] public void Should_create_person() { Assert.DoesNotThrow(() => new Person(Guid.NewGuid(), new DateTime(1972, 01, 01)); } ฉันยืนยันว่ามีการสร้างวัตถุบุคคลที่นี่เช่นการตรวจสอบความถูกต้องจะไม่ล้มเหลว ตัวอย่างเช่นหาก Guid เป็นโมฆะหรือวันเดือนปีเกิดเร็วกว่า 01/01/1900 การตรวจสอบจะล้มเหลวและข้อยกเว้นจะถูกโยนทิ้ง (หมายถึงการทดสอบล้มเหลว) ตัวสร้างมีลักษณะดังนี้: public Person(Id id, DateTime dateOfBirth) : base(id) { if (dateOfBirth == null) throw new ArgumentNullException("Date of Birth"); elseif (dateOfBith < new DateTime(1900,01,01) throw new ArgumentException("Date of Birth"); …

5
รูปแบบการนับการอ้างอิงสำหรับภาษาที่มีการจัดการหน่วยความจำ?
Java และ. NET มีตัวรวบรวมขยะที่ยอดเยี่ยมที่จัดการหน่วยความจำสำหรับคุณและรูปแบบที่สะดวกสำหรับการปล่อยวัตถุภายนอก ( Closeable, IDisposable) ได้อย่างรวดเร็วแต่เฉพาะในกรณีที่พวกเขาเป็นเจ้าของวัตถุเดียว ในบางระบบทรัพยากรอาจจำเป็นต้องใช้อย่างอิสระโดยสององค์ประกอบและจะได้รับการปล่อยตัวก็ต่อเมื่อทั้งสององค์ประกอบปล่อยทรัพยากร ใน C ++ ยุคใหม่คุณจะแก้ปัญหานี้ด้วย a shared_ptrซึ่งจะปล่อยทรัพยากรอย่างแน่นอนเมื่อทุกอย่างshared_ptrถูกทำลาย มีรูปแบบเอกสารที่ผ่านการพิสูจน์แล้วสำหรับการจัดการและปล่อยทรัพยากรที่มีราคาแพงซึ่งไม่มีเจ้าของคนเดียวในระบบที่รวบรวมขยะแบบไม่มุ่งเน้นวัตถุหรือไม่?

1
ฉันจะใช้รูปแบบ MVC กับแอปพลิเคชัน C # WinForms ได้อย่างไร
ฉันเป็นนักพัฒนา C ++ ที่ใช้รูปแบบ MVC ในการออกแบบ GUI นับตั้งแต่นั้นมา เมื่อเร็ว ๆ นี้ฉันต้องการกลับสู่ C # และฉันตั้งค่าแอปพลิเคชัน Windows Forms แต่ตอนนี้ฉันหลงทางเล็กน้อยเกี่ยวกับวิธีการผลักดันมันไปยังโครงสร้างที่สอดคล้องกับ MVC สิ่งที่ฉันกำลังพยายามทำคือ "ประกาศ" คลาสที่ฉันได้รับสำหรับ WinForms เป็นมุมมองและเพิ่มคลาสสำหรับโมเดลและตัวควบคุมในพื้นหลัง อย่างไรก็ตามฉันไม่แน่ใจว่าจะโต้ตอบกับเหตุการณ์ได้อย่างไรเช่นคลิกปุ่ม โดยปกติฉันจะเปลี่ยนเส้นทางเหตุการณ์เหล่านี้ไปยังตัวควบคุมและดำเนินการกับมุมมองเมื่อฉันทำเสร็จแล้ว สิ่งนี้ทำให้รู้สึกไม่พอใจในกลุ่มดาวนี้ ตัวอย่างเช่นถ้าฉันต้องการใช้ปุ่ม "ออกจาก" ฉันจะต้องเปลี่ยนเส้นทางเหตุการณ์จากมุมมองไปยังตัวควบคุมรวมทั้งใช้วิธีสาธารณะเพิ่มเติมในมุมมองของฉันซึ่งสามารถเรียกได้จากตัวควบคุมในขณะที่ฉัน สามารถเรียก Close () จากมุมมองในตัวอย่างแรกได้ คุณมีคำแนะนำใด ๆ สำหรับฉัน ความเข้าใจของฉันเกี่ยวกับ Windows Forms ใน C # นั้นยังไม่ดีพอที่จะลองใช้งาน MVC หรือไม่? ฉันให้แบบฟอร์มในชั้นเรียนมีบทบาทที่ไม่ถูกต้องหรือไม่? MVC เป็นเพียงสถาปัตยกรรมที่ไม่เหมาะสมสำหรับกรณีการใช้งานนี้หรือไม่?
11 c#  mvc  winforms 

4
จะระบุ precondition (LSP) ในอินเตอร์เฟสใน C # ได้อย่างไร?
สมมติว่าเรามีส่วนต่อไปนี้ - interface IDatabase { string ConnectionString{get;set;} void ExecuteNoQuery(string sql); void ExecuteNoQuery(string[] sql); //Various other methods all requiring ConnectionString to be set } เงื่อนไขก่อนกำหนดคือ ConnectionString จะต้องตั้งค่า / intialized ก่อนที่จะสามารถเรียกใช้วิธีการใด ๆ เงื่อนไขนี้สามารถทำได้ค่อนข้างโดยผ่านการเชื่อมต่อสายผ่านตัวสร้างถ้า IDatabase เป็นระดับนามธรรมหรือคอนกรีต - abstract class Database { public string ConnectionString{get;set;} public Database(string connectionString){ ConnectionString = connectionString;} public void ExecuteNoQuery(string …

3
Entity Framework และการหลีกเลี่ยง Anemic Domain Model
ในตรรกะทางธุรกิจของเราบางครั้งเรามีวิธีการที่กำหนดไว้ดังนี้: User.ResetCourse(Course courseToReset) ปัญหาคือทั้งผู้ใช้และหลักสูตรเป็นวัตถุพร็อกซี Entity Framework ซึ่งหมายความว่าเมื่อเราเข้าสู่คุณสมบัติการนำทางทั้งผู้ใช้หรือหลักสูตรมันสามารถทำให้เกิดความนิยมอย่างมากในฐานข้อมูลเพราะวัตถุเหล่านั้นไม่ได้เป็น IQueryable ดังนั้นจึงวนซ้ำผ่านพวกเขาตามปกติ เพื่อแก้ปัญหานี้เราเปลี่ยนลายเซ็นเป็น: User.ResetCourse(MyDBContext db, Course courseToReset) ซึ่งหมายความว่าเราสามารถสอบถามฐานข้อมูลโดยตรงเพื่อทำการเปลี่ยนแปลงที่เราต้องการอย่างมีประสิทธิภาพ แต่การส่งบริบทฐานข้อมูลไปยังวัตถุทางธุรกิจดูเหมือนจะผิดพลาด หลังจากนั้นเราย้ายไปยังชั้นบริการที่ให้ผู้ใช้ซึ่งหมายความว่าเรามีสิ่งที่ชอบ: CourseService.ResetForUser(Course courseToReset, User forUser) บริการนี้มีการอ้างอิงถึง DBContext ที่ถูกสร้าง แต่ตอนนี้วัตถุธุรกิจของเราเป็นเพียงถุงข้อมูลที่ไม่มีพฤติกรรม (เช่นรุ่น Anemic Domain Model) เราจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร

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