सी शार्प (प्रोग्रामिंग भाषा)

सी # (उच्चारण ) एक सामान्य-उद्देश्य वाली उच्च-स्तरीय प्रोग्रामिंग भाषा है | उच्च-स्तरीय प्रोग्रामिंग भाषा है जो कई प्रोग्रामिंग प्रतिमानों का समर्थन करती है। सी # स्थिर टाइपिंग शामिल है, मजबूत टाइपिंग, लेक्सिकली स्कोप्ड, इम्पीरेटिव प्रोग्रामिंग, घोषणात्मक प्रोग्रामिंग,  कार्यात्मक प्रोग्रामिंग ,  सामान्य प्रोग्रामिंग , ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग|ऑब्जेक्ट-ओरिएंटेड (कक्षा (कंप्यूटर विज्ञान)-आधारित), और घटक-आधारित सॉफ़्टवेयर इंजीनियरिंग|घटक-उन्मुख प्रोग्रामिंग विषय।

C# प्रोग्रामिंग लैंग्वेज को 2000 में माइक्रोसॉफ्ट के एंडर्स हेल्सबर्ग  द्वारा डिजाइन किया गया था और बाद में 2002 में एक्मा इंटरनेशनल (ECMA-334) और 2003 में मानकीकरण/अंतर्राष्ट्रीय इलेक्ट्रोटेक्निकल कमीशन (ISO/IEC 23270) के लिए अंतर्राष्ट्रीय संगठन द्वारा एक अंतरराष्ट्रीय मानक के रूप में अनुमोदित किया गया था। .NET फ्रेमवर्क और विज़ुअल स्टूडियो के साथ C# की शुरुआत की, जो दोनों मालिकाना सॉफ्टवेयर | क्लोज्ड-सोर्स थे। उस समय, Microsoft के पास कोई ओपन-सोर्स उत्पाद नहीं था। चार साल बाद, 2004 में, मोनो (सॉफ्टवेयर) नामक एक स्वतंत्र और ओपन-सोर्स प्रोजेक्ट शुरू हुआ, जो सी # प्रोग्रामिंग भाषा के लिए एक क्रॉस-प्लेटफॉर्म  संकलक  और रनटाइम वातावरण प्रदान करता है। एक दशक बाद, माइक्रोसॉफ्ट ने विजुअल स्टूडियो कोड (कोड एडिटर), रोसलिन (कंपाइलर) (कंपाइलर) और .NET|यूनिफाइड .NET प्लेटफॉर्म (सॉफ्टवेयर फ्रेमवर्क) जारी किया, जो सभी C# को सपोर्ट करते हैं और फ्री, ओपन-सोर्स और हैं क्रॉस-प्लेटफ़ॉर्म। मोनो भी माइक्रोसॉफ्ट में शामिल हो गया लेकिन .NET में विलय नहीं हुआ।

भाषा का सबसे नवीनतम स्थिर संस्करण C# 11.0 है, जिसे 2022 में .NET 7.0 में रिलीज़ किया गया था।

डिजाइन लक्ष्य
Ecma मानक C# के लिए इन डिज़ाइन लक्ष्यों को सूचीबद्ध करता है:
 * भाषा का उद्देश्य एक सरल, आधुनिक, सामान्य-उद्देश्य, वस्तु-उन्मुख प्रोग्रामिंग | वस्तु-उन्मुख प्रोग्रामिंग भाषा होना है।
 * भाषा और उसके कार्यान्वयन को सॉफ्टवेयर इंजीनियरिंग सिद्धांतों के लिए समर्थन प्रदान करना चाहिए जैसे कि मजबूत प्रकार की जाँच, सरणी सीमा की जाँच, अप्रारंभीकृत चर, और स्वचालित कचरा संग्रह (कंप्यूटर विज्ञान) का उपयोग करने के प्रयासों का पता लगाना। सॉफ़्टवेयर मजबूती, टिकाऊपन और प्रोग्रामर उत्पादकता महत्वपूर्ण हैं।
 * वितरित वातावरण में तैनाती पर्यावरण के लिए उपयुक्त सॉफ्टवेयर घटकों के विकास में उपयोग के लिए भाषा का इरादा है।
 * सॉफ्टवेयर पोर्टेबिलिटी स्रोत कोड और प्रोग्रामर के लिए बहुत महत्वपूर्ण है, खासकर जो पहले से ही सी (प्रोग्रामिंग भाषा) और सी ++ से परिचित हैं।
 * अंतर्राष्ट्रीयकरण और स्थानीयकरण के लिए समर्थन बहूत ज़रूरी है।
 * C# को होस्ट किए गए और अंतः स्थापित प्रणाली  दोनों के लिए एप्लिकेशन लिखने के लिए उपयुक्त बनाया गया है, जो बहुत बड़े से लेकर परिष्कृत ऑपरेटिंग सिस्टम का उपयोग करते हैं, बहुत कम समर्पित कार्यों के लिए।
 * हालांकि C# अनुप्रयोगों का उद्देश्य स्मृति और प्रसंस्करण शक्ति आवश्यकताओं के संबंध में किफायती होना है, भाषा का उद्देश्य C या असेंबली भाषा के साथ प्रदर्शन और आकार पर सीधे प्रतिस्पर्धा करना नहीं था।

इतिहास
.NET फ्रेमवर्क के विकास के दौरान, बेस क्लास लाइब्रेरी मूल रूप से सिंपल मैनेज्ड C (SMC) नामक एक प्रबंधित कोड कंपाइलर सिस्टम का उपयोग करके लिखी गई थी। जनवरी 1999 में, एंडर्स हेजल्सबर्ग ने कूल नामक एक नई भाषा बनाने के लिए एक टीम बनाई, जो  सी-तरह  ऑब्जेक्ट ओरिएंटेड लैंग्वेज के लिए खड़ी थी। माइक्रोसॉफ्ट ने कूल नाम को भाषा के अंतिम नाम के रूप में रखने पर विचार किया था, लेकिन ट्रेडमार्क कारणों से ऐसा नहीं करने का फैसला किया। जुलाई 2000 के पेशेवर डेवलपर्स सम्मेलन में .NET परियोजना की सार्वजनिक घोषणा के समय तक, भाषा का नाम बदलकर C# कर दिया गया था, और क्लास लाइब्रेरी और ASP.NET रनटाइम को C# में पोर्ट कर दिया गया था।

Hejlsberg Microsoft में C# के प्रमुख डिज़ाइनर और प्रमुख वास्तुकार हैं, और पहले टर्बो पास्कल, Embarcadero Delphi (पूर्व में CodeGear Delphi, Inprise Delphi और Borland Delphi), और Visual J++ के डिज़ाइन में शामिल थे। साक्षात्कारों और तकनीकी पत्रों में उन्होंने कहा है कि खामियां अधिकांश प्रमुख प्रोग्रामिंग भाषाओं में (जैसे C++, Java (प्रोग्रामिंग लैंग्वेज), डेल्फी (प्रोग्रामिंग भाषा), और स्मॉलटॉक) ने  सामान्य भाषा रनटाइम  (CLR) के मूल सिद्धांतों को संचालित किया, जो बदले में, C# भाषा के डिजाइन को ही संचालित करता है।

जेम्स गोसलिंग, जिन्होंने 1994 में जावा (प्रोग्रामिंग लैंग्वेज) प्रोग्रामिंग लैंग्वेज बनाई, और जावा के प्रवर्तक सन माइक्रोसिस्टम्स के सह-संस्थापक बिल जॉय ने C# को जावा की नकल कहा; गोस्लिंग ने आगे कहा कि [C# is] विश्वसनीयता, उत्पादकता और सुरक्षा के साथ जावा की तरह हटा दिया गया। क्लाउस क्रेफ्ट और एंजेलिका लैंगर (C++ स्ट्रीम बुक के लेखक) ने एक ब्लॉग पोस्ट में कहा कि Java और C# लगभग समान प्रोग्रामिंग लैंग्वेज हैं। उबाऊ दोहराव जिसमें नवीनता का अभाव है, शायद ही कोई यह दावा करेगा कि जावा या सी # क्रांतिकारी प्रोग्रामिंग लैंग्वेज हैं, जिन्होंने हमारे प्रोग्राम लिखने के तरीके को बदल दिया, और सी # ने जावा से बहुत कुछ उधार लिया - और इसके विपरीत। अब जब C# बॉक्सिंग (कंप्यूटर विज्ञान) और अनबॉक्सिंग का समर्थन करता है, तो हमारे पास जावा में एक समान सुविधा होगी। जुलाई 2000 में, हेजल्सबर्ग ने कहा कि सी # जावा क्लोन नहीं है और इसके डिजाइन में सी ++ के बहुत करीब है। नवंबर 2005 में C# 2.0 के रिलीज़ होने के बाद से, C# और Java भाषाएँ तेजी से अलग-अलग प्रक्षेपवक्रों पर विकसित हुई हैं, दो बिल्कुल अलग भाषाएँ बन गई हैं। पहले प्रमुख प्रस्थानों में से एक दोनों भाषाओं में व्यापक रूप से भिन्न कार्यान्वयन के साथ सामान्य प्रोग्रामिंग को शामिल करने के साथ आया। C# प्रथम श्रेणी की सामान्य वस्तुएं प्रदान करने के लिए Reification (कंप्यूटर विज्ञान) का उपयोग करता है, जिसका उपयोग किसी भी अन्य वर्ग की तरह किया जा सकता है, जिसमें कोड जनरेशन (संकलक)  क्लास-लोड समय पर किया जाता है। इसके अलावा, सी # ने कार्यात्मक-शैली प्रोग्रामिंग को समायोजित करने के लिए कई प्रमुख विशेषताओं को जोड़ा है, जो सी # 3.0 के साथ जारी भाषा एकीकृत क्वेरी विस्तार विधि इसके बेनामी फ़ंक्शन, एक्सटेंशन विधियों और अज्ञात प्रकारों के सहायक ढांचे में समाप्त हो गया है। ये सुविधाएँ C# प्रोग्रामर को कार्यात्मक प्रोग्रामिंग तकनीकों का उपयोग करने में सक्षम बनाती हैं, जैसे क्लोजर (कंप्यूटर विज्ञान), जब यह उनके अनुप्रयोग के लिए लाभप्रद होता है। LINQ एक्सटेंशन और कार्यात्मक आयात डेवलपर्स को बॉयलरप्लेट कोड की मात्रा को कम करने में मदद करते हैं जो सामान्य कार्यों में शामिल होता है जैसे डेटाबेस को क्वेरी करना, एक xml फ़ाइल को पार्स करना, या डेटा संरचना के माध्यम से खोज करना, पठनीयता में सुधार करने में मदद करने के लिए वास्तविक प्रोग्राम लॉजिक पर जोर देना और रख-रखाव। C# में एंडी (एंडर्स हेजल्सबर्ग के नाम पर) नाम का शुभंकर हुआ करता था। यह 29 जनवरी, 2004 को सेवानिवृत्त हो गया था। C# मूल रूप से ISO/IEC JTC 1 उपसमिति ISO/IEC JTC 1/SC 22 को समीक्षा के लिए प्रस्तुत किया गया था, आईएसओ/आईईसी 23270:2003 के तहत, वापस ले लिया गया था और फिर ISO/IEC 23270:2006 के तहत अनुमोदित किया गया था। 23270:2006 को 23270:2018 के तहत वापस ले लिया गया है और इस संस्करण के साथ अनुमोदित किया गया है।

नाम
Microsoft ने पहली बार 1988 में वृद्धिशील संकलन के लिए डिज़ाइन की गई C भाषा के एक संस्करण के लिए C# नाम का उपयोग किया था। वह परियोजना पूरी नहीं हुई थी, और बाद में नाम का पुन: उपयोग किया गया।

सी शार्प नाम म्यूजिकल नोटेशन से प्रेरित था जिससे एक शार्प (म्यूजिक) इंगित करता है कि लिखित नोट को पिच (म्यूजिक) में एक सेमिटोन उच्च बनाया जाना चाहिए। यह C++ के भाषा नाम के समान है, जहां ++ इंगित करता है कि मूल्यांकन किए जाने के बाद एक चर को 1 से बढ़ाया जाना चाहिए। तेज प्रतीक भी चार + प्रतीकों (दो-दो-दो ग्रिड में) के टाइपोग्राफिक संयुक्ताक्षर जैसा दिखता है, जिसका अर्थ है कि भाषा सी ++ की वृद्धि है। प्रदर्शन की तकनीकी सीमाओं (मानक फोंट, ब्राउज़र, आदि) के कारण और तथ्य यह है कि तेज प्रतीक अधिकांश कीबोर्ड लेआउट पर मौजूद नहीं है, संख्या चिह्न  प्रोग्रामिंग भाषा के लिखित नाम में तेज प्रतीक का अनुमान लगाने के लिए चुना गया था। यह सम्मेलन ECMA-334 C# भाषा विशिष्टता में परिलक्षित होता है।

तेज प्रत्यय का उपयोग कई अन्य .NET भाषाओं द्वारा किया गया है जो मौजूदा भाषाओं के वेरिएंट हैं, जिनमें J Sharp|J# (एक .NET भाषा भी Microsoft द्वारा डिज़ाइन की गई है जो Java 1.1 से ली गई है), A Sharp (.NET)| ए # (एडा (प्रोग्रामिंग भाषा) से), और कार्यात्मक प्रोग्रामिंग भाषा एफ शार्प (प्रोग्रामिंग भाषा) | एफ #। EiffelStudio|Eiffel for .NET के मूल कार्यान्वयन को Eiffel# कहा जाता था, पूर्ण एफिल (प्रोग्रामिंग भाषा) भाषा के बाद से सेवानिवृत्त नाम अब समर्थित है। लाइब्रेरी (कंप्यूटिंग) के लिए भी प्रत्यय का उपयोग किया गया है, जैसे कि Gtk Sharp|Gtk# (GTK और अन्य GNOME लाइब्रेरी के लिए .NET रैपर पैटर्न) और Cocoa Sharp|Cocoa# (कोको के लिए एक रैपर (API))।

सिंटेक्स
C# भाषा का मूल सिंटैक्स अन्य C-शैली भाषाओं जैसे C, C++ और Java के समान है, विशेष रूप से:


 * अर्धविराम का उपयोग किसी कथन के अंत को दर्शाने के लिए किया जाता है।
 * घुंघराले कोष्ठक बयानों को समूहीकृत करने के लिए उपयोग किए जाते हैं। स्टेटमेंट को आमतौर पर मेथड्स (फंक्शंस), मेथड्स को क्लासेस और क्लासेस को नेमस्पेस में ग्रुप किया जाता है।
 * वेरिएबल्स को एक बराबर चिह्न का उपयोग करके निर्दिष्ट किया जाता है, लेकिन == का उपयोग करके तुलना की जाती है।
 * वर्ग कोष्ठक का उपयोग सरणी डेटा संरचना के साथ किया जाता है, दोनों को घोषित करने के लिए और उनमें से किसी एक में दिए गए सूचकांक पर मूल्य प्राप्त करने के लिए।

विशिष्ट विशेषताएं
सी # की कुछ उल्लेखनीय विशेषताएं जो इसे सी, सी ++ और जावा से अलग करती हैं, जहां उल्लेख किया गया है:

पोर्टेबिलिटी
डिज़ाइन के अनुसार, C# प्रोग्रामिंग लैंग्वेज है जो अंतर्निहित सामान्य भाषा अवसंरचना (CLI) को सीधे तौर पर दर्शाती है। इसके अधिकांश आंतरिक प्रकार सीएलआई ढांचे द्वारा कार्यान्वित मूल्य-प्रकारों के अनुरूप हैं। हालांकि, भाषा विनिर्देश संकलक की कोड जनरेशन आवश्यकताओं को नहीं बताता है: यानी, यह नहीं बताता है कि सी # कंपाइलर को सामान्य भाषा रनटाइम को लक्षित करना चाहिए, या सामान्य इंटरमीडिएट भाषा (सीआईएल) उत्पन्न करना चाहिए, या कोई अन्य विशिष्ट प्रारूप उत्पन्न करना चाहिए। सैद्धांतिक रूप से, एक सी # कंपाइलर सी ++ या फोरट्रान के पारंपरिक कंपाइलर्स जैसे मशीन कोड उत्पन्न कर सकता है।

टाइपिंग
सी # कीवर्ड के साथ दृढ़ता से टाइप किए गए परिवर्तनीय घोषणाओं का दृढ़ता से समर्थन करता है, और कीवर्ड के साथ निहित रूप से टाइप की गई सरणियाँ   एक संग्रह प्रारंभकर्ता द्वारा पीछा किया।

सी # सख्त बूलियन डेटा प्रकार का समर्थन करता है,. बयान जो शर्तों को लेते हैं, जैसे  और , को लागू करने वाले प्रकार की अभिव्यक्ति की आवश्यकता होती है   ऑपरेटर, जैसे बूलियन प्रकार। जबकि C++ में एक बूलियन प्रकार भी है, इसे पूर्णांकों और भावों से मुक्त रूप से परिवर्तित किया जा सकता है   केवल उसी की आवश्यकता है   बूल में परिवर्तनीय है, अनुमति देता है   एक int, या एक सूचक होने के लिए। सी # इस पूर्णांक अर्थ को सही या गलत दृष्टिकोण से अस्वीकार करता है, इस आधार पर कि प्रोग्रामर को उन अभिव्यक्तियों का उपयोग करने के लिए मजबूर किया जाता है जो बिल्कुल वापस आते हैं   कुछ प्रकार की प्रोग्रामिंग गलतियों को रोक सकता है जैसे   (असाइनमेंट का उपयोग   समानता के बजाय  ).

सी # सी ++ की तुलना में अधिक प्रकार की सुरक्षा है। डिफ़ॉल्ट रूप से केवल अंतर्निहित रूपांतरण वे हैं जिन्हें सुरक्षित माना जाता है, जैसे पूर्णांकों का विस्तार। यह संकलन-समय पर, जस्ट-इन-टाइम संकलन के दौरान, और कुछ मामलों में, रनटाइम पर लागू होता है। बूलियन्स और पूर्णांकों के बीच कोई अंतर्निहित रूपांतरण नहीं होता है, न ही गणना सदस्यों और पूर्णांकों के बीच (शाब्दिक 0 को छोड़कर, जिसे किसी भी गणना प्रकार में परिवर्तित किया जा सकता है)। किसी भी उपयोगकर्ता-परिभाषित रूपांतरण को स्पष्ट रूप से स्पष्ट या अंतर्निहित के रूप में चिह्नित किया जाना चाहिए, सी ++ कॉपी कंस्ट्रक्टर  और रूपांतरण ऑपरेटरों के विपरीत, जो दोनों डिफ़ॉल्ट रूप से अंतर्निहित हैं।

C# में सामान्य प्रकारों में सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) के लिए स्पष्ट समर्थन है, C++ के विपरीत, जिसमें आभासी पद्धतियों पर केवल रिटर्न प्रकारों के सिमेंटिक्स के माध्यम से प्रतिप्रसरण के लिए कुछ हद तक समर्थन है।

प्रगणित प्रकार के सदस्यों को उनके अपने दायरे (प्रोग्रामिंग) में रखा जाता है।

सी # भाषा वैश्विक चर या कार्यों की अनुमति नहीं देती है। कक्षाओं के भीतर सभी विधियों और सदस्यों को घोषित किया जाना चाहिए। सार्वजनिक वर्गों के स्थिर सदस्य वैश्विक चर और कार्यों के लिए स्थानापन्न कर सकते हैं।

स्थानीय चर C और C ++ के विपरीत, एनक्लोजिंग ब्लॉक के वेरिएबल शैडोइंग वैरिएबल नहीं हो सकते।

मेटाप्रोग्रामिंग
मेटाप्रोग्रामिंग को कई तरीकों से हासिल किया जा सकता है:


 * चिंतनशील प्रोग्रामिंग .NET API के माध्यम से समर्थित है, जो टाइप मेटाडेटा निरीक्षण और डायनेमिक विधि मंगलाचरण जैसे परिदृश्यों को सक्षम करता है।
 * अभिव्यक्ति के पेड़ एक सार वाक्य रचना का पेड़ के रूप में कोड का प्रतिनिधित्व करते हैं, जहां प्रत्येक नोड एक अभिव्यक्ति है जिसे निरीक्षण या निष्पादित किया जा सकता है। यह रनटाइम पर निष्पादन योग्य कोड के गतिशील संशोधन को सक्षम करता है। अभिव्यक्ति के पेड़ भाषा में कुछ समरूपता का परिचय देते हैं।
 * एट्रिब्यूट (कंप्यूटिंग) मेटाडेटा हैं जिन्हें जावा एनोटेशन के समतुल्य प्रकार, सदस्यों या संपूर्ण विधानसभा (प्रोग्रामिंग)  से जोड़ा जा सकता है। विशेषताएँ संकलक और प्रतिबिंब के माध्यम से कोड दोनों के लिए सुलभ हैं। कई मूल विशेषताएँ GCC और VisualC++ के प्लेटफ़ॉर्म-निर्भर प्रीप्रोसेसर निर्देशों की कार्यक्षमता की नकल करती हैं।
 * नामस्थान, जिसमें रनटाइम सिस्टम पर मेटाडेटा और कॉमन इंटरमीडिएट लैंग्वेज (प्रकार, असेंबली, आदि) उत्सर्जित करने वाली कक्षाएं शामिल हैं।
 * रोसलिन (कंपाइलर)| .NET कम्पाइलर प्लेटफॉर्म (रोसलिन) भाषा संकलन सेवाओं के लिए एपीआई एक्सेस प्रदान करता है, जिससे .NET अनुप्रयोगों के भीतर से सी# कोड के संकलन की अनुमति मिलती है। यह कोड के सिंटैक्टिक (लेक्सिकल विश्लेषण) विश्लेषण, सिमेंटिक विश्लेषण (संकलक), सीआईएल के लिए गतिशील संकलन और कोड उत्सर्जन के लिए एपीआई को उजागर करता है।
 * स्रोत जनरेटर, रोसलिन सी # कंपाइलर की एक विशेषता, संकलन समय मेटाप्रोग्रामिंग को सक्षम करती है। संकलन प्रक्रिया के दौरान, डेवलपर्स संकलक के एपीआई के साथ संकलित किए जा रहे कोड का निरीक्षण कर सकते हैं और अतिरिक्त उत्पन्न सी # स्रोत कोड को संकलित करने के लिए पास कर सकते हैं।

तरीके और कार्य
सी # में एक विधि एक वर्ग का सदस्य है जिसे कक्षा संपत्ति की मूल्य-धारण क्षमता के बजाय फ़ंक्शन (निर्देशों का अनुक्रम) के रूप में बुलाया जा सकता है। वाक्य-रचना की दृष्टि से समान अन्य भाषाओं में, जैसे कि C++ और ANSI C, विधि का हस्ताक्षर एक घोषणा है जिसमें क्रम में शामिल हैं: कोई भी वैकल्पिक अभिगम्यता खोजशब्द (जैसे ), इसके वापसी प्रकार का स्पष्ट विनिर्देश (जैसे , या कीवर्ड   यदि कोई मान नहीं लौटाया जाता है), विधि का नाम, और अंत में, अल्पविराम से अलग किए गए पैरामीटर विनिर्देशों का एक कोष्ठक अनुक्रम, प्रत्येक में एक पैरामीटर का प्रकार, उसका औपचारिक नाम और वैकल्पिक रूप से, जब भी कोई भी प्रदान नहीं किया जाता है, तो एक डिफ़ॉल्ट मान होता है। कुछ विशिष्ट प्रकार की विधियाँ, जैसे कि वे जो केवल वापसी मूल्य या असाइनमेंट द्वारा एक वर्ग संपत्ति प्राप्त या सेट करती हैं, को पूर्ण हस्ताक्षर की आवश्यकता नहीं होती है, लेकिन सामान्य स्थिति में, एक वर्ग की परिभाषा में इसके तरीकों की पूर्ण हस्ताक्षर घोषणा शामिल होती है।

सी ++ की तरह, और जावा के विपरीत, सी # प्रोग्रामर को स्कोप संशोधक कीवर्ड का उपयोग करना चाहिए  विधियों को उपवर्गों द्वारा ओवरराइड करने की अनुमति देने के लिए। सी # में एक्सटेंशन विधियां प्रोग्रामर को स्थिर विधियों का उपयोग करने की अनुमति देती हैं जैसे कि वे कक्षा की विधि तालिका से विधियां थीं, जिससे प्रोग्रामर किसी ऑब्जेक्ट में विधियों को जोड़ सकते हैं जो उन्हें लगता है कि उस ऑब्जेक्ट और उसके डेरिवेटिव्स पर मौजूद होना चाहिए।

प्ररूप  रन-टाइम मेथड बाइंडिंग की अनुमति देता है, जावास्क्रिप्ट जैसी मेथड कॉल और रन-टाइम ऑब्जेक्ट कंपोज़िशन की अनुमति देता है।

सी # में कीवर्ड के माध्यम से दृढ़ता से टाइप किए गए समारोह सूचक के लिए समर्थन है. क्यूटी ढांचे के छद्म-सी ++ सिग्नल और स्लॉट की तरह, सी # में विशेष रूप से प्रकाशन-सदस्यता शैली की घटनाओं के आसपास शब्दार्थ है, हालांकि सी # ऐसा करने के लिए प्रतिनिधियों का उपयोग करता है।

सी # जावा-जैसी पेशकश करता है  विधि कॉल, विशेषता के माध्यम से , और म्युचुअल एक्सक्लूज़न|कीवर्ड के माध्यम से परस्पर-अनन्य लॉक के लिए समर्थन करता है.

संपत्ति
सी # संपत्ति (प्रोग्रामिंग) के साथ कक्षाओं का समर्थन करता है। गुण एक बैकिंग फ़ील्ड के साथ सरल एक्सेसर फ़ंक्शन हो सकते हैं, या गेट्टर और सेटर फ़ंक्शन लागू कर सकते हैं।

चूंकि सी # 3.0 ऑटो-कार्यान्वित गुणों की सिंटैक्टिक चीनी उपलब्ध है, जहां म्यूटेटर विधि | एक्सेसर (गेट्टर) और म्यूटेटर (सेटर) एक वर्ग के एकल गुण (कंप्यूटिंग) पर संचालन को इनकैप्सुलेट करते हैं।

नामस्थान
एसी#  जावा के समान कोड अलगाव प्रदान करता है   या एक सी ++, बहुत समान नियमों और सुविधाओं के साथ a. सिंटैक्स का उपयोग करके नामस्थान आयात किए जा सकते हैं।

मेमोरी एक्सेस
C # में, मेमोरी एड्रेस पॉइंटर्स का उपयोग केवल उन ब्लॉकों के भीतर किया जा सकता है जिन्हें विशेष रूप से असुरक्षित के रूप में चिह्नित किया गया है, और असुरक्षित कोड वाले प्रोग्राम को चलाने के लिए उचित अनुमति की आवश्यकता होती है। अधिकांश ऑब्जेक्ट एक्सेस सुरक्षित ऑब्जेक्ट संदर्भों के माध्यम से किया जाता है, जो हमेशा या तो एक लाइव ऑब्जेक्ट की ओर इशारा करते हैं या अच्छी तरह से परिभाषित Nullable प्रकार का मान रखते हैं; एक मृत वस्तु (जिसे कचरा एकत्र किया गया है), या स्मृति के एक यादृच्छिक ब्लॉक के संदर्भ में प्राप्त करना असंभव है। एक असुरक्षित सूचक एक 'अप्रबंधित' मान प्रकार के उदाहरण को इंगित कर सकता है जिसमें कचरा-एकत्रित वस्तुओं, सरणी, स्ट्रिंग, या ढेर-आवंटित स्मृति का कोई संदर्भ नहीं होता है। कोड जो असुरक्षित के रूप में चिह्नित नहीं है, वह अभी भी पॉइंटर्स को स्टोर और मैनिपुलेट कर सकता है  टाइप करें, लेकिन यह उन्हें डीरेफरेंस नहीं कर सकता है।

प्रबंधित मेमोरी को स्पष्ट रूप से मुक्त नहीं किया जा सकता है; इसके बजाय, यह स्वचालित रूप से कचरा एकत्र किया जाता है। कचरा संग्रह मेमोरी लीक की समस्या को संबोधित करता है, प्रोग्रामर को मेमोरी जारी करने की जिम्मेदारी से मुक्त करता है जिसकी अब ज्यादातर मामलों में आवश्यकता नहीं होती है। कोड जो आवश्यक से अधिक समय तक वस्तुओं के संदर्भों को बनाए रखता है, अभी भी आवश्यकता से अधिक मेमोरी उपयोग का अनुभव कर सकता है, हालांकि एक बार किसी वस्तु का अंतिम संदर्भ जारी होने के बाद मेमोरी कचरा संग्रह के लिए उपलब्ध होती है।

अपवाद
प्रोग्रामर के लिए कई मानक अपवाद उपलब्ध हैं। मानक पुस्तकालयों में विधियाँ नियमित रूप से कुछ परिस्थितियों में सिस्टम अपवादों को फेंकती हैं और फेंके गए अपवादों की श्रेणी को सामान्य रूप से प्रलेखित किया जाता है। कस्टम अपवाद वर्गों को उन वर्गों के लिए परिभाषित किया जा सकता है जो आवश्यकतानुसार विशेष परिस्थितियों के लिए संचालन की अनुमति देते हैं। चेक किए गए अपवाद सी # (जावा के विपरीत) में मौजूद नहीं हैं। यह स्केलेबिलिटी और वर्जनेबिलिटी के मुद्दों पर आधारित एक सचेत निर्णय रहा है।

बहुरूपता
सी ++ के विपरीत, सी # एकाधिक विरासत का समर्थन नहीं करता है, हालांकि एक वर्ग किसी भी संख्या में प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) (पूरी तरह सार वर्ग) को कार्यान्वित कर सकता है। यह जटिलता से बचने और पूरे सीएलआई में वास्तुशिल्प आवश्यकताओं को सरल बनाने के लिए भाषा के प्रमुख वास्तुकार द्वारा एक डिजाइन निर्णय था।

जावा (प्रोग्रामिंग लैंग्वेज) के समान, एक ही नाम के साथ एक विधि वाले कई इंटरफेस को लागू करते समय और एक ही प्रकार के मापदंडों को एक ही क्रम (यानी एक ही प्रकार के हस्ताक्षर) में लेते हुए, सी # सभी इंटरफेस को कवर करने के लिए एक ही विधि दोनों की अनुमति देता है और यदि आवश्यक हो तो प्रत्येक इंटरफ़ेस के लिए विशिष्ट तरीके।

हालाँकि, Java के विपरीत, C# ऑपरेटर ओवरलोडिंग का समर्थन करता है।

भाषा एकीकृत क्वेरी (LINQ)
C# में .NET फ्रेमवर्क के माध्यम से लैंग्वेज इंटीग्रेटेड क्वेरी का उपयोग करने की क्षमता है। एक डेवलपर विभिन्न प्रकार के डेटा स्रोतों को क्वेरी कर सकता है, बशर्ते  इंटरफ़ेस ऑब्जेक्ट पर लागू किया गया है। इसमें XML दस्तावेज़, ADO.NET डेटासेट और SQL डेटाबेस शामिल हैं। सी # में LINQ का उपयोग करने से इंटेलिजेंट कोड पूर्ण समर्थन, मजबूत फ़िल्टरिंग क्षमताएं, संकलन त्रुटि जांच क्षमता के साथ प्रकार की सुरक्षा, और विभिन्न स्रोतों पर डेटा पूछताछ के लिए स्थिरता जैसे फायदे मिलते हैं। कई अलग-अलग भाषा संरचनाएं हैं जिनका उपयोग C # और LINQ के साथ किया जा सकता है और वे क्वेरी एक्सप्रेशन, लैम्ब्डा एक्सप्रेशन, अनाम प्रकार, निहित रूप से टाइप किए गए चर, एक्सटेंशन मेथड और ऑब्जेक्ट इनिशियलाइज़र हैं। LINQ के दो सिंटैक्स हैं: क्वेरी सिंटैक्स और मेथड सिंटैक्स। हालाँकि, कंपाइलर हमेशा क्वेरी सिंटैक्स को कंपाइल समय पर मेथड सिंटैक्स में परिवर्तित करता है।

कार्यात्मक प्रोग्रामिंग
हालांकि मुख्य रूप से एक अनिवार्य भाषा, सी # हमेशा समय के साथ कार्यात्मक विशेषताएं जोड़ती है, उदाहरण के लिए:


 * प्रथम श्रेणी का कार्य | प्रथम श्रेणी के नागरिक के रूप में कार्य - C# 1.0 प्रतिनिधि
 * उच्च-क्रम कार्य | उच्च-क्रम कार्य - C# 1.0 एक साथ प्रतिनिधियों के साथ
 * बेनामी फ़ंक्शन - C# 2 अनाम प्रतिनिधि और C# 3 लैम्ब्डा एक्सप्रेशन
 * क्लोजर (कंप्यूटर प्रोग्रामिंग) - C# 2 एक साथ गुमनाम प्रतिनिधियों के साथ और C# 3 एक साथ लैम्ब्डा एक्सप्रेशन के साथ * अनुमान टाइप करें - सी # 3 निहित रूप से टाइप किए गए स्थानीय चर के साथ और सी # 9 लक्ष्य-टाइप किए गए नए भाव
 * सूची समझ - सी # 3 LINQ
 * Tuple - .NET Framework 4.0 लेकिन यह लोकप्रिय हो गया जब C# 7.0 ने भाषा समर्थन के साथ एक नया टपल प्रकार पेश किया
 * नेस्टेड फ़ंक्शन - सी # 7.0 * पैटर्न मैचिंग - C# 7.0 * अपरिवर्तनीय वस्तु - C# 7.2 केवल पढ़ने के लिए संरचना C# 9 रिकॉर्ड प्रकार और इनिट केवल बसता है
 * टाइप क्लास - सी # 12 भूमिकाएं/एक्सटेंशन (विकास में )

सामान्य प्रकार प्रणाली
सी # में एक एकीकृत प्रकार प्रणाली है। इस यूनिफाइड टाइप सिस्टम को कॉमन टाइप सिस्टम (CTS) कहा जाता है।

एक एकीकृत प्रकार प्रणाली का अर्थ है कि पूर्णांक जैसे आदिम सहित सभी प्रकार, के उपवर्ग हैं कक्षा। उदाहरण के लिए, प्रत्येक प्रकार को विरासत में मिला है  तरीका।

डेटा प्रकार की श्रेणियाँ
सीटीएस डेटा प्रकारों को दो श्रेणियों में विभाजित करता है:


 * 1) संदर्भ प्रकार
 * 2) मूल्य प्रकार

मूल्य प्रकारों के उदाहरणों में न तो संदर्भित पहचान है और न ही संदर्भात्मक तुलना शब्दार्थ। मूल्य प्रकारों के लिए समानता और असमानता की तुलना उदाहरणों के भीतर वास्तविक डेटा मूल्यों की तुलना करती है, जब तक कि संबंधित ऑपरेटरों को अतिभारित न किया जाए। मूल्य प्रकार से प्राप्त होते हैं, हमेशा एक डिफ़ॉल्ट मान होता है, और इसे हमेशा बनाया और कॉपी किया जा सकता है। मूल्य प्रकारों पर कुछ अन्य सीमाएँ हैं कि वे एक दूसरे से प्राप्त नहीं कर सकते हैं (लेकिन इंटरफेस को लागू कर सकते हैं) और एक स्पष्ट डिफ़ॉल्ट (पैरामीटर रहित) निर्माता नहीं हो सकता है क्योंकि उनके पास पहले से ही एक निहित है जो सभी निहित डेटा को प्रकार-निर्भर डिफ़ॉल्ट मान ( 0, शून्य, या समान)। मूल्य प्रकार के उदाहरण सभी आदिम प्रकार हैं, जैसे (एक हस्ताक्षरित 32-बिट पूर्णांक),  (एक 32-बिट IEEE फ़्लोटिंग-प्वाइंट संख्या),  (एक 16-बिट यूनिकोड कोड इकाई), और  (नैनोसेकंड सटीकता के साथ समय में एक विशिष्ट बिंदु की पहचान करता है)। अन्य उदाहरण हैं  (गणना) और  (उपयोगकर्ता परिभाषित संरचनाएं)।

इसके विपरीत, संदर्भ प्रकारों में संदर्भित पहचान की धारणा होती है, जिसका अर्थ है कि संदर्भ प्रकार का प्रत्येक उदाहरण हर दूसरे उदाहरण से स्वाभाविक रूप से भिन्न होता है, भले ही दोनों उदाहरणों में डेटा समान हो। यह संदर्भ प्रकारों के लिए डिफ़ॉल्ट समानता और असमानता की तुलना में परिलक्षित होता है, जो संरचनात्मक समानता के बजाय संदर्भात्मक के लिए परीक्षण करता है, जब तक कि संबंधित ऑपरेटरों को अतिभारित नहीं किया जाता है (जैसे कि मामला ). कुछ ऑपरेशन हमेशा संभव नहीं होते हैं, जैसे संदर्भ प्रकार का उदाहरण बनाना, मौजूदा उदाहरण की प्रतिलिपि बनाना, या दो मौजूदा उदाहरणों पर मूल्य तुलना करना। हालांकि विशिष्ट संदर्भ प्रकार एक सार्वजनिक कंस्ट्रक्टर को उजागर करके या संबंधित इंटरफ़ेस को लागू करके ऐसी सेवाएं प्रदान कर सकते हैं (जैसे या ). संदर्भ प्रकार के उदाहरण हैं (अन्य सभी सी # कक्षाओं के लिए अंतिम आधार वर्ग),  (यूनिकोड वर्णों की एक स्ट्रिंग), और  (सभी सी # सरणियों के लिए एक आधार वर्ग)।

दोनों प्रकार की श्रेणियां उपयोगकर्ता-परिभाषित प्रकारों के साथ एक्स्टेंसिबल हैं।

बॉक्सिंग और अनबॉक्सिंग
बॉक्सिंग एक वैल्यू-टाइप ऑब्जेक्ट को संबंधित रेफरेंस टाइप के वैल्यू में बदलने की प्रक्रिया है। C# में बॉक्सिंग निहित है।

अनबॉक्सिंग एक संदर्भ प्रकार (पहले बॉक्सिंग) के मान को मान प्रकार के मान में परिवर्तित करने की प्रक्रिया है। सी # में अनबॉक्सिंग के लिए एक स्पष्ट प्रकार रूपांतरण की आवश्यकता होती है। प्रकार टी का एक बॉक्सिंग ऑब्जेक्ट केवल टी (या एक शून्य टी) के लिए अनबॉक्स किया जा सकता है। उदाहरण:

पुस्तकालय
सी # विनिर्देशन प्रकार और कक्षा पुस्तकालयों के न्यूनतम सेट का विवरण देता है जो संकलक उपलब्ध होने की अपेक्षा करता है। व्यवहार में, C# का उपयोग अक्सर कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर (CLI) के कुछ कार्यान्वयन के साथ किया जाता है, जिसे ECMA-335 कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर (CLI) के रूप में मानकीकृत किया जाता है।

मानक सीएलआई विनिर्देशों के अलावा, कई वाणिज्यिक और सामुदायिक वर्ग पुस्तकालय हैं जो अतिरिक्त कार्यक्षमता प्रदान करने के लिए .NET फ्रेमवर्क पुस्तकालयों के शीर्ष पर निर्मित होते हैं। C# .NET लाइब्रेरी और फ्रेमवर्क की सूची में शामिल किसी भी लाइब्रेरी को कॉल कर सकता है।

हैलो वर्ल्ड
निम्नलिखित एक बहुत ही सरल C# प्रोग्राम है, C# 9 में पेश किए गए शीर्ष-स्तरीय स्टेटमेंट फीचर का उपयोग करते हुए क्लासिक हैलो वर्ल्ड उदाहरण का एक संस्करण:

सी # 8 या उससे कम के रूप में लिखे गए कोड के लिए, किसी प्रोग्राम के प्रवेश बिंदु तर्क को मुख्य विधि में एक प्रकार के अंदर लिखा जाना चाहिए:

यह कोड इस पाठ को कंसोल विंडो में प्रदर्शित करेगा:

हैलो वर्ल्ड!

प्रत्येक पंक्ति का एक उद्देश्य है:

उपरोक्त पंक्ति सभी प्रकार के आयात करती है  नाम स्थान। उदाहरण के लिए, द   स्रोत कोड में बाद में प्रयुक्त वर्ग में परिभाषित किया गया है   नामस्थान, जिसका अर्थ है कि इसका उपयोग प्रकार के पूर्ण नाम की आपूर्ति के बिना किया जा सकता है (जिसमें नामस्थान शामिल है)।

यह पंक्ति एक टिप्पणी है; यह प्रोग्रामर के लिए कोड का वर्णन और दस्तावेज करता है। ऊपर के लिए एक वर्ग (कंप्यूटर विज्ञान) परिभाषा है कक्षा। ब्रेसिज़ की जोड़ी के बीच आने वाली हर चीज़ उस वर्ग का वर्णन करती है। घुंघराले कोष्ठक एक कोड ब्लॉक की सीमाओं का सीमांकन करते हैं। इस पहले उदाहरण में, वे शुरुआत और अंत को चिह्नित कर रहे हैं  कक्षा। यह क्लास मेंबर मेथड की घोषणा करता है जहां प्रोग्राम का निष्पादन शुरू होता है। .NET रनटाइम कॉल करता है तरीका। जावा (प्रोग्रामिंग भाषा) के विपरीत,  विधि की आवश्यकता नहीं है  कीवर्ड, जो कंपाइलर को बताता है कि विधि को किसी भी वर्ग द्वारा कहीं से भी कॉल किया जा सकता है। लिखना  लिखने के बराबर है. मेथड (कंप्यूटर प्रोग्रामिंग) # स्टेटिक मेथड्स इंस्टेंस के बिना मेथड को एक्सेसिबल बनाता है. प्रत्येक कंसोल एप्लिकेशन का प्रवेश बिंदु घोषित किया जाना चाहिए  अन्यथा कार्यक्रम को एक उदाहरण की आवश्यकता होगी, लेकिन किसी भी उदाहरण के लिए प्रोग्राम की आवश्यकता होगी। उस अघुलनशील सर्कुलर निर्भरता से बचने के लिए, सी # कंपाइलर प्रोसेसिंग सांत्वना आवेदन (जैसे ऊपर) एक त्रुटि की रिपोर्ट करते हैं यदि कोई नहीं है  तरीका। वह  कीवर्ड यह घोषित करता है  का कोई रिटर्न वैल्यू नहीं है।

यह लाइन आउटपुट लिखती है। में एक स्थिर वर्ग है  नामस्थान। यह कंसोल एप्लिकेशन के लिए मानक इनपुट, आउटपुट और त्रुटि स्ट्रीम के लिए एक इंटरफ़ेस प्रदान करता है। प्रोग्राम कॉल करता है  तरीका, जो कंसोल पर तर्क, स्ट्रिंग के साथ एक रेखा प्रदर्शित करता है.

जीयूआई
एक विंडोज़ जीयूआई उदाहरण:

यह उदाहरण पिछले उदाहरण के समान है, सिवाय इसके कि यह एक संवाद बकस  उत्पन्न करता है जिसमें हैलो, वर्ल्ड! इसे कंसोल पर लिखने के बजाय।

छवियां
एक अन्य उपयोगी पुस्तकालय है  पुस्तकालय, जिसका उपयोग प्रोग्रामेटिक रूप से चित्र बनाने के लिए किया जाता है। उदाहरण के लिए: <वाक्यविन्यास लैंग = सी #> सिस्टम का उपयोग करना; सिस्टम का उपयोग करना। आरेखण;

सार्वजनिक वर्ग उदाहरण {   सार्वजनिक स्थिर छवि img;

स्थिर शून्य मुख्य {       आईएमजी = Image.FromFile("Image.png);    } } This will create an image that is identical to that stored in "Image.png.

मानकीकरण और लाइसेंसिंग
अगस्त 2001 में, Microsoft, Hewlett-Packard और Intel ने C# के साथ-साथ कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर | कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर (CLI) के लिए मानक संगठन एक्मा इंटरनेशनल को विनिर्देशों को प्रस्तुत करने के लिए सह-प्रायोजित किया। दिसंबर 2001 में, ECMA ने ECMA-334 C# भाषा विशिष्टता जारी की। C# 2003 में मानकीकरण/अंतर्राष्ट्रीय इलेक्ट्रोटेक्निकल कमीशन मानक के लिए एक अंतर्राष्ट्रीय संगठन बन गया (ISO/IEC 23270:2003 - सूचना प्रौद्योगिकी - प्रोग्रामिंग भाषाएँ - C#)। ECMA ने पहले दिसंबर 2002 में C# के दूसरे संस्करण के रूप में समकक्ष विनिर्देशों को अपनाया था। जून 2005 में, ECMA ने C# विनिर्देशन के संस्करण 3 को मंजूरी दी और ECMA-334 को अपडेट किया। परिवर्धन में आंशिक वर्ग, अनाम विधियाँ, अशक्त प्रकार और सामान्य प्रोग्रामिंग (कुछ हद तक C ++ टेम्पलेट (प्रोग्रामिंग) के समान) शामिल हैं। जुलाई 2005 में, ECMA ने ISO/IEC JTC 1/SC 22 को बाद की फास्ट-ट्रैक प्रक्रिया, मानकों और संबंधित TRs के माध्यम से प्रस्तुत किया। इस प्रक्रिया में आमतौर पर 6-9 महीने लगते हैं।

C# भाषा की परिभाषा और सामान्य भाषा के बुनियादी ढाँचे को मानकीकरण के लिए अंतर्राष्ट्रीय संगठन/अंतर्राष्ट्रीय इलेक्ट्रोटेक्निकल कमीशन और एक्मा मानकों के तहत मानकीकृत किया गया है जो उचित और गैर-भेदभावपूर्ण लाइसेंसिंग प्रदान करते हैं। पेटेंट दावों से उचित और गैर-भेदभावपूर्ण लाइसेंसिंग सुरक्षा प्रदान करते हैं।

Microsoft शुरू में ओपन-सोर्स डेवलपर्स पर गैर-लाभकारी परियोजनाओं में पेटेंट का उल्लंघन करने के लिए ओपन स्पेसिफिकेशंस प्रॉमिस द्वारा कवर किए गए ढांचे के हिस्से के लिए मुकदमा नहीं करने के लिए सहमत हुआ। . माइक्रोसॉफ्ट नोवेल के भुगतान करने वाले ग्राहकों के खिलाफ नोवेल उत्पादों से संबंधित पेटेंट लागू नहीं करने पर भी सहमत हो गया है उन उत्पादों की सूची के अपवाद के साथ जो स्पष्ट रूप से C#, .NET या नोवेल के .NET (मोनो (सॉफ्टवेयर)) के कार्यान्वयन का उल्लेख नहीं करते हैं। हालाँकि, नोवेल ने कहा कि मोनो किसी भी Microsoft पेटेंट का उल्लंघन नहीं करता है। माइक्रोसॉफ्ट ने चांदनी (रनटाइम) से संबंधित पेटेंट अधिकारों को लागू नहीं करने के लिए एक विशिष्ट समझौता भी किया, जो मोनो पर निर्भर करता है, बशर्ते इसे नोवेल के माध्यम से प्राप्त किया जाए। एक दशक बाद, Microsoft ने C# के लिए फ्री, ओपन-सोर्स और क्रॉस-प्लेटफ़ॉर्म टूलिंग विकसित करना शुरू किया, अर्थात् विज़ुअल स्टूडियो कोड, .NET कोर और रोज़लिन (कंपाइलर)। मोनो Microsoft में Xamarin, एक Microsoft सहायक कंपनी की एक परियोजना के रूप में शामिल हुआ।

कार्यान्वयन
Microsoft ओपन-सोर्स सॉफ़्टवेयर | ओपन-सोर्स संदर्भ C# कंपाइलर और टूल्स के सेट के विकास का नेतृत्व कर रहा है। पहला संकलक, माइक्रोसॉफ्ट रोजलिन, मध्यवर्ती भाषा (IL) में संकलित करता है, और दूसरा, RyuJIT, एक JIT (जस्ट-इन-टाइम) कंपाइलर है, जो डायनेमिक है और ऑन-द-फ्लाई ऑप्टिमाइज़ेशन करता है और IL को CPU के फ्रंट-एंड के लिए नेटिव कोड में कंपाइल करता है। RyuJIT खुला स्रोत है और C++ में लिखा गया है। Roslyn पूरी तरह से प्रबंधित कोड (C#) में लिखा गया है, इसे खोल दिया गया है और एपीआई के रूप में कार्यक्षमता सामने आई है। इस प्रकार यह डेवलपर्स को रीफैक्टरिंग और डायग्नोस्टिक्स टूल बनाने में सक्षम बनाता है। आधिकारिक कार्यान्वयन की दो शाखाएँ हैं .NET फ्रेमवर्क (क्लोज्ड-सोर्स, केवल विंडोज़) और .NET कोर (ओपन-सोर्स, क्रॉस-प्लेटफ़ॉर्म); वे अंततः एक ओपन-सोर्स कार्यान्वयन में परिवर्तित हो गए: .NET 5.0। .NET Framework 4.6 में, एक नए JIT कंपाइलर ने पूर्व की जगह ले ली। अन्य C# कंपाइलर (जिनमें से कुछ में कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर और .NET क्लास लाइब्रेरी का कार्यान्वयन शामिल है): यूनिटी (गेम इंजन) अपनी प्राथमिक स्क्रिप्टिंग भाषा के रूप में C# का उपयोग करती है। गोडोट (गेम इंजन) ने माइक्रोसॉफ्ट से $24,000 के दान के लिए एक वैकल्पिक सी# मॉड्यूल लागू किया है।
 * मोनो (सॉफ्टवेयर), एक माइक्रोसॉफ्ट-प्रायोजित परियोजना एक ओपन-सोर्स सी # कंपाइलर प्रदान करती है, सीएलआई का एक पूर्ण ओपन-सोर्स कार्यान्वयन (ईसीएमए विनिर्देश में दिखाई देने वाली आवश्यक रूपरेखा पुस्तकालयों सहित) और लगभग पूर्ण कार्यान्वयन NET क्लास लाइब्रेरी .NET फ्रेमवर्क 3.5 तक।
 * RemObjects से RemObjects एलिमेंट्स टूल चेन में RemObjects C# शामिल है, जो C# कोड को .NET की कॉमन इंटरमीडिएट लैंग्वेज, Java bytecode, Cocoa (API), Dalvik (सॉफ़्टवेयर), WebAssembly और Windows, macOS, और Linux के लिए नेटिव मशीन कोड के लिए कंपाइल करता है।
 * DotGNU प्रोजेक्ट (अब बंद हो गया) ने एक ओपन-सोर्स C# कंपाइलर भी प्रदान किया, जो आवश्यक फ्रेमवर्क लाइब्रेरी सहित कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर का लगभग पूर्ण कार्यान्वयन है, जैसा कि वे ECMA विनिर्देशन में दिखाई देते हैं, और कुछ शेष Microsoft मालिकाना .NET का सबसेट क्लास लाइब्रेरी .NET 2.0 तक (जो ECMA विनिर्देशन में प्रलेखित या शामिल नहीं हैं, लेकिन Microsoft के मानक .NET फ्रेमवर्क वितरण में शामिल हैं)।

यह भी देखें
सी # विषय
 * सी शार्प सिंटैक्स | सी # सिंटैक्स
 * सी शार्प और जावा की तुलना| सी# और जावा की तुलना
 * सी शार्प और विज़ुअल बेसिक .NET की तुलना|C# और विज़ुअल बेसिक .NET की तुलना
 * मानक पुस्तकालय (सीएलआई) | नेट मानक पुस्तकालय

आईडीई
 * विजुअल स्टूडियो
 * माइक्रोसॉफ्ट विजुअल स्टूडियो एक्सप्रेस
 * विजुअल स्टूडियो कोड
 * मोनोडेवलप
 * मोरफिक
 * तेज विकास
 * टर्बो सी शार्प|टर्बो सी#
 * जेटब्रेन # राइडर
 * ज़ामरीन स्टूडियो
 * लिंकपैड

बाहरी संबंध

 * C# Language Specification
 * C# Programming Guide
 * ISO C# Language Specification
 * C# Compiler Platform ("Roslyn") source code