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

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

3
เหตุใดโมเดลโดเมน anemic จึงถือว่าไม่ดีใน C # / OOP แต่สำคัญมากใน F # / FP
ในโพสต์บล็อกใน F # เพื่อความสนุกสนานและผลกำไรกล่าวว่า: ในการออกแบบฟังก์ชั่นมันสำคัญมากที่จะแยกพฤติกรรมออกจากข้อมูล ชนิดข้อมูลนั้นง่ายและ "โง่" จากนั้นคุณก็มีฟังก์ชั่นหลายอย่างที่ทำงานกับชนิดข้อมูลเหล่านั้น สิ่งนี้เป็นสิ่งที่ตรงกันข้ามกับการออกแบบเชิงวัตถุที่มีการรวมพฤติกรรมและข้อมูลเข้าด้วยกัน ท้ายที่สุดแล้วนั่นคือสิ่งที่ชั้นเรียน ในความเป็นจริงการออกแบบเชิงวัตถุในความเป็นจริงคุณไม่ควรมี แต่พฤติกรรม - ข้อมูลเป็นส่วนตัวและสามารถเข้าถึงได้ผ่านวิธีการ ในความเป็นจริงอู๊ดไม่ได้มีพฤติกรรมพอรอบประเภทข้อมูลถือเป็นสิ่งที่ไม่ดีและยังมีชื่อ: ความ " รูปแบบโดเมนโลหิตจาง " ระบุว่าใน C # เราดูเหมือนจะยืมต่อจาก F # และพยายามเขียนโค้ดสไตล์การทำงานมากขึ้น ทำไมเราไม่ยืมความคิดในการแยกข้อมูล / พฤติกรรมและคิดว่ามันไม่ดี? มันเป็นเพียงแค่ว่าคำจำกัดความไม่ได้มาพร้อมกับ OOP หรือมีเหตุผลที่เป็นรูปธรรมว่ามันไม่ดีใน C # ที่ด้วยเหตุผลบางอย่างไม่ได้ใช้ใน F # (และในความเป็นจริงจะกลับรายการ)? (หมายเหตุ: ฉันสนใจเป็นพิเศษในความแตกต่างใน C # / F # ที่สามารถเปลี่ยนความคิดเห็นของสิ่งที่ดี / ไม่ดีแทนที่จะเป็นบุคคลที่อาจไม่เห็นด้วยกับความเห็นทั้งในโพสต์บล็อก)

11
ฉันควรเลือก C # บน Java และ C ++ ด้วยเหตุผลใดบ้าง [ปิด]
C # ดูเหมือนว่าจะเป็นที่นิยมในวันนี้ ฉันได้ยินมาว่าวากยสัมพันธ์มันเกือบจะเหมือนกับจาวา Java และ C ++ มีอยู่เป็นเวลานาน ฉันควรเลือก C # บน Java และ C ++ ด้วยเหตุผลใดบ้าง

5
ในฐานะนักพัฒนา C # คุณจะเรียนรู้ Java เพื่อพัฒนาสำหรับ Android หรือใช้ MonoDroid แทนหรือไม่? [ปิด]
ฉันคิดว่าตัวเองค่อนข้างเชี่ยวชาญใน C # เป็นภาษาที่ฉันเลือกในขณะนี้และเป็นที่ซึ่งประสบการณ์การทำงานทั้งหมดของฉันตั้งอยู่ ถึงกระนั้นฉันก็ยังงงกับการมีอยู่ของโครงการMonoDroid ความเข้าใจของฉันได้เสมอว่า C # และ Java เป็นมากใกล้ เช่นถ้าคุณรู้จักคุณสามารถเรียนรู้ได้อย่างรวดเร็ว ดังนั้นเมื่อฉันพิจารณาการพัฒนาแอพ Android ครั้งแรกของฉันฉันแค่คิดว่าฉันจะทำความคุ้นเคยกับ Java มากพอที่จะเริ่มต้นแล้วเรียนรู้เมื่อฉันไป สิ่งนี้จะไม่สมเหตุสมผลกว่าการใช้ MonoDroid ซึ่งน่าจะมีคุณสมบัติน้อยกว่า Java Android SDK และต้องเรียนรู้ API ของตัวเอง (แม้ว่าจะเป็น. NET API) อยู่ดี ฉันแค่รู้สึกว่ามันจะเป็นการดีกว่าที่จะเรียนรู้ภาษาใหม่ (และเป็นที่นิยมอย่างมากในตอนนั้น) และได้รับประสบการณ์ในมัน - เมื่อใกล้กับสิ่งที่คุณรู้อยู่แล้ว - แทนที่จะยึดติดกับเทคโนโลยีที่คุณเคยสัมผัส ด้วยโดยไม่ได้รับทักษะที่มีค่าใด ๆ เพิ่มเติม บางทีฉันอาจบิดเบือนผู้ใช้ MonoDroid โดยเฉลี่ย อาจจะมากกว่าสำหรับผู้ที่มีประสบการณ์ใน Java และ. NET และเพียงต้องการ. NET หรืออาจ …
46 java  c#  .net  android  monodroid 

7
คุณสมบัติ. NET - ใช้คุณสมบัติส่วนตัวหรือตั้งค่าแบบอ่านอย่างเดียว?
ฉันควรใช้ Private Set ในสถานการณ์ใดเมื่อเทียบกับการทำให้เป็นคุณสมบัติแบบอ่านอย่างเดียว พิจารณาตัวอย่างที่ง่ายสองตัวอย่างด้านล่าง ตัวอย่างแรก: Public Class Person Private _name As String Public Property Name As String Get Return _name End Get Private Set(ByVal value As String) _name = value End Set End Property Public Sub WorkOnName() Dim txtInfo As TextInfo = _ Threading.Thread.CurrentThread.CurrentCulture.TextInfo Me.Name = txtInfo.ToTitleCase(Me.Name) End Sub …
45 c#  .net  vb.net 

4
ทำไมโครงสร้างและคลาสแยกแนวคิดใน C #
ในขณะที่การเขียนโปรแกรมใน C # ฉันสะดุดกับการตัดสินใจออกแบบภาษาแปลก ๆ ที่ฉันไม่เข้าใจ ดังนั้น C # (และ CLR) มีชนิดข้อมูลรวมสองประเภท: struct(ค่าประเภทเก็บไว้ในสแต็กไม่มีการสืบทอด) และclass(อ้างอิงประเภทเก็บไว้ในกองมีมรดก) การตั้งค่านี้ฟังดูดีในตอนแรก แต่จากนั้นคุณสะดุดวิธีที่ใช้พารามิเตอร์ของชนิดรวมและเพื่อหาว่าจริง ๆ แล้วเป็นประเภทค่าหรือประเภทอ้างอิงคุณต้องค้นหาการประกาศของประเภทนั้น บางครั้งอาจทำให้สับสนได้ วิธีแก้ปัญหาที่เป็นที่ยอมรับโดยทั่วไปดูเหมือนว่าจะประกาศstructว่า "ไม่เปลี่ยนรูป" (ตั้งค่าเขตข้อมูลไว้readonly) เพื่อป้องกันความผิดพลาดที่อาจเกิดขึ้นโดย จำกัดstructประโยชน์ของ ตัวอย่างเช่น C ++ ใช้โมเดลที่สามารถใช้งานได้มากขึ้น: ช่วยให้คุณสร้างอินสแตนซ์ของวัตถุบนสแต็กหรือบนฮีปและส่งผ่านตามค่าหรือโดยการอ้างอิง (หรือโดยตัวชี้) ฉันได้ยินอยู่เสมอว่า C # ได้รับแรงบันดาลใจจาก C ++ และฉันก็ไม่เข้าใจว่าทำไมมันไม่ใช้เทคนิคนี้ การรวมclassและสร้างstructเป็นหนึ่งเดียวกับตัวเลือกการจัดสรรที่แตกต่างกันสองตัว (ฮีปและสแต็ค) และส่งต่อให้เป็นค่าหรือ (อย่างชัดเจน) เนื่องจากการอ้างอิงผ่านทางrefและoutคำหลักดูเหมือนเป็นสิ่งที่ดี คำถามคือทำไมclassและstructกลายเป็นแนวคิดที่แยกต่างหากใน C # และ CLR แทนที่จะเป็นประเภทรวมหนึ่งที่มีสองตัวเลือกการจัดสรร?

4
ทำไมนักพัฒนา C # ขึ้นบรรทัดใหม่การเปิดวงเล็บ [ปิด]
ฉันใช้เวลาส่วนใหญ่ในช่วงหลายปีที่ผ่านมาทำงานเป็นหลักกับ C # และ SQL โปรแกรมเมอร์ทุกคนที่ฉันทำงานด้วยในช่วงเวลานั้นอยู่ในนิสัยของการวางวงเล็บเปิดของคำสั่งฟังก์ชั่นหรือการควบคุมการไหลของบรรทัดใหม่ ดังนั้น ... public void MyFunction(string myArgument) { //do stuff } if(myBoolean == true) { //do something } else { //do something else } ฉันได้รับการหลงโดยพื้นที่ที่สิ้นเปลืองนี้โดยเฉพาะในงบ / อื่น ๆ และฉันรู้ว่ามีตัวเลือกอื่นใน C # รุ่นที่ใหม่กว่าเช่น: if(myBoolean == true) //do something on one line of code แต่ไม่ค่อยมีใครใช้พวกเขา ทุกคนทำสิ่งที่หยิก - …
44 java  c#  javascript  syntax 

3
แนวทางปฏิบัติที่ดีที่สุดในการสร้างรูปแบบรหัสข้อผิดพลาดสำหรับโครงการระดับองค์กรใน C # [ปิด]
ฉันกำลังทำงานในโครงการระดับองค์กรซึ่งจะถูกปรับใช้ในองค์กรธุรกิจขนาดกลางและขนาดย่อมหลายแห่ง การสนับสนุนสำหรับโครงการนี้กำลังดิ้นรนและฉันต้องการสร้างรูปแบบการเข้ารหัสสำหรับข้อผิดพลาด ( เช่นรหัสสถานะ HTTP ) วิธีนี้จะช่วยให้ผู้ให้ความช่วยเหลือสามารถอ้างถึงเอกสารและแก้ไขปัญหาโดยเร็วที่สุด แนวทางปฏิบัติและคำแนะนำที่ดีที่สุดในการทำสิ่งนี้คืออะไร? ความช่วยเหลือใด ๆ ในการทำเช่นนี้จะเป็นประโยชน์

8
ฉันควรโยนข้อยกเว้นในกรณีที่มีค่าที่มีความหมายนอกช่วงหรือจัดการกับตัวเองหรือไม่?
ฉันได้เขียน struct ที่แสดงถึงพิกัดละติจูด / ลองจิจูด ค่าของพวกเขามีตั้งแต่ -180 ถึง 180 สำหรับ longtitudes และ 90 ถึง -90 สำหรับ lattitudes หากผู้ใช้งานของ struct นั้นให้คุณค่าแก่ฉันนอกช่วงนั้นฉันมี 2 ตัวเลือก: โยนข้อยกเว้น (อยู่นอกช่วง) แปลงค่าเป็นข้อ จำกัด เนื่องจากพิกัด -185 มีความหมาย (สามารถแปลงได้อย่างง่ายดายมากถึง +175 เหมือนกับพิกัดเชิงขั้ว) ฉันจึงยอมรับและแปลงได้ จะเป็นการดีกว่าหรือที่จะโยนข้อยกเว้นเพื่อบอกผู้ใช้ว่ารหัสของเขาให้คุณค่าที่ควรแก่ฉัน แก้ไข: ฉันรู้ถึงความแตกต่างระหว่าง lat / lng และพิกัด แต่ฉันต้องการทำให้มันง่ายขึ้นสำหรับการสนทนาที่ง่ายขึ้น - มันไม่ใช่ความคิดที่เจิดจ้าที่สุด

10
ทำไมรหัสของคุณไม่ควรใช้ CPU 100% [ปิด]
ฉันกำลังพูดโดยเฉพาะเกี่ยวกับโปรแกรม C # .NET 4 ที่ทำงานบน Windows XP หรือสูงกว่า แต่คำตอบทั่วไปก็ยอมรับได้เช่นกัน สมมติว่าโปรแกรมที่ได้รับการปรับให้เหมาะสมและมีประสิทธิภาพนั้น ปัญหานี่คือผลกระทบของการใช้งาน CPU สูงกับฮาร์ดแวร์ทั้งหมดและควรใช้โปรแกรมที่มีการใช้งานสูงเพื่อลดการสึกหรอหรือไม่ไม่ว่าการใช้งานของฉันจะมีประสิทธิภาพหรือไม่ เพื่อนร่วมงานวันนี้แนะนำว่าฉันไม่ควรตั้งเป้าการใช้งาน CPU 100% ในกระบวนการโหลดข้อมูลเพราะ "ซีพียูสมัยใหม่ราคาถูกและจะลดลงอย่างรวดเร็วที่ 100% ซีพียู" มันเป็นเรื่องจริงเหรอ? และถ้าเป็นเช่นนั้นทำไม ก่อนหน้านี้ฉันรู้สึกว่าการใช้ CPU 100% นั้นดีกว่าสำหรับการใช้งานที่หนักหน่วงหรือยาวนานและฉันก็ไม่สามารถหาแหล่งที่มาที่น่านับถือในเรื่องนี้ได้
42 c#  multithreading  cpu  usage 

3
มีตัวเลขที่ไม่สามารถแทนได้ในฐาน 10 แต่สามารถแสดงในฐาน 2 ได้หรือไม่
C#มีdecimalประเภทที่ใช้สำหรับตัวเลขที่ต้องการการแทนค่าที่แน่นอนในฐาน 10 ตัวอย่างเช่น0.1ไม่สามารถแสดงในฐาน 2 (เช่นfloatและdouble) และจะเป็นการประมาณเสมอเมื่อเก็บไว้ในตัวแปรที่เป็นประเภทเหล่านี้ ฉันสงสัยว่าข้อเท็จจริงที่ตรงกันข้ามนั้นเป็นไปได้หรือไม่ มีตัวเลขที่ไม่สามารถแทนได้ในฐาน 10 แต่สามารถแสดงในฐาน 2 (ในกรณีนี้ฉันต้องการใช้ a floatแทน a decimalเพื่อจัดการกับมัน) หรือไม่?

14
นี่เป็นสถานการณ์ที่ถูกต้องที่จะใช้ค่าคงที่หรือไม่?
ดังนั้นอาจารย์ของฉันก็ให้ความเห็นย้อนกลับในโครงการที่ฉันทำอยู่ เขาเชื่อมต่อสองสามคะแนนสำหรับรหัสนี้: if (comboVendor.SelectedIndex == 0) { createVendor cv = new createVendor(); cv.ShowDialog(); loadVendors(); } สิ่งนี้อยู่ในตัวจัดการ "เปลี่ยนดัชนี" ของ combobox มันถูกใช้เมื่อผู้ใช้ต้องการสร้างผู้ขายรายใหม่ตัวเลือกอันดับแรกของฉัน (ดัชนี 0 ที่ไม่เคยเปลี่ยนแปลง) เปิดกล่องโต้ตอบ "สร้างผู้ขายใหม่" ดังนั้นเนื้อหาของกล่องคำสั่งผสมของฉันจึงดูเป็นแบบนี้: Create New Vendor... Existing Vendor Existing Vendor 2 Existing Vendor 3 ปัญหาของเขากับรหัสบรรทัดแรก: if (comboVendor.SelectedIndex == 0) เขาอ้างว่า 0 ควรเป็นค่าคงที่และทำเครื่องหมายให้ฉันจริงเพราะสิ่งนั้น เขาอ้างว่าฉันไม่ควรใช้ตัวอักษรในรหัสของฉันเลย ฉันไม่เข้าใจว่าทำไมฉันถึงต้องการทำให้รหัสนั้นในสถานการณ์นั้นคงที่ ดัชนีนั้นจะไม่มีวันเปลี่ยนแปลงหรือเป็นสิ่งที่คุณจะต้องปรับแต่ง ดูเหมือนว่าหน่วยความจำไม่เพียงพอที่จะเก็บ 0 …
42 c# 

13
มันไม่มีเหตุผลที่จะคาดหวังใด ๆ () * ไม่ * ที่จะโยนข้อยกเว้นอ้างอิงเป็นโมฆะ?
เมื่อคุณสร้างวิธีการขยายที่คุณสามารถทำได้แน่นอนว่าเรียกใช้บนnullแต่ไม่เหมือนกับการเรียกใช้วิธีการแบบอินสแตนซ์การเรียกใช้แบบ null ไม่จำเป็นต้องมีเครื่องหมายNullReferenceException-> คุณต้องตรวจสอบและโยนด้วยตนเอง สำหรับการดำเนินการตามวิธีส่วนขยายของ Linq Any()Microsoft ตัดสินใจว่าพวกเขาควรจะโยนArgumentNullException( https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/AnyAll.cs ) มันทำให้ฉันต้องเขียน if( myCollection != null && myCollection.Any() ) ฉันผิดในฐานะลูกค้าของรหัสนี้ที่จะคาดหวังว่าเช่น((int[])null).Any()ควรกลับมาfalse?

12
การพัฒนา C # แยกออกจาก IDE ที่คุณใช้อย่างมีประสิทธิภาพหรือไม่
ฉันเป็นโปรแกรมเมอร์ Python ที่เรียนรู้ C # ที่พยายามหยุดกังวลและเพียงรัก C # ในสิ่งที่มันเป็นมากกว่าที่จะเปรียบเทียบกับ Python อย่างต่อเนื่อง ฉันจมอยู่ในจุดหนึ่ง: การขาดความชัดเจนเกี่ยวกับสิ่งที่กำหนดไว้ตามรายละเอียดในคำถาม Stack Overflowนี้ กล่าวโดยย่อ: ใน C # using fooไม่ได้บอกคุณว่าชื่อfooมีการใช้งานซึ่งคล้ายกับfrom foo import *ใน Python - รูปแบบที่ท้อแท้ภายในวัฒนธรรมการเข้ารหัสของ Python สำหรับการบอกเป็นนัยมากกว่าวิธีที่ชัดเจนfrom foo import barกว่า ฉันค่อนข้างจะประทับใจกับคำตอบของ Stack Overflow จากโปรแกรมเมอร์ C # ซึ่งในทางปฏิบัติแล้วการขาดความชัดเจนไม่สำคัญเพราะใน IDE ของคุณ (สมมุติว่า Visual Studio) คุณสามารถโฮเวอร์เหนือชื่อและได้รับการบอกเล่าจาก ระบบที่ชื่อมาจาก เช่น: ทีนี้ในทางทฤษฎีฉันรู้ว่านี่หมายถึงเมื่อคุณมองด้วยโปรแกรมแก้ไขข้อความคุณไม่สามารถบอกได้ว่าประเภทมาจากอะไรใน C # …

8
ทรัพย์สินส่วนตัวเทียบกับตัวแปร?
เมื่อตั้งค่าให้กับตัวแปรภายในคลาสส่วนใหญ่เราจะแสดงสองตัวเลือก: private string myValue; public string MyValue { get { return myValue; } set { myValue = value; } } มีแบบแผนที่กำหนดว่าเราควรกำหนดค่าให้กับตัวแปรภายในคลาสของเราหรือไม่? ตัวอย่างเช่นถ้าฉันมีวิธีการภายในชั้นเดียวกันฉันควรกำหนดโดยใช้คุณสมบัติหรือใช้ตัวแปรส่วนตัว ฉันเคยเห็นมันทำทั้งสองวิธีดังนั้นฉันสงสัยว่านี่เป็นตัวเลือกหรือประสิทธิภาพเป็นปัจจัย (เล็กน้อยอาจ)

9
ฉันควรยอมรับคอลเลกชันที่ว่างเปล่าในวิธีการของฉันที่ทำซ้ำมากกว่าพวกเขา
ฉันมีวิธีการที่ตรรกะทั้งหมดจะดำเนินการภายในวง foreach ที่ iterates มากกว่าพารามิเตอร์ของวิธีการ: public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } ในกรณีนี้การส่งคอลเล็กชันว่างเปล่าจะส่งผลให้เกิดคอลเล็กชันที่ว่างเปล่า แต่ฉันสงสัยว่ามันไม่ฉลาด ตรรกะของฉันที่นี่คือถ้าใครบางคนกำลังเรียกวิธีนี้พวกเขาตั้งใจจะส่งผ่านข้อมูลและจะส่งเฉพาะคอลเลกชันที่ว่างเปล่าไปยังวิธีการของฉันในสถานการณ์ที่ผิดพลาด ฉันควรจะตรวจจับพฤติกรรมนี้และทิ้งข้อยกเว้นไว้หรือเป็นวิธีที่ดีที่สุดในการส่งคืนคอลเลกชันที่ว่างเปล่า?

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