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

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

5
การปรับเปลี่ยนวิธีการแบบยาว: ออกตามที่เป็นเทียบกับการแยกออกเป็นวิธีการเปรียบเทียบกับการใช้ฟังก์ชันในเครื่อง
สมมติว่าฉันมีวิธียาวเช่นนี้ public void SomeLongMethod() { // Some task #1 ... // Some task #2 ... } วิธีนี้ไม่มีชิ้นส่วนซ้ำ ๆ ที่ควรเคลื่อนย้ายไปยังวิธีอื่นหรือฟังก์ชั่นในเครื่อง มีหลายคน (รวมถึงฉัน) ที่คิดว่าวิธีการที่ยาวนานนั้นเป็นกลิ่นรหัส นอกจากนี้ผมไม่ชอบความคิดของการใช้#region(s) ที่นี่มีคำตอบที่เป็นที่นิยมมากอธิบายว่าทำไมนี้ไม่ดี แต่ถ้าฉันแยกรหัสนี้เป็นวิธีการ public void SomeLongMethod() { Task1(); Task2(); } private void Task1() { // Some task #1 ... } private void Task2() { // Some task #1 …

3
ฉันจะออกแบบวิธี TryParse ซึ่งให้ข้อมูลโดยละเอียดในกรณีที่เกิดข้อผิดพลาดในการวิเคราะห์คำได้อย่างไร
เมื่อแยกวิเคราะห์อินพุตของผู้ใช้นั้นโดยทั่วไปจะแนะนำให้ไม่โยนและจับข้อยกเว้น แต่แทนที่จะใช้วิธีการตรวจสอบ ใน. NET BCL สิ่งนี้จะเป็นความแตกต่างระหว่าง (เช่นint.Parseการยกเว้นข้อมูลที่ไม่ถูกต้อง) และint.TryParse(ผลตอบแทนfalseจากข้อมูลที่ไม่ถูกต้อง) ฉันกำลังออกแบบของตัวเอง Foo.TryParse(string s, out Foo result) วิธีการและฉันไม่แน่ใจเกี่ยวกับค่าตอบแทน ฉันสามารถใช้boolเหมือนตัวเอง .NET ของTryParseวิธีการ แต่ที่จะให้ข้อบ่งชี้เกี่ยวกับการไม่มีชนิดของข้อผิดพลาดเกี่ยวกับเหตุผลที่แน่นอนว่าทำไม ไม่สามารถแยกวิเคราะห์เป็นs Foo(ตัวอย่างเช่นsอาจมีวงเล็บที่ไม่ตรงกันหรือจำนวนอักขระที่Barไม่ตรงกันหรือ a โดยไม่ต้องสอดคล้องกันBazฯลฯ ) ในฐานะผู้ใช้ API ฉันไม่ชอบวิธีการที่เพิ่งกลับมาประสบความสำเร็จ / ล้มเหลวบูลีนโดยไม่บอกฉันว่าทำไมการดำเนินการล้มเหลว สิ่งนี้ทำให้การดีบั๊กเป็นเกมที่คาดเดาและฉันไม่ต้องการให้ลูกค้าของห้องสมุดของฉันทำเช่นนั้น ฉันสามารถคิดถึงวิธีแก้ปัญหามากมายสำหรับปัญหานี้ (รหัสสถานะส่งคืนส่งคืนสตริงข้อผิดพลาดเพิ่มสตริงข้อผิดพลาดเป็นพารามิเตอร์ออก) แต่พวกเขาทั้งหมดมีข้อเสียตามลำดับและฉันต้องการให้สอดคล้องกับอนุสัญญาของ Framework ของ ดังนั้นคำถามของฉันมีดังนี้ มีวิธีใดใน. NET Framework ที่ (a) แยกวิเคราะห์อินพุตโดยไม่ส่งข้อยกเว้นและ (b) ยังคงส่งกลับข้อมูลรายละเอียดข้อผิดพลาดมากกว่าบูลีนจริง / เท็จง่าย ๆ หรือไม่?
9 c#  .net  api-design 

4
บริบทแวดล้อมกับการสร้างคอนสตรัคชัน
ฉันมีคลาสแกนกลางจำนวนมากที่ต้องการ ISessionContext ของฐานข้อมูล ILogManager สำหรับบันทึกและ IService ที่ใช้สำหรับสื่อสารกับบริการอื่น ฉันต้องการใช้การฉีดพึ่งพาสำหรับชั้นนี้ใช้โดยชั้นเรียนหลักทั้งหมด ฉันใช้งานได้สองแบบ คลาสหลักที่ยอมรับ IAmbientContext กับคลาสทั้งหมดสามคลาสหรือฉีดสำหรับคลาสทั้งหมดสามคลาส public interface ISessionContext { ... } public class MySessionContext: ISessionContext { ... } public interface ILogManager { } public class MyLogManager: ILogManager { ... } public interface IService { ... } public class MyService: IService { ... } …

2
ข้อมูลใดที่ควรเก็บไว้เป็น "อ้างสิทธิ์"
ใน ASP.Net Core ฉันพบว่าการClaimsอนุญาตเป็นวิธีที่ไม่เป็นรูปธรรมมาก เราสามารถเพิ่มอะไรก็ได้ClaimTypeและClaimValueจับคู่; กลุ่ม, ชื่อ, นามสกุล, brithdate, canAccessThisURI, isEditor, ฯลฯ อย่างไรก็ตามวิธีการนี้ (การจัดเก็บสิ่งที่สามารถจัดเก็บเป็นสิทธิเรียกร้อง) จะทำให้ตารางการเรียกร้องจำนวนมากซึ่งรวมถึง 50% ของข้อมูลแอปพลิเคชันของฉัน ฉันสงสัยว่าเป็นวิธีปฏิบัติที่ดีข้อมูลทั่วไปที่ควรจัดเก็บเป็นการอ้างสิทธิ์คืออะไร

7
หลีกเลี่ยงกฎในพ่อมดและนักรบ
ในบทความบล็อกชุดนี้ Eric Lippert อธิบายถึงปัญหาในการออกแบบเชิงวัตถุโดยใช้พ่อมดและนักรบเป็นตัวอย่างโดยที่: abstract class Weapon { } sealed class Staff : Weapon { } sealed class Sword : Weapon { } abstract class Player { public Weapon Weapon { get; set; } } sealed class Wizard : Player { } sealed class Warrior : Player { } แล้วเพิ่มกฎสองสามข้อ: …

3
รูปแบบ C # เพื่อจัดการ "ฟังก์ชั่นฟรี" อย่างหมดจดหลีกเลี่ยงคลาสแบบคงที่ "ยูทิลิตี้ถุง" แบบคงที่
เมื่อไม่นานมานี้ฉันได้ตรวจสอบคลาสแบบคงที่ "ยูทิลิตี้กระเป๋า" คลาสแบบคงที่ที่ลอยอยู่รอบ ๆ โค้ดโค้ด C # ขนาดใหญ่บางตัวที่ฉันทำงานด้วย // Helpers.cs public static class Helpers { public static void DoSomething() {} public static void DoSomethingElse() {} } วิธีการเฉพาะที่ฉันตรวจสอบคือ ส่วนใหญ่ไม่เกี่ยวข้องกัน โดยไม่ต้องระบุสถานะชัดเจนตลอดการขอร้อง ขนาดเล็กและ แต่ละประเภทมีการบริโภคหลากหลายประเภท แก้ไข: ข้างต้นไม่ได้มีไว้เพื่อรายการปัญหาที่ถูกกล่าวหา นี่คือรายการลักษณะทั่วไปของวิธีการเฉพาะที่ฉันรีวิว เป็นบริบทที่ช่วยให้คำตอบนำเสนอโซลูชันที่เกี่ยวข้องมากขึ้น สำหรับคำถามนี้ฉันจะอ้างถึงวิธีการชนิดนี้เป็น GLUM (วิธีการใช้งานที่มีน้ำหนักเบาทั่วไป) ความหมายเชิงลบของ "กลัม" มีวัตถุประสงค์บางส่วน ฉันขอโทษถ้าสิ่งนี้เจอในฐานะปุนโง่ แม้แต่การทิ้งความสงสัยเริ่มต้นของฉันเองเกี่ยวกับ GLUMs ฉันไม่ชอบสิ่งต่อไปนี้เกี่ยวกับเรื่องนี้: คลาสแบบสแตติกกำลังถูกใช้เป็นเนมสเปซ แต่เพียงผู้เดียว ตัวระบุคลาสแบบสแตติกนั้นไม่มีความหมาย เมื่อเพิ่ม GLUM …

6
การทดสอบหน่วยควรครอบคลุมซอฟต์แวร์ 'ที่ใช้งานได้' เท่านั้น
เรากำลังใช้StructureMapในโครงการพัฒนาซอฟต์แวร์ใหม่ หนึ่งในสมาชิกในทีมได้ใช้การทดสอบหน่วยที่โดยทั่วไปแล้วทดสอบการกำหนดค่าคอนเทนเนอร์ของStructureMap ทำได้โดยทำสิ่งต่อไปนี้ นับจำนวนอินสแตนซ์ของแอสเซมบลีที่กำหนดค่าสำหรับคลาสใน namespace ของแอปพลิเคชันของเรา กำหนดอินสแตนซ์ที่คาดหวังในระดับชั้นเรียน ยืนยันว่าอินสแตนซ์ที่คาดหวังตรงกับอินสแตนซ์ที่พบทั้งหมด ยืนยันว่าอินสแตนซ์ที่คาดหวังตรงกับที่กำหนดไว้ในการทดสอบ ตัวอย่างของสิ่งนี้คือ; var repositories = container.GetAllInstances<IEnvironmentRepository>(); Assert.AreEqual(1, repositories .Count()); foundInstances = foundInstances + repositories .Count(); นอกจากนี้เรายังมี 'การทดสอบหน่วย' สำหรับคลาสต่อไปนี้ public MyClass(IEnvironmentRepository environmentRepository) { } ในการทดสอบเหล่านี้เราเยาะเย้ย IEnvironmentRepository ดังนั้นจะไม่ถูกฉีดจากภาชนะที่จะเกิดขึ้นในระบบสด เพื่อนร่วมงานเพิกเฉยต่อการทดสอบหน่วยในการกำหนดค่าโครงสร้างแผนผังพร้อมแสดงความคิดเห็นตามแนว "การทดสอบหน่วยเท่านั้นทดสอบการกำหนดค่าของตัวเอง" เห็นได้ชัดว่านี่คือจุดประสงค์ของการทดสอบและในความคิดของฉันก็ใช้ได้อย่างสมบูรณ์แบบ ฉันถามคนที่ไม่สนใจการทดสอบเพื่อลบการกำหนดค่าโครงสร้างแผนผังสำหรับIEnvironmentRepository(ด้วยการทดสอบยังคงถูกละเว้น) และเรียกใช้ชุดทดสอบเต็มหน่วยพวกเขาทั้งหมดผ่าน จากนั้นเราก็เรียกใช้แอปพลิเคชันและล้มลงเพราะการกำหนดค่าคอนเทนเนอร์ไม่ถูกต้อง ในความเห็นของฉันสิ่งนี้ได้พิสูจน์คุณค่าของการทดสอบแล้วเพื่อนร่วมงานของฉันยังไม่เห็นด้วย เขากล่าวเพียงว่าเราไม่ควรทำการทดสอบการกำหนดค่า แต่ฉันคิดว่านี่เป็นสิ่งที่ดีในการทดสอบหน่วย ดังนั้นคำถามมากมาย เป็นการทดสอบหน่วยที่ถูกต้อง - เรากำลังทดสอบการกำหนดค่าของคอนเทนเนอร์ของเราไม่ใช่ structuremap นั้นใช้งานได้ (แต่ฉันเห็นการทับซ้อนกัน) …

4
วิธีถกเถียงกับแนวคิด "สาธารณะอย่างสมบูรณ์" ของการออกแบบคลาสอ็อบเจ็กต์ทางธุรกิจ
เราทำการทดสอบหน่วยและการปรับโครงสร้างวัตถุทางธุรกิจของเราอีกมากมายและดูเหมือนว่าฉันมีความคิดเห็นที่แตกต่างกันมากในการออกแบบชั้นเรียนมากกว่าเพื่อนคนอื่น ๆ ตัวอย่างคลาสที่ฉันไม่ใช่แฟนของ: public class Foo { private string field1; private string field2; private string field3; private string field4; private string field5; public Foo() { } public Foo(string in1, string in2) { field1 = in1; field2 = in2; } public Foo(string in1, string in2, string in3, string in4) { field1 …

2
`Vector <float> ควรจะสะท้อนกลับหรือควรเป็นไปตามความหมายของ IEEE 754?
เมื่อเปรียบเทียบค่าทศนิยมเพื่อความเท่าเทียมมีสองวิธีที่แตกต่างกัน: NaNจะไม่เท่ากับตัวเองซึ่งตรงกับมาตรฐาน IEEE 754สเปค NaNมีความเท่าเทียมกับตัวเองซึ่งให้คุณสมบัติทางคณิตศาสตร์ของReflexivityซึ่งเป็นสิ่งจำเป็นต่อความหมายของความสัมพันธ์ที่เท่าเทียมกัน สร้างขึ้นใน IEEE ลอยชนิดจุดใน C # ( floatและdouble) ปฏิบัติตามมาตรฐาน IEEE ความหมายสำหรับ==และ!=(และผู้ประกอบการเชิงสัมพันธ์เช่น&lt;) แต่ให้มั่นใจ reflexivity สำหรับobject.Equals, IEquatable&lt;T&gt;.Equals(และCompareTo) ตอนนี้พิจารณาห้องสมุดที่ให้ structs เวกเตอร์ที่ด้านบนของ/float doubleประเภทเวกเตอร์ดังกล่าวจะเกิน==/ !=และแทนที่/object.EqualsIEquatable&lt;T&gt;.Equals สิ่งที่ทุกคนเห็นพ้องต้องกันคือ==/ !=ควรทำตามความหมายของ IEEE คำถามคือห้องสมุดควรใช้Equalsวิธีการ (ซึ่งแยกจากตัวดำเนินการความเสมอภาค) ในวิธีที่สะท้อนกลับหรือในวิธีที่ตรงกับความหมายของ IEEE อาร์กิวเมนต์สำหรับการใช้ความหมายของ IEEE สำหรับEquals: เป็นไปตาม IEEE 754 มันเร็วกว่า (อาจมาก) เพราะสามารถใช้ประโยชน์จากคำสั่ง SIMD ได้ ฉันได้ถามคำถามแยกต่างหากเกี่ยวกับสแต็คโอเวอร์โฟลว์เกี่ยวกับวิธีที่คุณแสดงความเท่าเทียมสะท้อนกลับโดยใช้คำสั่ง SIMD และผลกระทบต่อประสิทธิภาพการทำงานของพวกเขา: คำแนะนำ SIMD สำหรับการเปรียบเทียบความเท่าเทียมกันของจุดลอยตัว อัปเดต:ดูเหมือนว่าเป็นไปได้ที่จะใช้ความเท่าเทียมแบบสะท้อนได้อย่างมีประสิทธิภาพโดยใช้คำสั่ง SIMD …

1
ฉันจะเชื่อมโยงวัตถุคำสั่งกับผู้รับที่ถูกต้องได้อย่างไร
ฉันพยายามใช้รูปแบบคำสั่งสำหรับการนำ Undo และ Redo ไปใช้ในโครงการของฉัน public abstract class Command { protected Form Receiver { set; get; } protected HtmlElement Element { set; get; } abstract public void ReDo(); abstract public void UnDo(); public Command(Form receiver) { this.Receiver = receiver; } } class AddElementCmd : Command { public AddElementCmd(HtmlElement elem, Form …

6
วิธีการนำคุณสมบัติไปใช้กับคลาส A ซึ่งอ้างถึงคุณสมบัติของอ็อบเจ็กต์ลูกของคลาส A
เรามีรหัสนี้ซึ่งเมื่อทำให้ง่ายขึ้นจะมีลักษณะเช่นนี้: public class Room { public Client Client { get; set; } public long ClientId { get { return Client == null ? 0 : Client.Id; } } } public class Client { public long Id { get; set; } } ตอนนี้เรามีสามมุมมอง 1) นี่เป็นรหัสที่ดีเพราะClientควรตั้งค่าคุณสมบัติ (เช่นไม่ใช่โมฆะ) ดังนั้นClient == nullจะไม่เกิดขึ้นและค่ารหัส0แสดงถึงรหัสเท็จอย่างไรก็ตาม (นี่คือความเห็นของผู้เขียนรหัส ;-)) …
9 c#  code-quality  null 

3
ดีกว่าที่จะเขียนไลบรารี. NET ของคุณด้วยข้อ จำกัด COM ในใจหรือแยกไลบรารี. NET ของคุณออกจาก Interop
ฉันเจอบทความที่น่าสนใจนี้: ฉันจะรัก COM การทำงานร่วมกันใน CodeProject ได้อย่างไรซึ่งทำให้ฉันคิดว่า ... ผู้เขียนระบุว่าพวกเขาไม่ต้องการ COM-ities ใด ๆ ในไลบรารี. NET ของพวกเขาเพราะมันไม่ได้อยู่ในความสวยงามของไลบรารี. NET ของพวกเขา แต่พวกเขาต้องการเขียนไลบรารี Interop แยกที่แสดงไลบรารี. NET ของพวกเขาไปที่ COM แทน ไลบรารี Interop นี้จะจัดการกับความจริงที่ว่า COM ไม่สนับสนุนคอนสตรัคเตอร์ที่มีพารามิเตอร์ และในขณะที่ฉันคิดว่ามันเป็นเรื่องแปลกใหม่มันไม่เพียงรวบรวมโครงการหรือไม่ ตอนนี้คุณต้องทำการทดสอบหน่วย. ไลบรารี NET ของคุณและไลบรารี Interop ตอนนี้คุณต้องใช้เวลาในการหาวิธีการทำงานกับไลบรารี. NET ที่สวยงามของคุณและเปิดให้ COM คุณต้องนับจำนวนชั้นเรียนอย่างมีประสิทธิภาพสองหรือสามเท่า ฉันสามารถเข้าใจได้อย่างแน่นอนว่าคุณต้องการห้องสมุดของคุณเพื่อสนับสนุนทั้ง COM และไม่ใช่ COM อย่างไรก็ตามหากคุณต้องการใช้ COM เพียงอย่างเดียวการออกแบบประเภทนี้ให้ประโยชน์ที่ฉันไม่เห็นหรือไม่ คุณได้รับประโยชน์จากภาษา C # เท่านั้นหรือไม่ …

3
ใช้อินเทอร์เฟซสำหรับประเภทข้อมูลเป็นแบบป้องกันหรือไม่
สมมติว่าฉันมีเอนทิตีต่าง ๆ ในแบบจำลองของฉัน (โดยใช้ EF), พูดว่าผู้ใช้ผลิตภัณฑ์ใบแจ้งหนี้และใบสั่ง ฉันกำลังเขียนตัวควบคุมผู้ใช้ที่สามารถพิมพ์บทสรุปของเอนทิตีวัตถุในแอปพลิเคชันของฉันซึ่งเป็นรายการที่กำหนดไว้ล่วงหน้าในกรณีนี้ฉันบอกว่าสรุปของผู้ใช้และผลิตภัณฑ์สามารถสรุปได้ บทสรุปจะมีเพียง ID และคำอธิบายเท่านั้นดังนั้นฉันจึงสร้างอินเทอร์เฟซอย่างง่ายสำหรับสิ่งนี้: public interface ISummarizableEntity { public string ID { get; } public string Description { get; } } จากนั้นสำหรับเอนทิตีที่มีปัญหาฉันสร้างคลาสบางส่วนที่ใช้อินเทอร์เฟซนี้: public partial class User : ISummarizableEntity { public string ID { get{ return UserID.ToString(); } } public string Description { get{ return …

4
การใช้ struct เพื่อบังคับใช้การตรวจสอบความถูกต้องของชนิดในตัว
วัตถุโดเมนทั่วไปมีคุณสมบัติที่สามารถแสดงโดยชนิดในตัว แต่มีค่าที่ถูกต้องเป็นส่วนย่อยของค่าที่อาจแสดงโดยประเภทนั้น ในกรณีเหล่านี้ค่าสามารถจัดเก็บได้โดยใช้ชนิดในตัว แต่จำเป็นต้องตรวจสอบให้แน่ใจว่าค่านั้นได้รับการตรวจสอบความถูกต้องเสมอ ณ จุดเริ่มต้นมิฉะนั้นเราอาจสิ้นสุดการทำงานด้วยค่าที่ไม่ถูกต้อง วิธีหนึ่งในการแก้ไขปัญหานี้คือการเก็บค่าเป็นแบบกำหนดเองstructซึ่งมีprivate readonlyเขตข้อมูลสำรองเดียวของชนิดในตัวและตัวสร้างที่ตรวจสอบความถูกต้องของค่าที่ให้มา จากนั้นเราสามารถมั่นใจได้ว่าใช้ค่าที่ตรวจสอบได้โดยใช้structประเภทนี้เสมอ นอกจากนี้เรายังสามารถให้บริการตัวดำเนินการส่งจากและไปยังชนิดในตัวเพื่อให้ค่าสามารถเข้าและออกจากประเภทพื้นฐานได้อย่างราบรื่น ยกตัวอย่างสถานการณ์ที่เราต้องการแสดงชื่อของวัตถุโดเมนและค่าที่ถูกต้องคือสตริงใด ๆ ที่มีความยาวระหว่าง 1 ถึง 255 อักขระ เราสามารถนำเสนอสิ่งนี้โดยใช้โครงสร้างต่อไปนี้: public struct ValidatedName : IEquatable&lt;ValidatedName&gt; { private readonly string _value; private ValidatedName(string name) { _value = name; } public static bool IsValid(string name) { return !String.IsNullOrEmpty(name) &amp;&amp; name.Length &lt;= 255; } public …
9 c#  .net 

4
การแยกการดึงข้อมูลและวัตถุธุรกิจระหว่างชั้น DAL และ BLL
ฉันได้ทำการวิจัยก่อนโพสต์คำถามนี้ ในบรรดาคำถามหรือโพสต์อื่น ๆ ข้อใดข้อหนึ่งมีให้ด้านล่าง ฉันไม่สามารถทราบวิธีการกำหนด .. วัตถุธุรกิจภายใน Data Access Layer ฉันมีที่เก็บและชั้นธุรกิจเรียกที่เก็บเพื่อเรียกข้อมูล ตัวอย่างเช่นสมมติว่าฉันมีคลาสต่อไปนี้สำหรับ BLL และ DAL: class BllCustomer { public int CustomerId {get; set;} public String Name {get; set;} public BllAddress Address {get; set;} } class BllAddress { public int AddressId {get; set;} public String Street {get; set;} public String City …

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