กลับไปหน้าบทความ

อ่าน 26 นาที

ซีชาร์ป (ภาษาโปรแกรม)

C# ( / ˌ s iː ˈ ʃ ɑːr p / ดู SHARP ) [ b ] เป็น ภาษาโปรแกรม ระดับสูง อเนกประสงค์ ที่รองรับ กระบวนทัศน์ หลายแบบC# ครอบคลุมการ กำหนดประเภทแบบคงที่ [ 17 ] : 4 การกำหนดประเภทที่...

ซีชาร์ป (ภาษาโปรแกรม)

ซี#
กระบวนทัศน์รูปแบบการทำงานหลายแบบ : มีโครงสร้าง , เชิงคำสั่ง , เชิงวัตถุ , ขับเคลื่อนด้วยเหตุการณ์ , ขับเคลื่อนด้วยงาน , เชิงฟังก์ชัน , ทั่วไป , สะท้อนคิด , พร้อมกัน
ตระกูลซี
ออกแบบโดยแอนเดอร์ส เฮจล์สเบิร์ก ( ไมโครซอฟต์ )
นักพัฒนาแมดส์ ทอร์เกอร์เซน ( ไมโครซอฟต์ )
ปรากฏครั้งแรกกรกฎาคม พ.ศ. 2543 [ 1 ] [ 2 ] ( 2000-07 )
เวอร์ชันเสถียร
14.0 [ 3 ] แก้ไขข้อมูลนี้บนวิกิดาต้า / 11 พฤศจิกายน 2025 ( 11 พฤศจิกายน 2025 )
วินัยในการพิมพ์คงที่ไดนามิก [ 4 ]แข็งแกร่งปลอดภัยนามอนุมานบางส่วน
การจัดการหน่วยความจำเก็บขยะ
แพลตฟอร์มโครงสร้างพื้นฐานภาษาทั่วไป
ใบอนุญาต
นามสกุลไฟล์.cs,.csx
เว็บไซต์เรียนรู้.microsoft .com /en-us /dotnet /csharp /
การนำไปใช้งานหลักๆ
Visual C# , .NET , Mono , Universal Windows Platform เลิกใช้งานแล้ว : .NET Framework , DotGNU
ภาษาถิ่น
, Polyphonic C# , Enhanced C#
ได้รับอิทธิพลจาก
C++ , [ 7 ] , Eiffel , F# , [ a ] ​​Haskell , Scala , Icon , J# , J++ , Java , [ 7 ] JavaScript , ML , Modula-3 , Object Pascal , [ 8 ] Visual Basic (VB)
ได้รับอิทธิพล
Chapel , [ 9 ] Clojure , [ 10 ] Crystal , [ 11 ] D , J# , Dart , [ 12 ] F# , Hack , Java , [ 13 ] [ 14 ] Kotlin , Nemerle , Oxygene , Rust , [ 15 ] Swift , [ 16 ] Vala , TypeScript
  • โลโก้ Wikibooksการเขียนโปรแกรม C แบบชาร์ปที่วิกิตำรา

C# ( / ˌ s ˈ ʃ ɑːr p /ดูSHARP ) [ b ]เป็นภาษาโปรแกรมระดับสูงอเนกประสงค์ ที่รองรับ กระบวนทัศน์หลายแบบC# ครอบคลุมการกำหนดประเภทแบบคงที่[ 17 ] : 4 การกำหนดประเภทที่เข้มงวดขอบเขตตามคำศัพท์ เชิงคำ สั่ง เชิงประกาศเชิงฟังก์ชันทั่วไป [ 17 ] : 22 การเขียนโปรแกรมเชิงวัตถุ ( ตาม คลาส ) และการเขียนโปรแกรมเชิงส่วนประกอบ [ 1 ]

นักออกแบบหลักของภาษาโปรแกรม C# คือAnders Hejlsberg , Scott Wiltamuth และ Peter Golde จากMicrosoft [ 1 ]ภาษา ดัง กล่าวได้รับการเผยแพร่อย่างกว้างขวางครั้งแรกในเดือนกรกฎาคม พ.ศ. 2543 [ 1 ]และต่อมาได้รับการอนุมัติให้เป็นมาตรฐานสากลโดยEcma (ECMA-334) ในปี พ.ศ. 2545 และISO / IEC (ISO/IEC 23270 และ 20619 [ c ] ) ในปี พ.ศ. 2546 Microsoft ได้แนะนำ C# พร้อมกับ.NET Frameworkและ Microsoft Visual Studioซึ่งทั้งสองอย่างนั้น ในทางเทคนิคแล้วเป็นซอฟต์แวร์แบบปิดในขณะนั้น Microsoft ไม่มีผลิตภัณฑ์โอเพนซอร์ส สี่ปีต่อมา ในปี พ.ศ. 2547 โครงการโอเพนซอร์สฟรี ที่เรียกว่า Monoได้เริ่มต้นขึ้น โดยให้บริการคอม ไพเลอร์ และสภาพแวดล้อมรันไทม์แบบข้ามแพลตฟอร์ม สำหรับภาษาโปรแกรม C# สิบปีต่อมา ไมโครซอฟต์ได้เปิดตัวVisual Studio Code (โปรแกรมแก้ไขโค้ด), Roslyn (โปรแกรมคอมไพเลอร์) และแพลตฟอร์ม .NET (เฟรมเวิร์กซอฟต์แวร์) ซึ่งทั้งหมดนี้รองรับภาษา C# และเป็นซอฟต์แวร์ฟรี โอเพนซอร์ส และใช้งานได้บนหลายแพลตฟอร์ม นอกจากนี้ Mono ยังเข้าร่วมกับไมโครซอฟต์ แต่ไม่ได้ถูกรวมเข้ากับ .NET

ณ เดือนพฤศจิกายน พ.ศ. 2568 เวอร์ชันเสถียรล่าสุดของภาษานี้คือ C# 14 [ 18 ] [ 19 ] [ 20 ]

เป้าหมายการออกแบบ

มาตรฐาน Ecma ระบุเป้าหมายการออกแบบเหล่านี้สำหรับ C#: [ 1 ]

  • ภาษาโปรแกรมนี้มีจุดประสงค์เพื่อให้เป็น ภาษาโปรแกรมเชิงวัตถุที่เรียบง่าย ทันสมัย ​​และใช้งานได้หลากหลาย
  • ภาษาและการใช้งานควรให้การสนับสนุนหลักการทางวิศวกรรมซอฟต์แวร์ เช่น การตรวจสอบ ประเภทที่เข้มงวด การตรวจ สอบขอบเขตของอาร์เรย์[ 21 ] : 58–59 การตรวจจับความพยายามในการใช้ตัวแปรที่ไม่ได้เริ่มต้นและการเก็บขยะอัตโนมัติ[ 21 ] : 563ความ แข็งแกร่งของซอฟต์แวร์ ความทนทาน และผลิตภาพของโปรแกรมเมอร์มีความสำคัญ
  • ภาษาดังกล่าวมีจุดประสงค์เพื่อใช้ในการพัฒนาส่วนประกอบซอฟต์แวร์ที่เหมาะสมสำหรับการใช้งานในสภาพแวดล้อมแบบกระจายศูนย์
  • ความสามารถในการพกพาได้นั้นมีความสำคัญมากสำหรับซอร์สโค้ดและโปรแกรมเมอร์โดยเฉพาะอย่างยิ่งผู้ที่คุ้นเคยกับภาษา CและC++อยู่ แล้ว
  • การสนับสนุนการทำให้เป็นสากล[ 21 ] : 314 มีความสำคัญมาก
  • C# ถูกออกแบบมาให้เหมาะสมสำหรับการเขียนแอปพลิเคชันทั้งบนระบบโฮสต์และระบบฝังตัวตั้งแต่ระบบขนาดใหญ่ที่ใช้ระบบปฏิบัติการ ที่ซับซ้อน ไป จนถึงระบบขนาดเล็กที่มีฟังก์ชันเฉพาะ
  • แม้ว่าแอปพลิเคชัน C# จะมีจุดประสงค์เพื่อให้ประหยัดในแง่ของความต้องการหน่วยความจำและพลังการประมวลผลแต่ภาษานี้ไม่ได้มีจุดประสงค์เพื่อแข่งขันโดยตรงในด้านประสิทธิภาพและขนาดกับภาษา C หรือภาษาแอสเซมบลี[ 22 ]

ประวัติศาสตร์

โลโก้เดิมของ C#

ในระหว่างการพัฒนา . NET Frameworkไลบรารีคลาสถูกเขียนขึ้นโดยใช้ ระบบคอมไพเลอร์ โค้ดจัดการชื่อSimple Managed C (SMC) [ 23 ] [ 24 ]ในเดือนมกราคม พ.ศ. 2542 Anders Hejlsbergได้ก่อตั้งทีมเพื่อสร้างภาษาใหม่ซึ่งในขณะนั้นเรียกว่า COOL ซึ่งย่อมาจาก " C-like Object Oriented Language" [ 25 ]

ก่อนหน้านี้ ไมโครซอฟต์เคยพิจารณาที่จะคงชื่อ "COOL (C-like Object Oriented Language)" ไว้เป็นชื่อสุดท้ายของภาษา แต่ได้ตัดสินใจไม่ใช้ชื่อนั้นเนื่องจากเหตุผลด้านเครื่องหมายการค้า เมื่อโครงการ .NET ได้รับการประกาศอย่างเป็นทางการในงานProfessional Developers Conference เดือนกรกฎาคม ปี 2000 ภาษาดังกล่าวก็ได้เปลี่ยนชื่อเป็น C# แล้ว และไลบรารีคลาสและ รันไทม์ ของ ASP.NETก็ได้ถูกย้ายมาใช้ C# ด้วยเช่นกัน

Hejlsberg เป็นผู้ออกแบบหลักและสถาปนิกนำของ C# ที่ Microsoft และก่อนหน้านี้มีส่วนร่วมในการออกแบบTurbo Pascal , Embarcadero Delphi (เดิมคือCodeGear Delphi, Inprise Delphi และBorland Delphi) และVisual J++ในการสัมภาษณ์และเอกสารทางเทคนิค เขาได้กล่าวว่าข้อบกพร่องในภาษาโปรแกรมหลักส่วนใหญ่ (เช่นC++ , Java , DelphiและSmalltalk ) ผลักดันพื้นฐานของCommon Language Runtime (CLR) ซึ่งในทางกลับกันก็ผลักดันการออกแบบภาษา C# [ 26 ]

เจมส์ กอสลิงผู้สร้าง ภาษาการเขียนโปรแกรม Javaในปี 1994 และบิล จอยผู้ร่วมก่อตั้งSun Microsystemsผู้ริเริ่ม Java เรียก C# ว่าเป็น "การเลียนแบบ" Java กอสลิงยังกล่าวอีกว่า "[C#] เป็นเหมือน Java ที่ตัดความน่าเชื่อถือ ประสิทธิภาพ และความปลอดภัยออกไป" [ 27 ] [ 28 ]

ในเดือนกรกฎาคม พ.ศ. 2543 Hejlsberg กล่าวว่า C# นั้น "ไม่ใช่โคลนของ Java" และ "มีความใกล้เคียงกับ C++ มากกว่า" ในด้านการออกแบบ[ 29 ]

นับตั้งแต่การเปิดตัว C# 2.0 ในเดือนพฤศจิกายน พ.ศ. 2548 ภาษา C# และ Java ได้พัฒนาไปในทิศทางที่แตกต่างกันมากขึ้นเรื่อยๆ จนกลายเป็นสองภาษาที่แตกต่างกันอย่างสิ้นเชิง การเปลี่ยนแปลงครั้งสำคัญครั้งแรกๆ เกิดขึ้นจากการเพิ่มgenericsเข้าไปในทั้งสองภาษา โดยมีการใช้งานที่แตกต่างกันอย่างมาก C# ใช้reificationเพื่อจัดเตรียมอ็อบเจ็กต์ generics "ระดับเฟิร์สคลาส" ที่สามารถใช้งานได้เหมือนคลาสอื่นๆ โดยมีการสร้างโค้ดในเวลาโหลดคลาส[ 30 ]

C# ยังได้เพิ่มคุณสมบัติหลักหลายประการเพื่อรองรับการเขียนโปรแกรมแบบฟังก์ชัน ซึ่ง culminate ใน ส่วนขยาย LINQที่เปิดตัวพร้อมกับ C# 3.0 และเฟรมเวิร์กที่รองรับนิพจน์แลมบ์ดา เมธอดส่วนขยายและประเภทนิรนาม [ 31 ] คุณสมบัติเหล่านี้ช่วยให้นักเขียนโปรแกรม C# สามารถใช้เทคนิคการเขียนโปรแกรมแบบฟังก์ชัน เช่นclosuresเมื่อเป็นประโยชน์ต่อแอปพลิเคชันของพวกเขา ส่วนขยาย LINQ และการนำเข้าแบบฟังก์ชันช่วยให้นักพัฒนาลดปริมาณโค้ดซ้ำซ้อนที่รวมอยู่ในงานทั่วไป เช่น การสอบถามฐานข้อมูล การแยกวิเคราะห์ไฟล์ XML หรือการค้นหาผ่านโครงสร้างข้อมูล โดยเปลี่ยนจุดเน้นไปที่ตรรกะของโปรแกรมจริงเพื่อช่วยปรับปรุงความสามารถในการอ่านและการบำรุงรักษา[ 32 ]

C# เคยมีมาสคอตชื่อ Andy (ตั้งชื่อตามAnders Hejlsberg ) ซึ่งถูกยกเลิกเมื่อวันที่ 29 มกราคม พ.ศ. 2547 [ 33 ]

C# เดิมทีถูกส่งไปยังคณะอนุกรรมการSC 22 ของ ISO/IEC JTC 1 เพื่อตรวจสอบ[ 34 ]ภายใต้ ISO/IEC 23270:2003 [ 35 ]ถูกถอนออกและได้รับการอนุมัติภายใต้ ISO/IEC 23270:2006 [ 36 ] 23270:2006 ถูกถอนออกภายใต้ 23270:2018 และได้รับการอนุมัติในเวอร์ชันนี้[ 37 ]

ชื่อ

ไมโครซอฟต์ใช้ชื่อ C# เป็นครั้งแรกในปี พ.ศ. 2531 สำหรับภาษา C เวอร์ชันหนึ่งที่ออกแบบมาสำหรับการคอมไพล์แบบเพิ่มทีละขั้น[ 38 ]โครงการนั้นไม่เสร็จสมบูรณ์ และชื่อดังกล่าวก็ถูกนำกลับมาใช้ใหม่ในภายหลัง

ชื่อ "C sharp" ได้รับแรงบันดาลใจจากสัญลักษณ์ทางดนตรี โดยที่สัญลักษณ์ sharp บ่งชี้ว่าโน้ตที่เขียนควรมี ระดับ เสียงสูงขึ้นครึ่งโทน [ 39 ] ซึ่ง คล้ายกับชื่อภาษาC++โดยที่ "++" บ่งชี้ว่าตัวแปรควรเพิ่มขึ้น 1 หลังจากประเมินค่าแล้ว สัญลักษณ์ sharp ยังคล้ายกับการเชื่อมสัญลักษณ์ "+" สี่ตัว (ในตารางสองคูณสอง) ซึ่งแสดงให้เห็นเพิ่มเติมว่าภาษานี้เป็นส่วนขยายของ C++ [ 40 ]

เนื่องจากข้อจำกัดทางเทคนิคของการแสดงผล (แบบอักษรมาตรฐาน เบราว์เซอร์ ฯลฯ) และเค้าโครงแป้นพิมพ์ ส่วนใหญ่ ไม่มีสัญลักษณ์ชาร์ป ( U+266Fสัญลักษณ์ชาร์ปดนตรี ( )) จึงเลือกใช้ เครื่องหมาย # ( U+0023 # สัญลักษณ์ตัวเลข ( # )) เพื่อประมาณสัญลักษณ์ชาร์ปในชื่อภาษาโปรแกรมที่เขียน[ 41 ] ธรรมเนียมนี้สะท้อนให้เห็นในข้อกำหนดภาษา C# ECMA-334 [ 1 ]

คำต่อท้าย "sharp" ถูกใช้โดยภาษาอื่นๆ ที่เข้ากันได้/สอดคล้อง กับ Microsoft .NET จำนวนมาก ซึ่งเป็นรูปแบบต่างๆ ของภาษาที่มีอยู่แล้ว รวมถึง J# (ภาษา .NET ที่ออกแบบโดย Microsoft ซึ่งพัฒนามาจากJava 1.1), A# (จากAda ) และภาษาการเขียนโปรแกรมเชิงฟังก์ชันF# [ 42 ] การใช้งาน Eiffel ดั้งเดิมสำหรับ .NETเรียกว่าEiffel# [ 43 ]ซึ่งเป็นชื่อที่เลิกใช้แล้ว เนื่องจาก ปัจจุบันภาษา Eiffel เต็มรูปแบบ ได้รับการสนับสนุนแล้ว คำต่อท้ายนี้ยังถูกใช้สำหรับไลบรารีเช่นGtk# ( ตัวห่อ . NETสำหรับGTKและ ไลบรารี GNOME อื่นๆ ) และCocoa# (ตัวห่อสำหรับCocoa )

เวอร์ชัน

การพัฒนาข้อความสำหรับมาตรฐาน (เริ่มต้นด้วย C# 6) ดำเนินการบนGitHub C# 7 ได้ถูกส่งไปยังEcmaและได้รับการอนุมัติในเดือนธันวาคม 2023 ณ เดือนมกราคม 2024 มาตรฐานสำหรับ C# 8 กำลังอยู่ระหว่างการพัฒนา โดยอ้างอิงจากข้อเสนอภาษาที่ได้รับการอนุมัติแล้ว

เวอร์ชัน C#ข้อกำหนดทางภาษา วันที่ .สุทธิ วิชวลสตูดิโอ
เอซีเอ็มเอไอโอเอส/อีอีซีไมโครซอฟต์
1.0 ECMA-334:2003, ธันวาคม 2002ISO/IEC 23270:2003 เมษายน 2546มกราคม พ.ศ. 2545มกราคม พ.ศ. 2545 .NET Framework 1.0วิชวล สตูดิโอ .NET 2002
1.1 1.2 ตุลาคม พ.ศ. 2546เมษายน พ.ศ. 2546 วิชวล สตูดิโอ .NET 2003
2.0 [ 44 ]ECMA-334:2006, มิถุนายน 2549ISO/IEC 23270:2006, กันยายน 2006กันยายน 2548 [ d ]พฤศจิกายน 2548 วิชวลสตูดิโอ 2005 วิชวลสตูดิโอ 2008
3.0 [ 45 ]ไม่มี สิงหาคม 2550พฤศจิกายน 2550
วิชวล สตูดิโอ 2008
4.0 [ 47 ]เมษายน 2553 เมษายน 2553 วิชวล สตูดิโอ 2010
5.0 [ 48 ]ECMA-334:2017, ธันวาคม 2017ISO/IEC 23270:2018, ธันวาคม 2018มิถุนายน 2556สิงหาคม 2555 วิชวลสตูดิโอ 2012 วิชวลสตูดิโอ 2013
6.0 [ 49 ]ECMA-334:2022, มิถุนายน 2022ไม่มี ร่างกรกฎาคม 2558
วิชวล สตูดิโอ 2015
7.0 [ 50 ] [ 51 ]ECMA-334:2023, ธันวาคม 2023ISO/IEC 20619:2023, กันยายน 2023ข้อเสนอรายละเอียดมีนาคม 2560 Visual Studio 2017เวอร์ชัน 15.0 [ 52 ]
7.1 [ 53 ]ข้อเสนอรายละเอียดสิงหาคม 2560
  • .NET Core 2.0
Visual Studio 2017เวอร์ชัน 15.3 [ 54 ]
7.2 [ 55 ]ข้อเสนอรายละเอียดพฤศจิกายน 2560 Visual Studio 2017เวอร์ชัน 15.5 [ 56 ]
7.3 [ 57 ]ข้อเสนอรายละเอียดทางเทคนิคถูกเก็บถาวรเมื่อวันที่ 7 มีนาคม 2021 ที่Wayback Machineพฤษภาคม 2561
Visual Studio 2017เวอร์ชัน 15.7 [ 58 ]
8.0 [ 59 ]ไม่มี ข้อเสนอรายละเอียดกันยายน 2562
  • .NET Core 3.0
  • .NET Core 3.1
Visual Studio 2019เวอร์ชัน 16.3 [ 60 ]
9.0 [ 61 ]ข้อเสนอรายละเอียดพฤศจิกายน 2020
  • .NET 5.0
Visual Studio 2019เวอร์ชัน 16.8 [ 62 ]
10.0 [ 63 ]ข้อเสนอรายละเอียดพฤศจิกายน 2021
  • .NET 6.0
Visual Studio 2022เวอร์ชัน 17.0 [ 64 ]
11.0 [ 65 ]ข้อเสนอรายละเอียดพฤศจิกายน 2022
  • .NET 7.0
Visual Studio 2022เวอร์ชัน 17.4 [ 66 ]
12.0 [ 67 ]ข้อเสนอรายละเอียดพฤศจิกายน 2023
  • .NET 8.0
Visual Studio 2022เวอร์ชัน 17.8 [ 68 ]
13.0 [ 69 ]ข้อเสนอรายละเอียดพฤศจิกายน 2024
  • .NET 9.0
Visual Studio 2022เวอร์ชัน 17.12 [ 70 ]
14.0 [ 71 ]ข้อเสนอรายละเอียดพฤศจิกายน 2025
  • .NET 10.0
Visual Studio 2026เวอร์ชัน 18.0 [ 72 ]

ไวยากรณ์

ไวยากรณ์หลักของภาษา C# คล้ายคลึงกับภาษาอื่นๆ ที่ใช้รูปแบบ C เช่น C, Objective-C, C++ และ Java โดยเฉพาะอย่างยิ่ง:

  • เครื่องหมายเซมิโคลอนใช้เพื่อแสดงจุดสิ้นสุดของประโยค
  • วงเล็บปีกกาใช้สำหรับจัดกลุ่มคำสั่ง โดยทั่วไปคำสั่งจะถูกจัดกลุ่มเป็นเมธอด (ฟังก์ชัน) เมธอดจะถูกจัดกลุ่มเป็นคลาส และคลาสจะถูกจัดกลุ่มเป็นเนมสเป
  • การกำหนดค่าตัวแปรใช้เครื่องหมายเท่ากับแต่การเปรียบเทียบตัวแปรใช้เครื่องหมายเท่ากับสองตัวติดกัน
  • วงเล็บเหลี่ยมใช้กับอาร์เรย์ทั้งในการประกาศอาร์เรย์และในการดึงค่าที่ดัชนีที่กำหนดในอาร์เรย์นั้น
  • ในภาษาโปรแกรมแบบ C นั้น "class", "int" และ "void" ใช้สำหรับกำหนดฟังก์ชันขนาดใหญ่ (โดยปกติคือฟังก์ชันหลัก) ในสคริปต์เป็นส่วนใหญ่

ลักษณะเด่น

คุณลักษณะเด่นบางประการของ C# ที่แตกต่างจาก C, C++ และ Java (ตามที่ระบุไว้) มีดังนี้:

พกพาสะดวก

โดยการออกแบบ C# เป็นภาษาโปรแกรมที่สะท้อนโครงสร้างพื้นฐานภาษาทั่วไป  (CLI) ได้โดยตรงที่สุด [ 73 ] ประเภทภายในส่วนใหญ่ของภาษานี้สอดคล้องกับประเภทค่าที่เฟรมเวิร์ก CLI นำมาใช้ อย่างไรก็ตาม ข้อกำหนดของภาษาไม่ได้ระบุข้อกำหนดการสร้างโค้ดของคอมไพเลอร์ กล่าวคือ ไม่ได้ระบุว่าคอมไพเลอร์ C# ต้องกำหนดเป้าหมายไปที่Common Language Runtime (CLR) หรือสร้างCommon Intermediate Language (CIL) หรือสร้างรูปแบบเฉพาะอื่นใด คอมไพเลอร์ C# บางตัวยังสามารถสร้างโค้ดเครื่องได้เช่นเดียวกับคอมไพเลอร์แบบดั้งเดิมของ Objective-C, C, C++, Assembly และFortran [ 74 ] [ 75 ]

กำลังพิมพ์

C# รองรับการประกาศตัวแปรแบบระบุประเภทอย่างชัดเจนด้วยคำหลักvar, [ 17 ] : 470 และอาร์เรย์แบบระบุประเภทอย่างชัดเจนด้วยคำหลักnew[]ตามด้วยตัวเริ่มต้นคอลเลกชัน[ 17 ] : 80 [ 21 ] : 58

ระบบประเภทข้อมูลแบ่งออกเป็นสองกลุ่ม: ประเภทค่า เช่น ประเภทตัวเลขในตัวและโครงสร้างที่ผู้ใช้กำหนด ซึ่งจะถูกส่งต่อเป็นสำเนาโดยอัตโนมัติเมื่อใช้เป็นพารามิเตอร์ และประเภทอ้างอิง รวมถึงอาร์เรย์ อินสแตนซ์ของคลาส และสตริง ซึ่งจะส่งต่อเฉพาะตัวชี้ไปยังวัตถุที่เกี่ยวข้องเท่านั้น เนื่องจากมีการจัดการตัวดำเนินการความเท่าเทียมกันเป็นพิเศษและไม่สามารถเปลี่ยนแปลงได้สตริงจึงจะมีพฤติกรรมเหมือนกับว่าเป็นค่าในทางปฏิบัติ โปรแกรมเมอร์ยังสามารถใช้สตริงเป็น ป้ายกำกับ กรณี ได้อีกด้วย ในกรณีที่จำเป็น ประเภทค่าจะถูกบรรจุโดยอัตโนมัติ[ 76 ]

C# รองรับชนิดข้อมูลบูลีนที่เข้มงวดคำสั่งboolที่รับเงื่อนไข เช่น `true` whileและ ` iffalse` ต้องใช้การแสดงออกของชนิดข้อมูลที่ประเมินค่าได้เป็นtrueค่าบูลีน ในขณะที่ C++ ก็มีชนิดข้อมูลบูลีนเช่นกัน แต่สามารถแปลงไปมาระหว่างจำนวนเต็มได้อย่างอิสระ และการแสดงออกเช่น `true` if (a)ต้องการเพียงแค่ว่า ` atrue` สามารถแปลงเป็น `bool` ได้ ทำให้a`true` เป็นจำนวนเต็มหรือตัวชี้ได้ C# ไม่อนุญาตให้ใช้วิธี "จำนวนเต็มหมายถึงจริงหรือเท็จ" นี้ โดยให้เหตุผลว่าการบังคับให้นักเขียนโปรแกรมใช้การแสดงออกที่ส่งคืนค่าที่แน่นอนboolสามารถป้องกันข้อผิดพลาดในการเขียนโปรแกรมบางประเภทได้ เช่น `true` if (a = b)(การใช้การกำหนดค่า=แทนความเท่าเทียมกัน==)

C# มีความปลอดภัยด้านประเภทข้อมูลมากกว่า C++ การแปลงประเภทข้อมูล โดยปริยายที่เกิดขึ้น โดยค่าเริ่มต้นมีเฉพาะกรณีที่ถือว่าปลอดภัย เช่น การขยายขนาดของจำนวนเต็ม กฎนี้บังคับใช้ในระหว่างการคอมไพล์ ในระหว่างการคอมไพล์แบบ Just-in-timeและในบางกรณีในระหว่างการทำงาน ไม่มีการแปลงประเภทข้อมูลโดยปริยายระหว่างค่าบูลีนและจำนวนเต็ม หรือระหว่างสมาชิกของ enum และจำนวนเต็ม (ยกเว้นค่า 0 ซึ่งสามารถแปลงเป็นประเภท enum ใดก็ได้โดยปริยาย) การแปลงประเภทข้อมูลที่ผู้ใช้กำหนดเองจะต้องระบุอย่างชัดเจนว่าเป็นแบบชัดเจนหรือโดยปริยาย ซึ่งแตกต่างจากตัวสร้างสำเนาและตัวดำเนินการแปลงใน C++ ซึ่งทั้งสองอย่างเป็นการแปลงประเภทข้อมูลโดยปริยายโดยค่าเริ่มต้น

C# มีการสนับสนุนอย่างชัดเจนสำหรับความแปรผันร่วมและความแปรผันผกผันในประเภททั่วไป[ 17 ] : 144 [ 21 ] : 23 ซึ่งแตกต่างจาก C++ ที่มีการสนับสนุนความแปรผันผกผันในระดับหนึ่งโดยอาศัยความหมายของประเภทการส่งคืนในเมธอดเสมือนเท่านั้น

สมาชิก ในกลุ่ม จะถูกจัดไว้ใน ขอบเขตของ ตนเอง

ภาษา C# ไม่อนุญาตให้ใช้ตัวแปรหรือฟังก์ชันส่วนกลาง เมธอดและสมาชิกทั้งหมดต้องประกาศภายในคลาสเท่านั้น สมาชิกแบบ static ของคลาสสาธารณะสามารถใช้แทนตัวแปรและฟังก์ชันส่วนกลางได้

ตัวแปรโลคอลไม่สามารถซ่อนตัวแปรของบล็อกที่ครอบคลุมได้ ซึ่งแตกต่างจากภาษา C และ C++ แต่สามารถซ่อนชื่อระดับชนิดได้

เมตาโปรแกรมมิ่ง

การเขียนโปรแกรมแบบเมตา (Metaprogramming)สามารถทำได้หลายวิธี:

วิธีการและฟังก์ชัน

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

เช่นเดียวกับ C++ และไม่เหมือนกับ Java โปรแกรมเมอร์ C# ต้องใช้คีย์เวิร์ดตัวแก้ไขขอบเขตvirtualเพื่ออนุญาตให้คลาส ย่อย เขียนทับเมธอดได้ ต่างจาก C++ โปรแกรมเมอร์ต้องระบุคีย์เวิร์ดอย่างชัดเจนoverrideเมื่อทำเช่นนั้น[ 86 ]นี่เป็นวิธีหลีกเลี่ยงความสับสนระหว่างการเขียนทับและการโอเวอร์โหลดฟังก์ชันใหม่ กล่าวคือ การซ่อนการใช้งานเดิม ในการทำอย่างหลัง โปรแกรมเมอร์ต้องระบุnewคีย์เวิร์ด[ 87 ]คีย์เวิร์ดนี้sealedสามารถใช้เพื่อไม่อนุญาตให้มีการเขียนทับเพิ่มเติมสำหรับแต่ละเมธอดหรือทั้งคลาสได้[ 88 ]

เมธอดส่วนขยายใน C# อนุญาตให้โปรแกรมเมอร์ใช้เมธอดแบบคงที่ราวกับว่าเป็นเมธอดจากตารางเมธอดของคลาส ทำให้โปรแกรมเมอร์สามารถเพิ่มเมธอดอินสแตนซ์เสมือนจริงให้กับคลาสที่พวกเขารู้สึกว่าควรมีอยู่ในวัตถุประเภทนั้น (และอินสแตนซ์ของคลาสที่สืบทอดมา) [ 17 ] : 103–105 [ 21 ] : 202–203

ประเภทนี้dynamicอนุญาตให้มีการผูกเมธอดขณะรันไทม์ ทำให้สามารถเรียกเมธอดแบบ JavaScript และการประกอบวัตถุ ขณะรันไทม์ ได้[ 17 ] : 114–118

C# รองรับพอยเตอร์ฟังก์ชัน แบบกำหนดประเภทอย่างชัดเจน ผ่านทางคีย์เวิร์ด `not` delegateเช่นเดียวกับสัญญาณและสล็อตแบบจำลอง C++ ของเฟรมเวิร์ก Qt C# มีความหมายเฉพาะที่เกี่ยวข้องกับเหตุการณ์แบบเผยแพร่และสมัครรับข้อมูล แม้ว่า C# จะใช้ดีเลเกตในการดำเนินการดังกล่าวก็ตาม ต่างจากฟิลด์ตัวแปรสามารถเป็นส่วนหนึ่งของอินเทอร์เฟซได้ เนื่องจากในทางเทคนิคแล้ว ตัวแปรประกอบด้วยฟังก์ชันเริ่มต้นสองฟังก์ชันเพื่อเพิ่มและลบดีเลเกตที่จะถูกเรียกใช้ event

C# มีฟังก์ชันsynchronizedการเรียกเมธอดแบบเดียวกับ Java โดยใช้แอตทริบิวต์ `method` [MethodImpl(MethodImplOptions.Synchronized)]และรองรับการล็อกแบบผูกขาดร่วมกันโดยใช้คีย์เวิร์ด ` lockrequire`

คุณสมบัติ

C# รองรับคลาสที่มีคุณสมบัติคุณสมบัติอาจเป็นฟังก์ชันเข้าถึงแบบง่ายๆ ที่มีฟิลด์รองรับ หรืออาจใช้ฟังก์ชัน getter และ setter ที่กำหนดเองก็ได้ คุณสมบัติจะเป็นแบบอ่านอย่างเดียวหากไม่มี setter เช่นเดียวกับฟิลด์ คุณสมบัติอาจเป็นคลาสและอินสแตนซ์ก็ได้ เมธอดพื้นฐานอาจเป็นแบบvirtualใดก็ได้abstractเหมือนกับเมธอดอื่นๆ[ 85 ]

ตั้งแต่ C# 3.0 เป็นต้นมามีไวยากรณ์ย่อ ของคุณสมบัติที่ถูกใช้งานโดยอัตโนมัติ [ 89 ]ซึ่งตัวเข้าถึง (getter) และตัวแก้ไข (setter)จะห่อหุ้มการดำเนินการบนฟิลด์เดียวของคลาส

เนมสเปซ

AC# namespaceให้การแยกโค้ดในระดับเดียวกับ Java packageหรือ C++ namespaceโดยมีกฎและคุณสมบัติที่คล้ายคลึงกันมากpackageสามารถนำเข้าเนมสเปซได้โดยใช้ไวยากรณ์ "using" [ 90 ]

การเข้าถึงหน่วยความจำ

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

หน่วยความจำแบบจัดการ (Managed memory) ไม่สามารถปล่อยให้ว่างได้ด้วยตนเอง แต่จะถูกเก็บกวาด โดยระบบอัตโนมัติ (Garbage collection) การเก็บกวาดนี้ช่วยแก้ปัญหาหน่วยความจำรั่วไหลโดยการลดภาระความรับผิดชอบของโปรแกรมเมอร์ในการปล่อยหน่วยความจำที่ไม่จำเป็นอีกต่อไปในกรณีส่วนใหญ่ โค้ดที่เก็บการอ้างอิงถึงวัตถุไว้นานเกินความจำเป็นอาจยังคงใช้หน่วยความจำมากกว่าที่ควรจะเป็น อย่างไรก็ตาม เมื่อการอ้างอิงสุดท้ายไปยังวัตถุถูกปล่อยแล้ว หน่วยความจำนั้นก็จะพร้อมสำหรับการเก็บกวาดโดยระบบอัตโนมัติ

ข้อยกเว้น

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

รูปแบบไวยากรณ์สำหรับการจัดการข้อยกเว้นมีดังนี้:

try { // ทำอะไรบางอย่าง} catch ( Exception ex ) { // ถ้าเกิดข้อผิดพลาด ให้ทำสิ่งนี้} finally { // ทำงานเสมอ ไม่ว่าจะเกิดข้อผิดพลาดหรือไม่ก็ตาม}

โดยทั่วไปจะเรียกว่าบล็อกโค้ด "try-catch" เนื่องจากมีการใช้ฟังก์ชัน "try" และ "catch" ซึ่งสามารถเข้าถึงได้ใน C# ทุกเวอร์ชัน ส่วน "finally" สามารถละเว้นได้ หากไม่จำเป็นต้องตรวจสอบรายละเอียดข้อผิดพลาด(Exception ex)ก็สามารถละเว้นพารามิเตอร์ได้เช่นกัน นอกจากนี้ ยังสามารถมีส่วน "catch" หลายส่วนที่จัดการกับข้อยกเว้นประเภทต่างๆ ได้[ 93 ]

ข้อยกเว้นที่ตรวจสอบแล้วไม่มีอยู่ใน C# (ซึ่งแตกต่างจาก Java) นี่เป็นการตัดสินใจโดยตั้งใจโดยคำนึงถึงปัญหาเรื่องความสามารถในการขยายขนาดและการจัดการเวอร์ชัน[ 94 ]

โพลีมอร์ฟิซึม

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

เมื่อมีการใช้งานอินเทอร์เฟซหลายตัวที่มีเมธอดชื่อเดียวกันและรับพารามิเตอร์ประเภทเดียวกันในลำดับเดียวกัน กล่าวคือมีลายเซ็น เดียวกัน คล้ายกับในภาษา Javaภาษา C# อนุญาตให้ใช้เมธอดเดียวเพื่อครอบคลุมทุกอินเทอร์เฟซ และหากจำเป็น ก็สามารถใช้เมธอดเฉพาะสำหรับแต่ละอินเทอร์เฟซได้

C# ยังเสนอการโอเวอร์โหลดฟังก์ชัน (หรือที่เรียกว่าad-hoc-polymorphism ) กล่าวคือ เมธอดที่มีชื่อเดียวกัน แต่มีลายเซ็นที่แตกต่างกัน[ 95 ]ต่างจาก Java C# ยังรองรับการโอเวอร์โหลดตัวดำเนินการอีก ด้วย [ 96 ]

ตั้งแต่เวอร์ชัน 2.0 เป็นต้นมา C# นำเสนอโพลีมอร์ฟิซึมแบบพารามิเตอร์กล่าวคือ คลาสที่มีพารามิเตอร์ประเภทที่กำหนดเองหรือจำกัด เช่นList<T>อาร์เรย์ที่มีขนาดแปรผันได้ซึ่งสามารถมีองค์ประกอบประเภทTX เท่านั้น โปรแกรมเมอร์สามารถระบุข้อจำกัดบางประเภทสำหรับพารามิเตอร์ประเภทได้ เช่น ต้องเป็นประเภท X ( หรือประเภทที่ได้มาจาก X ) ต้องใช้งานอินเทอร์เฟซที่กำหนด ต้องเป็นประเภทอ้างอิง ต้องเป็นประเภทค่า ต้องใช้งานคอนสตรัคเตอร์ สาธารณะที่ไม่มีพารามิเตอร์ ข้อจำกัด ส่วนใหญ่สามารถรวมกันได้ และสามารถระบุอินเทอร์เฟซได้จำนวนเท่าใดก็ได้[ 97 ] [ 98 ]

การค้นหาแบบบูรณาการภาษา (LINQ)

C# มีความสามารถในการใช้LINQผ่าน .NET Framework นักพัฒนาสามารถสอบถามแหล่งข้อมูลได้หลากหลาย ตราบใดที่IEnumerable<T>อินเทอร์เฟซถูกใช้งานบนอ็อบเจ็กต์ ซึ่งรวมถึงเอกสารXML ชุดข้อมูล ADO.NETและฐานข้อมูลSQL [ 99 ]

การใช้LINQใน C# นำมาซึ่งข้อดีต่างๆ เช่น การสนับสนุน IntelliSenseความสามารถในการกรองที่แข็งแกร่ง ความปลอดภัยของประเภทข้อมูลพร้อมความสามารถในการตรวจสอบข้อผิดพลาดในการคอมไพล์ และความสม่ำเสมอในการสืบค้นข้อมูลจากแหล่งข้อมูลที่หลากหลาย[ 100 ] มีโครงสร้างภาษาที่แตกต่างกันหลายแบบที่สามารถใช้กับ C# และ LINQ ได้ ได้แก่ นิพจน์การสืบค้น นิพจน์แลมบ์ดา ประเภทที่ไม่ระบุชื่อ ตัวแปรที่กำหนดประเภทโดยปริยาย เมธอดส่วนขยาย และตัวเริ่มต้นออบเจ็กต์[ 101 ]

LINQ มีไวยากรณ์สองแบบ ได้แก่ ไวยากรณ์แบบสอบถามและไวยากรณ์วิธีการ อย่างไรก็ตาม คอมไพเลอร์จะแปลงไวยากรณ์แบบสอบถามเป็นไวยากรณ์วิธีการในระหว่างการคอมไพล์เสมอ[ 102 ]

โดยใช้System.Linq ;var numbers = new int [] { 5 , 10 , 8 , 3 , 6 , 12 };// ไวยากรณ์การสืบค้น (SELECT num FROM numbers WHERE num % 2 = 0 ORDER BY num) var numQuery1 = from num in numbers where num % 2 == 0 orderby num select num ;// ไวยากรณ์วิธีการvar numQuery2 = ตัวเลขโดยที่( num => num % 2 == 0 ) สั่งซื้อโดย( n => n );

การเขียนโปรแกรมเชิงฟังก์ชัน

แม้ว่า C# จะเป็นภาษาเชิงคำสั่งเป็นหลัก แต่ก็มีการเพิ่มคุณสมบัติเชิงฟังก์ชันเข้ามาเรื่อยๆ[ 103 ] [ 104 ]ตัวอย่างเช่น:

ระบบประเภททั่วไป

C# มีระบบประเภทที่เป็นเอกภาพระบบประเภทที่เป็นเอกภาพนี้เรียกว่าCommon Type System (CTS) [ 111 ] : ส่วนที่ 2 บทที่ 4: ระบบประเภท

ระบบประเภทข้อมูลแบบรวมศูนย์หมายความว่า ประเภทข้อมูลทั้งหมด รวมถึงประเภทข้อมูลพื้นฐาน เช่น จำนวนเต็ม ล้วนเป็นคลาสย่อยของคลาสหลัก ตัวอย่างเช่น ทุกประเภทข้อมูลจะสืบทอดเมธอดหนึ่งๆ System.ObjectToString()

ประเภทของข้อมูล

CTS แยกประเภทข้อมูลออกเป็นสองประเภท: [ 111 ]

  1. ประเภทอ้างอิง
  2. ประเภทค่า

อินสแตนซ์ของประเภทค่า (value types) ไม่มีทั้งเอกลักษณ์อ้างอิง (referential identity) และความหมายของการเปรียบเทียบอ้างอิง (referential comparison semantics) การเปรียบเทียบความเท่าเทียมและความไม่เท่าเทียมสำหรับประเภทค่าจะเปรียบเทียบค่าข้อมูลจริงภายในอินสแตนซ์ เว้นแต่ว่าตัวดำเนินการที่เกี่ยวข้องจะถูกโอเวอร์โหลด ประเภทค่าสืบทอดมาจากคลาส(class) มีค่าเริ่มต้นเสมอ และสามารถสร้างและคัดลอกได้เสมอ ข้อจำกัดอื่นๆ ของประเภทค่าคือ ไม่สามารถสืบทอดจากกันและกันได้ (แต่สามารถใช้งานอินเทอร์เฟซได้) และไม่สามารถมีคอนสตรัคเตอร์เริ่มต้น (ไม่มีพารามิเตอร์) ที่ชัดเจนได้ เนื่องจากมีคอนสตรัคเตอร์โดยปริยายอยู่แล้ว ซึ่งจะกำหนดค่าเริ่มต้นให้กับข้อมูลทั้งหมดที่บรรจุอยู่ด้วยค่าเริ่มต้นที่ขึ้นอยู่กับประเภท (0, null หรืออื่นๆ) ตัวอย่างของประเภทค่า ได้แก่ ประเภทพื้นฐานทั้งหมด เช่น จำนวนเต็ม 32 บิตแบบมีเครื่องหมาย(integral integer), จำนวนจุดลอยตัว IEEE 32 บิต (floating-point number) (หน่วยรหัส Unicode 16 บิต), จำนวนจุดคงที่ (fixed-point numbers) ที่มีประโยชน์สำหรับการจัดการจำนวนเงิน และ(ระบุจุดเวลาที่เฉพาะเจาะจงด้วยความแม่นยำระดับนาโนวินาที) ตัวอย่างอื่นๆ ได้แก่ การแจงนับ (enumerations) และโครงสร้างที่ผู้ใช้กำหนดเอง (user defined structures) System.ValueTypeintfloatchardecimalSystem.DateTimeenumstruct

ในทางตรงกันข้าม ประเภทอ้างอิงมีแนวคิดเรื่องเอกลักษณ์เชิงอ้างอิง หมายความว่าแต่ละอินสแตนซ์ของประเภทอ้างอิงนั้นแตกต่างจากอินสแตนซ์อื่นๆ อย่างสิ้นเชิง แม้ว่าข้อมูลภายในทั้งสองอินสแตนซ์จะเหมือนกันก็ตาม สิ่งนี้สะท้อนให้เห็นในการเปรียบเทียบความเท่าเทียมและความไม่เท่าเทียมกันโดยค่าเริ่มต้นสำหรับประเภทอ้างอิง ซึ่งจะทดสอบความเท่าเทียมกันเชิงอ้างอิงมากกว่าความเท่าเทียมกันเชิงโครงสร้าง เว้นแต่ว่าตัวดำเนินการที่เกี่ยวข้องจะถูกโอเวอร์โหลด (เช่นในกรณีของ) การดำเนินการบางอย่างไม่สามารถทำได้เสมอไป เช่น การสร้างอินสแตนซ์ของประเภทอ้างอิง การคัดลอกอินสแตนซ์ที่มีอยู่ หรือการเปรียบเทียบค่าระหว่างสองอินสแตนซ์ที่มีอยู่ อย่างไรก็ตาม ประเภทอ้างอิงเฉพาะสามารถให้บริการดังกล่าวได้โดยการเปิดเผยตัวสร้างสาธารณะหรือการใช้งานอินเทอร์เฟซที่เกี่ยวข้อง (เช่นหรือ) ตัวอย่างของประเภทอ้างอิง ได้แก่(คลาสพื้นฐานขั้นสูงสุดสำหรับคลาส C# อื่นๆ ทั้งหมด), (สตริงของอักขระ Unicode) และ(คลาสพื้นฐานสำหรับอาร์เรย์ C# ทั้งหมด) System.StringICloneableIComparableobjectSystem.StringSystem.Array

ทั้งสองประเภทสามารถขยายเพิ่มเติมได้ด้วยประเภทที่ผู้ใช้กำหนดเอง

การแพ็คและแกะกล่อง

Boxingคือการดำเนินการแปลงวัตถุประเภทค่าให้เป็นค่าของประเภทอ้างอิงที่สอดคล้องกัน[ 111 ] Boxing ใน C# เป็นแบบโดยปริยาย

การ Unboxingคือการดำเนินการแปลงค่าของประเภทอ้างอิง (ที่ถูกบรรจุไว้ก่อนหน้านี้) ให้เป็นค่าของประเภทค่า[ 111 ]การ Unboxing ใน C# ต้องใช้การแปลงประเภท อย่างชัดเจน อ็อบเจ็กต์ที่ถูกบรรจุไว้ของประเภท T สามารถ Unboxing ได้เฉพาะเป็น T (หรือ T ที่เป็นค่าว่าง) เท่านั้น[ 112 ]

ตัวอย่าง:

int foo = 42 ; // ประเภทค่าobject bar = foo ; // foo ถูกแปลงเป็น bar int foo2 = ( int ) bar ; // แปลงกลับเป็นประเภทค่า

ห้องสมุด

ข้อกำหนดของ C# ระบุรายละเอียดของชุดประเภทและไลบรารีคลาสขั้นต่ำที่คอมไพเลอร์คาดหวังว่าจะต้องมี ในทางปฏิบัติ C# มักถูกใช้ร่วมกับการใช้งานโครงสร้างพื้นฐานภาษาทั่วไป (CLI) ซึ่งได้รับการกำหนดมาตรฐานเป็น ECMA-335 Common Language Infrastructure (CLI )

นอกเหนือจากข้อกำหนด CLI มาตรฐานแล้ว ยังมีไลบรารีคลาสเชิงพาณิชย์และชุมชนจำนวนมากที่สร้างขึ้นบนไลบรารีเฟรมเวิร์ก .NET เพื่อให้ฟังก์ชันการทำงานเพิ่มเติม[ 113 ]

ภาษา C# สามารถเรียกใช้ไลบรารีใดก็ได้ที่อยู่ในรายการไลบรารีและเฟรมเวิร์กของ . NET

ตัวอย่าง

สวัสดีโลก

ต่อไปนี้เป็นโปรแกรม C# ที่เรียบง่ายมาก ซึ่งเป็นเวอร์ชันของตัวอย่าง " Hello World " แบบคลาสสิกโดยใช้ คุณสมบัติ คำสั่งระดับบนสุดที่แนะนำใน C# 9: [ 114 ]

Console.WriteLine ( "Hello, World! " ) ;

สำหรับโค้ดที่เขียนด้วย C# 8 หรือเวอร์ชันต่ำกว่า ตรรกะจุดเริ่มต้นของโปรแกรมจะต้องเขียนอยู่ในเมธอด Main ภายในประเภทข้อมูล:

โดยใช้ระบบ;คลาสProgram { static void Main () { Console . WriteLine ( "Hello, World!" ); } }

โค้ดนี้จะแสดงข้อความต่อไปนี้ในหน้าต่างคอนโซล:

สวัสดีโลก! 

แต่ละเส้นมีจุดประสงค์:

โดยใช้ระบบ;

บรรทัดด้านบนนำเข้าประเภททั้งหมดในSystemเนมสเปซ ตัวอย่างเช่นConsoleคลาสที่ใช้ในภายหลังในซอร์สโค้ดนั้นถูกกำหนดไว้ในSystemเนมสเปซ ซึ่งหมายความว่าสามารถใช้งานได้โดยไม่ต้องระบุชื่อเต็มของประเภท (ซึ่งรวมถึงเนมสเปซด้วย)

// ตัวอย่างโปรแกรม "Hello World" เวอร์ชันหนึ่ง

บรรทัดนี้เป็นข้อความแสดงความคิดเห็น ซึ่งอธิบายและให้รายละเอียดเกี่ยวกับโค้ดแก่โปรแกรมเมอร์

โปรแกรมชั้นเรียน

ด้านบนคือคำจำกัดความของคลาสProgramทุกสิ่งที่อยู่ภายในวงเล็บปีกกาจะอธิบายรายละเอียดของคลาสนั้น

{ ... }

วงเล็บปีกกาใช้กำหนดขอบเขตของบล็อกโค้ด ในกรณีแรกนี้ วงเล็บปีกกาใช้กำหนดจุดเริ่มต้นและจุดสิ้นสุดของProgramคลาส

static void Main ()

นี่เป็นการประกาศเมธอดสมาชิกคลาสที่โปรแกรมเริ่มการทำงาน รันไทม์ .NET จะเรียกMainเมธอดนั้น ต่างจากในJava เมธอด นี้Mainไม่จำเป็นต้องใช้publicคีย์เวิร์ด ซึ่งบอกคอมไพเลอร์ว่าสามารถเรียกเมธอดได้จากทุกที่โดยคลาสใดก็ได้[ 115 ]การเขียนนั้นเทียบเท่ากับการเขียนคีย์เวิร์ดstaticทำให้สามารถเข้าถึงเมธอดได้โดยไม่ต้องมีอินสแตนซ์ของจุดเริ่มต้นของแอปพลิเคชันคอนโซลแต่ละตัว จะต้องถูกประกาศ มิฉะนั้นโปรแกรมจะต้องใช้อินสแตนซ์ของแต่ทุกอินสแตนซ์จะต้องใช้โปรแกรม เพื่อหลีกเลี่ยงการพึ่งพาแบบวงกลม ที่ไม่สามารถแก้ไขได้ คอมไพเลอร์ C# ที่ประมวลผลแอปพลิเคชันคอนโซล (เช่นข้างต้น) จะรายงานข้อผิดพลาดหากไม่มีเมธอดคีย์เวิร์ดประกาศว่าไม่มีค่าส่งคืน (อย่างไรก็ตาม โปรดทราบว่าสามารถเขียนโปรแกรมสั้นๆ ได้โดยใช้คำสั่งระดับบนสุดที่แนะนำใน C# 9 ดังที่กล่าวไว้ก่อนหน้านี้) staticvoidMain(string[]args)privatestaticvoidMain(string[]args)ProgramMainstaticProgramstaticMainvoidMain

Console.WriteLine ( "Hello, World! " ) ;

บรรทัดนี้เขียนเอาต์พุตConsoleเป็นคลาสแบบคงที่ในSystemเนมสเปซ มันมีอินเทอร์เฟซสำหรับอินพุต/เอาต์พุต มาตรฐาน และสตรีมข้อผิดพลาดสำหรับแอปพลิเคชันคอนโซล โปรแกรมเรียกConsoleเมธอดWriteLineซึ่งจะแสดงบรรทัดบนคอนโซลพร้อมอาร์กิวเมนต์"Hello, World!"สตริง

ยาสามัญ

ด้วย .NET 2.0 และ C# 2.0 ชุมชนนักพัฒนาได้รับคอลเลกชันที่มีความยืดหยุ่นมากกว่าใน .NET 1.x เนื่องจากไม่มีเจเนริก นักพัฒนาจึงต้องใช้คอลเลกชันเช่น ArrayList เพื่อจัดเก็บองค์ประกอบเป็นอ็อบเจ็กต์ที่มีชนิดไม่ระบุ ซึ่งทำให้เกิดภาระด้านประสิทธิภาพเมื่อทำการแปลงชนิดข้อมูล (boxing/unboxing/type-checking) ของรายการที่บรรจุอยู่ภายใน

Generics ได้นำเสนอคุณสมบัติใหม่ที่สำคัญใน .NET ซึ่งช่วยให้นักพัฒนาสามารถสร้างโครงสร้างข้อมูลที่ปลอดภัยต่อประเภทได้ การเปลี่ยนแปลงนี้มีความสำคัญอย่างยิ่งในบริบทของการแปลงระบบเดิม ซึ่งการอัปเดตเป็น Generics สามารถเพิ่มประสิทธิภาพและความสามารถในการบำรุงรักษาได้อย่างมาก โดยการแทนที่โครงสร้างข้อมูลที่ล้าสมัยด้วยทางเลือกที่มีประสิทธิภาพและปลอดภัยต่อประเภทมากกว่า[ 116 ]

ตัวอย่าง

public class DataStore < T > { private T [] items = new T [ 10 ]; private int count = 0 ;public void Add ( T item ) { items [ count ++ ] = item ; }public T Get ( int index ) { return items [ index ]; } }

การกำหนดมาตรฐานและการออกใบอนุญาต

ในเดือนสิงหาคม พ.ศ. 2544 ไมโครซอฟต์ฮิวเลตต์-แพคการ์ดและอินเทลได้ร่วมกันสนับสนุนการส่งข้อกำหนดสำหรับภาษา C# รวมถึงโครงสร้างพื้นฐานภาษาทั่วไป (CLI) ไปยังองค์กรมาตรฐานECMA International (ECMA ) ในเดือนธันวาคม พ.ศ. 2544 ECMA ได้เผยแพร่ข้อกำหนดภาษา C# ECMA-334 ภาษา C# กลายเป็น มาตรฐาน ISO / IECในปี พ.ศ. 2546 (ISO/IEC 23270:2003 - เทคโนโลยีสารสนเทศ — ภาษาโปรแกรม — C# ) ก่อนหน้านี้ ECMA ได้นำข้อกำหนดที่เทียบเท่ากันมาใช้เป็น C# ฉบับที่ 2 ในเดือนธันวาคม พ.ศ. 2545 ในเดือนมิถุนายน พ.ศ. 2548 ECMA ได้อนุมัติข้อกำหนด C# ฉบับที่ 3 และปรับปรุง ECMA-334 โดยเพิ่มคลาสบางส่วน เมธอดนิรนาม ประเภทที่อนุญาตให้เป็นค่าว่าง และเจเนริก (คล้ายกับเทมเพลต ใน C++ ) ในเดือนกรกฎาคม พ.ศ. 2548 ECMA ได้ส่งมาตรฐานและ TR ที่เกี่ยวข้องไปยัง ISO/IEC JTC 1/SC 22 ผ่านกระบวนการเร่งด่วน (Fast-Track) ของ ISO/IEC ซึ่งโดยปกติกระบวนการนี้ใช้เวลา 6-9 เดือน

นิยามของภาษา C# และ CLI ได้รับการกำหนดมาตรฐานภายใต้มาตรฐาน ISO/IEC และ Ecma ซึ่งให้การคุ้มครอง การอนุญาตใช้งานที่สมเหตุสมผลและไม่เลือกปฏิบัติจากการเรียกร้องสิทธิบัตร

ในเบื้องต้น Microsoft ตกลงที่จะไม่ฟ้องร้องนักพัฒนาโอเพนซอร์สที่ละเมิดสิทธิบัตรในโครงการที่ไม่แสวงหาผลกำไรสำหรับส่วนของเฟรมเวิร์กที่อยู่ภายใต้Open Specification Promise [ 117 ] Microsoftยังตกลงที่จะไม่บังคับใช้สิทธิบัตรที่เกี่ยวข้องกับ ผลิตภัณฑ์ ของ Novellกับลูกค้าที่ชำระเงินของ Novell [ 118 ]ยกเว้นรายการผลิตภัณฑ์ที่ไม่ได้กล่าวถึง C#, .NET หรือการใช้งาน .NET ของ Novell อย่างชัดเจน ( โครงการ Mono ) [ 119 ]อย่างไรก็ตาม Novell ยืนยันว่า Mono ไม่ได้ละเมิดสิทธิบัตรใด ๆ ของ Microsoft [ 120 ] Microsoft ยังทำข้อตกลงเฉพาะที่จะไม่บังคับใช้สิทธิบัตรที่เกี่ยวข้องกับปลั๊กอินเบราว์เซอร์ Moonlightซึ่งขึ้นอยู่กับ Mono หากได้รับผ่าน Novell [ 121 ]

สิบปีต่อมา ไมโครซอฟต์เริ่มพัฒนาเครื่องมือโอเพนซอร์สฟรีและใช้งานได้หลายแพลตฟอร์มสำหรับภาษา C# ได้แก่Visual Studio Code , .NET CoreและRoslyn ส่วน Mono เข้าร่วมกับไมโครซอฟต์ในฐานะโครงการหนึ่งของXamarinซึ่งเป็นบริษัทในเครือของไมโครซอฟต์

การนำไปใช้

ไมโครซอฟต์ได้พัฒนา คอมไพเลอร์และเครื่องมือ C# แบบอ้างอิงโอเพนซอร์สคอมไพเลอร์ตัวแรกคือRoslynซึ่งคอมไพล์เป็นภาษาตัวกลาง (IL) และตัวที่สองคือ RyuJIT [ 122 ]เป็นคอมไพเลอร์ JIT (just-in-time) ซึ่งเป็นแบบไดนามิกและทำการเพิ่มประสิทธิภาพแบบทันทีทันใด และคอมไพล์ IL เป็นโค้ดเนทีฟสำหรับส่วนหน้าของ CPU [ 123 ] RyuJIT เป็นโอเพนซอร์สและเขียนด้วยภาษา C++ [ 124 ] Roslyn เขียนด้วยโค้ดจัดการ (C#) ทั้งหมด ได้รับการเปิดและฟังก์ชันการทำงานปรากฏเป็น API จึงช่วยให้นักพัฒนาสามารถสร้างเครื่องมือการปรับโครงสร้างและการวินิจฉัยได้[ 5 ] [ 125 ]การใช้งานอย่างเป็นทางการมีสองสาขา ได้แก่ .NET Framework (ปิดซอร์ส เฉพาะ Windows) และ .NET Core (โอเพนซอร์ส ข้ามแพลตฟอร์ม) ซึ่งในที่สุดก็รวมกันเป็นการใช้งานโอเพนซอร์สเดียวคือ .NET 5.0 [ 126 ]ใน .NET Framework 4.6 คอมไพเลอร์ JIT ตัวใหม่ได้เข้ามาแทนที่ตัวเดิม[ 122 ] [ 127 ]

คอมไพเลอร์ C# อื่นๆ (บางตัวรวมถึงการใช้งานโครงสร้างพื้นฐานภาษาทั่วไปและไลบรารีคลาส .NET):

  • Monoซึ่งเป็นโครงการที่ได้รับการสนับสนุนจาก Microsoft ให้บริการคอมไพเลอร์ C# แบบโอเพนซอร์ส การใช้งาน CLI แบบโอเพนซอร์สอย่างสมบูรณ์ (รวมถึงไลบรารีเฟรมเวิร์กที่จำเป็นตามที่ปรากฏในข้อกำหนด ECMA) และการใช้งานไลบรารีคลาส .NET ที่เกือบสมบูรณ์จนถึง .NET Framework 3.5
  • ชุด เครื่องมือ ElementsจากRemObjectsประกอบด้วย RemObjects C# ซึ่งคอมไพล์โค้ด C# ไปเป็นCommon Intermediate Language (CIL) ของ .NET , Java bytecode , Cocoa , Android bytecode , WebAssemblyและโค้ดเครื่องจักรดั้งเดิมสำหรับ Windows, macOS และ Linux
  • โครงการDotGNU (ซึ่งปัจจุบันยุติลงแล้ว) ยังได้จัดหาคอมไพเลอร์ C# แบบโอเพนซอร์ส การใช้งานโครงสร้างพื้นฐานภาษาทั่วไป (Common Language Infrastructure) ที่เกือบสมบูรณ์ รวมถึงไลบรารีเฟรมเวิร์กที่จำเป็นตามที่ปรากฏในข้อกำหนด ECMA และส่วนย่อยของไลบรารีคลาส .NET ที่เป็นกรรมสิทธิ์ของ Microsoft ที่เหลืออยู่จนถึง .NET 2.0 (ไลบรารีที่ไม่ได้รับการบันทึกหรือรวมอยู่ในข้อกำหนด ECMA แต่รวมอยู่ในชุดการแจกจ่าย .NET Framework มาตรฐานของ Microsoft)

เอนจินเกม Unityใช้ C# เป็นภาษาสคริปต์หลักเอนจินเกม Godotได้นำโมดูล C# เสริมมาใช้เนื่องจากการบริจาคเงิน 24,000 ดอลลาร์จาก Microsoft [ 128 ]

ดูเพิ่มเติม

หมายเหตุ

  1. ^สำหรับอะซิงโครนัส
  2. ^ตามธรรมเนียมแล้ว ในข้อความทั่วไปจะใช้ เครื่องหมาย #สำหรับอักขระตัวที่สอง ในงานศิลปะบางครั้งอาจใช้เครื่องหมายชาร์ป จริง: C♯ อย่างไรก็ตาม มาตรฐาน ECMA 334 ระบุว่า: "ชื่อ C# เขียนโดยใช้อักษรละตินตัวพิมพ์ใหญ่ C (U+0043) ตามด้วยเครื่องหมาย # (U+0023)"
  3. ^เวอร์ชันภาษา 1.0, 2.0 และ 5.0 มีให้ใช้งานในรูปแบบ ISO/IEC 23270 ตั้งแต่เวอร์ชัน 7.0 เป็นต้นไป ข้อกำหนดนี้มีให้ใช้งานในรูปแบบ ISO/IEC 20619
  4. ^เอกสารข้อกำหนด Microsoft C# 2.0 มีเฉพาะคุณสมบัติใหม่ของเวอร์ชัน 2.0 เท่านั้น สำหรับคุณสมบัติเก่ากว่า ให้ใช้ข้อกำหนดเวอร์ชัน 1.2 ด้านบน

อ่านเพิ่มเติม

  • เดรย์ตัน, ปีเตอร์; อัลบาฮารี, เบน; นิววาร์ด, เท็ด (2002) การอ้างอิงกระเป๋าภาษา C #โอ'ไรลี่. ไอเอสบีเอ็น 0-596-00429-X.
  • Petzold, Charles (2002). การเขียนโปรแกรม Microsoft Windows ด้วย C# . สำนักพิมพ์ Microsoft. ISBN 0-7356-1370-2.
  • ข้อกำหนดภาษา C#
  • คู่มือการเขียนโปรแกรม C#
  • ข้อกำหนดภาษา C# ของ ISO
  • ซอร์สโค้ดของแพลตฟอร์มคอมไพเลอร์ C# ("Roslyn")
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=C_Sharp_(programming_language)&oldid=1359988561#Implementations "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ซีชาร์ป (ภาษาโปรแกรม)

C# ( / ˌ s iː ˈ ʃ ɑːr p / ดู SHARP ) [ b ] เป็น ภาษาโปรแกรม ระดับสูง อเนกประสงค์ ที่รองรับ กระบวนทัศน์ หลายแบบC# ครอบคลุมการ กำหนดประเภทแบบคงที่ [ 17 ] : 4 การกำหนดประเภทที่...

เป้าหมายการออกแบบ

มาตรฐาน Ecma ระบุเป้าหมายการออกแบบเหล่านี้สำหรับ C#: [ 1 ]

ประวัติศาสตร์

ในระหว่างการพัฒนา . NET Framework ไลบรารี คลาส ถูกเขียนขึ้นโดยใช้ ระบบคอมไพเลอร์ โค้ดจัดการ ชื่อ Simple Managed C (SMC) [ 23 ] [ 24 ] ในเดือนมกราคม พ.ศ.

ชื่อ

ไมโครซอฟต์ ใช้ชื่อ C# เป็นครั้งแรกในปี พ.ศ. 2531 สำหรับภาษา C เวอร์ชันหนึ่งที่ออกแบบมาสำหรับการคอมไพล์แบบเพิ่มทีละขั้น [ 38 ] โครงการนั้นไม่เสร็จสมบูรณ์ และชื่อดังกล่าวก็ถูกนำกลับมาใช้ใหม่ในภายหลัง