04-26-2011، 07:37 PM
سیستم مستند سازی XML
سیستم مستند سازی سی شارپ بسیار شبیه به جاوا است، اما مبنی بر XML. دو شیوه مستند سازی در حال حاضر به وسیله کامپایلر سی شارپ پشتیبانی میشود.
توضیحات تک خطی، که معمولاً در تولید کننده کد Visual Studioپیدا میشوند، با استفاده از /// شروع میشوند.
توضیحات چند خطی، که در نسخه ۱.۰ تعریف شدند، اما در نسخه ۱.۱ پشتیبانی از آنها وجود نداشت با /* شروع و به */ ختم میشوند:
نتکه:در اینجا یک ملاک سخت در مورد استفاده از فضاهای خالی در سندهای XML هنگام استفاده از /**وجود دارد:
نوع دیگری از کد بالا ارائه خواهد شد:
سینتکس سندسازی توضیحات XML در یک ضمیمه بی قاعده از استاندارد ECMAاز #C وجود دارد. یک استاندارد مشابه قوانینی برای پردازش توضیحات و تبدیل آنها به متون Plain در XML را با کمک قوانین CLI فراهم میکند. این به هر IDE در #C و دیگر ابزار گسترش دهنده امکان پیدا کردن هر نمادی را در کدها میدهد.
(CLR(Common Language Runtime
بخش مرکزی .NET Framework، محیط اجرایی Runtime میباشد که اصطلاحاً به آن CLR یا .NET Runtime میگویند.کدهایی که تحت کنترل CLR اجرا میشوند اغلب به عنوان کدهای مدیریت شده نامیده میشوند.
اگر چه، پیش از این که کدها(همه زبانهای .NET ) به وسیله CLR اجرا شوند، بایستی مورد کامپایل قرار گیرند.در .NET عمل کامپایل در دو مرحله صورت میگیرد:
۱) کامپایل سورس کد به MSIL.
۲) کامپایل MSIL به کد مختص پلتفرم به وسیله CLR
یک نکته قابل توجه، اشتراک زبان میانی مایکروسافت با کد بایت جاوا(Bytecode)است.ایدة این اشتراک از آنجا سرچشمه گرفت که چون Bytecode یک زیان سطح پایین با یک دستور زبان ساده میباشد(که به جای متن مبتنی بر کدهای عددی است)، می تواند به سرعت به کدهای بومی(Native) ترجمه شود.
برخی ویژگیهای MSIL
شی گرایی و بکارگیری واسطها
تمایز فراوان بین انواع مقداری و ارجاعی
تعیین Strong Type(نوع داده Variantدیگر معتبر نیست)
مدیریت خطا از طریق به کارگیری Exceptio
بکارگیری صفات
اشکالات
پلتفورم
منبع .NET مایکروسافت برای اجرا فقط ویندوز است .پیاده سازیهای دیگری برای اجرای برنامههای سی شارپ در ویندوز، لینوکس،BSD یا Mac OS X[[]] وجود دارند اما هنوز کامل نیستند : Mono و DotGNU در نوامبر سال ۲۰۰۲ توسط مایکروسافت(نسخه ۱.۰) برای پیاده سازی CLI برای کار در Free BSD و Mac OS X ۱۰.۲ ارائه شد، اما نسخههای بعدی آنها فقط قابل اجرا بر روی ویندوز بود.
پیشرفت در آینده
نسخه بعدی این زبان، ۴#C است که از اکتبر سال ۲۰۰۸ در حال ساخته شدن است.ماکروسافت لیستی از ویژگیهای جدید ۴#C را در کنفرانس توسعه دهندگان حرفهای اعلام کردهاست.تمرکز اصلی در ورژن بعدی روی قابلیت هماهنگی فریم ورکها و نوع زبانهایی است که کامال پویا یا قیمتی پویا هستند، مانند dynamic language runtime و COM. ویژگیهای زیر تا کنون اعلام شدهاند:
پارامترهای نوع generic از نوع Covariant و contravariant:
پارامترهای واسطهای generic و deletageها میتوانند با استفاده از کلمات out و in از دو نوع Covariant و contravariant باشند.این تعیین نوعها بعداً برای تبدیل انواع به یکدیگر، چه از نوع صریح یا مجازی و چه از نوع compile-time یا run-time به کار میرود.به عنوان مثال، واسط IEnumerable<T> در زیر دوباره تعریف شدهاست:
بنابراین، هر کلاس مشتق شدهای که از IEnumerable<Derived> استفاه کرده باشد، با تمام کلاسهای پایه که IEnumerable<Base> را دارند سازگار است.به عنوان تمرین، کد زیر نوشته شدهاست:
برای contravariance، رابط IComparer<T> به صورت زیر دوباره تعریف شدهاست:
بنابراین، هر کلاسی که IComparer<Base> را برای یک کلاس پایه بیان میکند، با IComparer<Derived> در تمام واسطها و کلاسهایی که از آن کلاس پایه مشتق شدهاند، سازگار است. این امر نوشتن کد زیر را میسر میسازد:
جستجوی عضو پویا
در سیستم انواع دادههای #C یک نوع جدید با نام شبه-نوع معرفی شدهاست که مانند System.Object رفتار میکند، ولی در ادامه، هر دسترسی به اعضا یا برنامههایی که از این نوع استفاده میکنند، بدون چک شدن نوع دادههایشان اجازه کار دارند و تجزیه آنها تا زمان اجرا به تعویق میافتد. به عنوان مثال:
صدا زده شدنهای متد پویا، مانند پارامترهای صریح یا مجازی با مقدار نوع dynamic راه اندازی میشوند. به عنوان مثال:
جستجوی پویا تحت سه مکانیزم مشخص اجرا میشود: COM IDispatch برای اشیا COM، رابط IDynamicObject DLR برای اشیا دارای این واسط و Reflection برای بقیه اشیا.بنابراین هر کلاس #C میتواند صدا زده شدنهای پویای خود را با اجرای IDynamicObject در نمونههای خود جدا کند. در مورد متدهای پویا و مشخص کننده صدا زدنها، تجزیه و تحلیل اضافه بار مطابق انواع اصلی که به عنوان آرگومانها هستند، در زمان اجرا اتفاق میافتد، در غیر این صورت بر اساس قوانین تجزیه و تحلیل اضافه بار #C عمل خواهد شد.به علاوه، در مواردی که در صدا زدن پویا، گیرنده خودش پویا نیست، تجزیه و اضافه بار زمان اجرا تنها به متدهایی که در زمان کامپایل به صورت گیرنده ظاهر شدهاند، رسیدگی میکند. به عنوان مثال:
هر مقداری که توسط دستیابی به عضو پویا برگردانده شده باشد، خودش از نوع پویا است.مقادیر نوع پویا به سایر نوعها و از سایر نوع عا قابل تبدیل هستند. در نمونه کد بالا، این امر به تابع GetLength اجازه با مقدار بازگردانده شده از Length بدون هیچ صریحی به عنوان integer استفاده کند.در زمان اجرا، مقدار واقعی به نوع خواسته شده تبدیل میشود.
کلمه کلیدی اختیاری ref
در حال حاظر کلمه کلیدی ref برای متدهای صدا زننده اختیاری است. کد زیر را در نظر بگیرید:
به صورت زیر هم میتواند نوشته شود:
آرگومنتهای نام گذاری شده و پارامترهای اختیاری
در ۴#C پارامترهای اختیاری ای با مقادیر پیش فرض موجود در ++C معرفی میشوند. به عنوان مثال:
به علاوه، برای کامل کردن پارامترهای اختیاری، میتوانید صریحا نام پارامترها را در صدازدنهای متدها تعیین کنید.این کار به شما اجازه تصویب کردن انتخابی برای هر زیر مجموعه اختیاری از پارامترهای متد را میدهد.تنها محدودیت موجود این است که پارامترهای نام دار باید بعد از پارامترهای بدون نام بیایند.نام پارامترها میتوانند برای هر دو نوع پارامترهای اختیاری و ضروری تعیین شوند و میتوانند برای بهبود خوانایی و فراخوانی دوباره آرگومانها مفید باشند. به عنوان مثال:
پارامترهای اختیاری inter-operating را با COMراحت تر میکنند. در گذشته، #C مجبور بود تمام پارامترهای متد سازنده COM را پشت سر بگذازد، حتی آنهایی را که اختیاری بودند.به عنوان مثال:
با پشتیبانی از پارامترهای اختیاری، کد بالا میتواند به صورت زیر خلاصه شود:
کتابخانهها
جزئیات مشخصات #C، حداقل تعداد نوعها و کتابخانههای کلاس است که کامپایلر نیاز به وجود آنها دارد.عملا، اغلب #C توسط بیشترین استفاده از CLI را میکند، که استاندارد شده ECMA-۳۳۵ است.
مثال Hello world
در زیر یک مثال ساده از برنامه #C آمدهاست، نسخهای از مثال کلاسیک Hello world:
نتیجه، چاپ شدن متن زیر د خروجی است:
Hello, world!
هر خط هدفی دارد:
class ExampleClass
در بالا، تعریف کلاس آمدهاست.هر چیزی که در بین در علامت پرانتز باشد،ExampleClass را توصیف میکند:
static void Main()
این یک تابه عضو کلاس را در زمان شروع اجرای برنامه اعلان میکند.دات نت در زمان اجرا، تابع Main را صدا میزند(نکته: Main ممکن است از هر جای دیگری نیز صدا زده شود، مثلا توسط تابع ExampleClass و با کد ()Main).کلمه کلیدی static تابع را بدون داشتن نمونهای از ExampleClass قابل دسترس میکند.هر تابع Main در هر کنسولی باید به صورت static تعریف شود.در غیر این صورت برنامه به یک نمونه نیاز خواهد داشت و هر نمونه به یک برنامه نیاز دارد.برای اجتناب از این وابستگی دایرهای تجزیه ناپذیر، کامپایلرهای #C در صورت Static نبودن تابع Main، یک خطا اعلام میکنند.کلمه کلیدی void نشان دهنده این است که تابع Main هیچ مقداری را بر نمیگرداند.
Console.WriteLine(«Hello, world!»);
خط بالا، خروجی را مینویسد.در فضای اسم System، Console یک کلاس استاتیک است که یک میانجی بین ورودی، خروجی و خطای کنسول میباشد.برنامهای که متدWriteLine را از کنسول صدا میزند، خروجی رشته «Hello، world!» را در خروجی نمایش میدهد.
استانداردسازی
در آگوست سال ۲۰۰۰، شرکت مایکروسافت، و Hewlett-Packard و شرکت Intel به عنوان پشتیبان مشخصات سی شارپ را مانند CLI به سازمان استانداردسازی ECMA ارائه کردند.در دسامبر سال ۲۰۰۱، این سازمان ، ECMA-۳۳۴ را با عنوان مشخصات زبان سی شارپ منتشر کرد.سی شارپ در سال ۲۰۰۳ به عنوان یک استاندارد ISO به ثبت رسید(ISO/IEC ۲۳۲۷۰).در سال ۲۰۰۲، ECMA دومین ویرایش از خصوصیات زبان سی شارپ را پذیرفت.
در ژوئن سال ۲۰۰۵ ، ECMA سومین ویرایش را با اضافه کردن مواردی همچون کلاسهای partial، متدهای ناشناس، انواع nullable و Genericها منتشر کرد. در جولای ۲۰۰۵، ECMA استانداردها و TRها را همراه با پردازش Fast-Track اخیر به ISO/IEC JTC پیشنهاد کرد.این روند معمولاً ۶ تا ۹ ماه زمان میبرد. آخرین ویرایش این زبان در ۱۹ نوامبر سال ۲۰۰۷ در قالب Framework۳.۵ارائه گردید
کارائی
برنامههای سی شارپ، همچون تمام برنامههای نوشته شده در .NET و سایر محیطهای ماشینی مجازی مانند جاوا، نیازمند منابع سیستم و حافظه بیشتری نسبت به برنامههای نوشته شده با سایر زبانها مانند سی پلاس پلاس است و هم چنین سرعت کمتری نیز دارد. هر چند تعریف زبان #C و CLI تحت استانداردهای ISO و ECMA استاندارد شدهاند،CLI تنها قسمتی از Base Class Library (BCL) ماکروسافت میباشد که شامل کلاسهای غیر استاندارد استفاده شده در برنامههای #C نیز میشود.از این گذشته، بعضی از قسمتهای BCL تحت حق امتیاز ماکروسافت هستند که ممکن است پیاده سازی کامل framework را مختل کند، زیرا تنها بخشهای استاندارد دارای حق محافظت RAND در برابر مدعیان را دارند.
پیاده سازیها
متداولترین کامپایلر #C ، Microsoft Visual C# میباشد.
کامپایلرهای C# :
پروژه Microsoft Rotor (در حال حاضر به عنوان Shared Source Common Language Infrastructure شناخته میشود) (ثبت شده فقط برای استفاده آموزشی و تحقیقی) یک پیاده سازی منبع اشتراکی از CLR Runtime را فراهم میآورد و یک کامپایلر سی شارپ، و یک زیرمجموعه از کتابخانه]] CLI Framework مورد نیاز.
پروژه Mono یک اوپن سورس از کامپایلر سی شارپ است، یک پیاده سازی اوپن سورس کامل از CLI شامل کتابخانههای Framework مورد نیاز که در ECMA ظاهر شدهاند، و یک پیاده سازی کامل نزدیک به بقیه کتابخانههای اختصاصی کلاس .NET مایکروسافت.
پروژه DotGNU نیز یک اوپن سورس از کامپایلر سی شارپ است، که پیاده سازی آن بسیار نزدیک به Common Language Infrastructure میباشد و کتابخانههای framework مورد نیاز موجود در ECMA و زیر مجموعهای از کلاسهای کتابخانهای شخصی ماکروسافت در دات نت و دات نت ۲ را در بر دارد. کاملاً شبیه به پروژه Mono .
نام زبان
اسم سی شارپ از علامت موسیقی شارپ گرفته شدهاست که در موسیقی بیان گر این است که متن نوشته شده باید نیم قدم از خط بالاتر باشد. مطابق با ECMA-۳۳۴، بخش ۶، مخففها و اختصارها، نام زبان به صورت «#C» نوشته میشود(«کلمه لاتین C (U+۰۰۴۳) به همراه علامت عددی #(U+۰۰۲۳)») که به صورت «سی شارپ» تلفظ میشود.علامت «#» نباید با علامت شارپ در موسیقی(♯ ، U+۲۶۶F) که در یک صفحه کلید استاندارد وجود ندارد اشتباه گرفته شود. پسوند شارپ، توسط بسیاری دیگر از زبانهای دات نت مانند #J،#Aو #F نیز به کار رفتهاست.پیاده سازی اولیه از زبان ایفل تحت دات نت نیز #Eiffel نام داشت که الان زبان ایفل را به طور کامل پشتیبانی میکند.هم چنین این پسوند بعضی وقتها در کتابخانهها نیز به کار میرود، مانند #Gtkو #Cocoa و #Qt .
سیستم مستند سازی سی شارپ بسیار شبیه به جاوا است، اما مبنی بر XML. دو شیوه مستند سازی در حال حاضر به وسیله کامپایلر سی شارپ پشتیبانی میشود.
توضیحات تک خطی، که معمولاً در تولید کننده کد Visual Studioپیدا میشوند، با استفاده از /// شروع میشوند.
کد:
public class Foo
{
/// <summary>A summary of the method.</summary>
/// <param name="firstParam">A description of the parameter.</param>
/// <remarks>Remarks about the method.</remarks>
public static void Bar(int firstParam) {}
}
کد:
public class Foo
{
/** <summary>A summary of the method.</summary>
* <param name="firstParam">A description of the parameter.</param>
* <remarks>Remarks about the method.</remarks> */
public static void Bar(int firstParam) {}
}
کد:
/**
* <summary>
* A summary of the method.</summary>*/
کد:
/**
* <summary>
A summary of the method.</summary>*/
(CLR(Common Language Runtime
بخش مرکزی .NET Framework، محیط اجرایی Runtime میباشد که اصطلاحاً به آن CLR یا .NET Runtime میگویند.کدهایی که تحت کنترل CLR اجرا میشوند اغلب به عنوان کدهای مدیریت شده نامیده میشوند.
اگر چه، پیش از این که کدها(همه زبانهای .NET ) به وسیله CLR اجرا شوند، بایستی مورد کامپایل قرار گیرند.در .NET عمل کامپایل در دو مرحله صورت میگیرد:
۱) کامپایل سورس کد به MSIL.
۲) کامپایل MSIL به کد مختص پلتفرم به وسیله CLR
یک نکته قابل توجه، اشتراک زبان میانی مایکروسافت با کد بایت جاوا(Bytecode)است.ایدة این اشتراک از آنجا سرچشمه گرفت که چون Bytecode یک زیان سطح پایین با یک دستور زبان ساده میباشد(که به جای متن مبتنی بر کدهای عددی است)، می تواند به سرعت به کدهای بومی(Native) ترجمه شود.
برخی ویژگیهای MSIL
شی گرایی و بکارگیری واسطها
تمایز فراوان بین انواع مقداری و ارجاعی
تعیین Strong Type(نوع داده Variantدیگر معتبر نیست)
مدیریت خطا از طریق به کارگیری Exceptio
بکارگیری صفات
اشکالات
پلتفورم
منبع .NET مایکروسافت برای اجرا فقط ویندوز است .پیاده سازیهای دیگری برای اجرای برنامههای سی شارپ در ویندوز، لینوکس،BSD یا Mac OS X[[]] وجود دارند اما هنوز کامل نیستند : Mono و DotGNU در نوامبر سال ۲۰۰۲ توسط مایکروسافت(نسخه ۱.۰) برای پیاده سازی CLI برای کار در Free BSD و Mac OS X ۱۰.۲ ارائه شد، اما نسخههای بعدی آنها فقط قابل اجرا بر روی ویندوز بود.
پیشرفت در آینده
نسخه بعدی این زبان، ۴#C است که از اکتبر سال ۲۰۰۸ در حال ساخته شدن است.ماکروسافت لیستی از ویژگیهای جدید ۴#C را در کنفرانس توسعه دهندگان حرفهای اعلام کردهاست.تمرکز اصلی در ورژن بعدی روی قابلیت هماهنگی فریم ورکها و نوع زبانهایی است که کامال پویا یا قیمتی پویا هستند، مانند dynamic language runtime و COM. ویژگیهای زیر تا کنون اعلام شدهاند:
پارامترهای نوع generic از نوع Covariant و contravariant:
پارامترهای واسطهای generic و deletageها میتوانند با استفاده از کلمات out و in از دو نوع Covariant و contravariant باشند.این تعیین نوعها بعداً برای تبدیل انواع به یکدیگر، چه از نوع صریح یا مجازی و چه از نوع compile-time یا run-time به کار میرود.به عنوان مثال، واسط IEnumerable<T> در زیر دوباره تعریف شدهاست:
کد:
interface IEnumerable<out T>
{
IEnumerator<T> GetEnumerator();
}
کد:
void PrintAll(IEnumerable<object> objects)
{
foreach (object o in objects)
{
Console.WriteLine(o);
}
}
IEnumerable<string> strings = new List<string>();
PrintAll(strings); // IEnumerable<string> is implicitly converted to IEnumerable<object>
کد:
public interface IComparer<in T>
{
int Compare(T x, T y);
}
کد:
IComparer<object> objectComparer = GetComparer();
IComparer<string> stringComparer = objectComparer;
در سیستم انواع دادههای #C یک نوع جدید با نام شبه-نوع معرفی شدهاست که مانند System.Object رفتار میکند، ولی در ادامه، هر دسترسی به اعضا یا برنامههایی که از این نوع استفاده میکنند، بدون چک شدن نوع دادههایشان اجازه کار دارند و تجزیه آنها تا زمان اجرا به تعویق میافتد. به عنوان مثال:
کد:
// Returns the value of Length property or field of any object
int GetLength(dynamic obj)
{
return obj.Length;
}
GetLength(«Hello, world»); // a string has a Length property,
GetLength(new int[] { 1, 2, 3 }); // and so does an array,
GetLength(42); // but not an integer - an exception will be thrown here at run-time
کد:
void Print(dynamic obj)
{
Console.WriteLine(obj); // which overload of WriteLine() to call is decided at run-time
}
Print(123); // ends up calling WriteLine(int)
Print("abc"); // ends up calling WriteLine(string)
کد:
class Base
{
void Foo(double x);
}
class Derived : Base
{
void Foo(int x);
}
dynamic x = 123;
Base b = new Derived();
b.Foo(x); // picks Base.Foo(double) because b is of type Base, and Derived.Foo(int) is not exposed
dynamic b1 = b;
b1.Foo(x); // picks Derived.Foo(int)
کلمه کلیدی اختیاری ref
در حال حاظر کلمه کلیدی ref برای متدهای صدا زننده اختیاری است. کد زیر را در نظر بگیرید:
کد:
void Increment(ref int x)
{
++x;
}
int x = 0;
Increment(ref x);
کد:
void Increment(ref int x)
{
++x;
}
int x = 0;
Increment(x);
در ۴#C پارامترهای اختیاری ای با مقادیر پیش فرض موجود در ++C معرفی میشوند. به عنوان مثال:
کد:
void Increment(ref int x, int dx = 1)
{
x += dx;
}
int x = 0;
Increment(ref x); // dx takes the default value of 1
Increment(x, 2); // dx takes the value 2
کد:
Stream OpenFile(string name, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) { ... }
OpenFile(«file.txt»); // use default values for both "mode" and "access"
OpenFile(«file.txt», mode: FileMode.Create); // use default value for "access"
OpenFile(«file.txt», access: FileAccess.Read); // use default value for "mode"
OpenFile(name: «file.txt», access: FileAccess.Read, mode: FileMode.Create); // name all parameters for extra readability, and use order different from method declaration
کد:
object fileName = «Test.docx»;
object missing = System.Reflection.Missing.Value;
doc.SaveAs(ref fileName,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);
کد:
doc.SaveAs(«Test.docx»);
جزئیات مشخصات #C، حداقل تعداد نوعها و کتابخانههای کلاس است که کامپایلر نیاز به وجود آنها دارد.عملا، اغلب #C توسط بیشترین استفاده از CLI را میکند، که استاندارد شده ECMA-۳۳۵ است.
مثال Hello world
در زیر یک مثال ساده از برنامه #C آمدهاست، نسخهای از مثال کلاسیک Hello world:
کد:
class ExampleClass
{
static void Main()
{
System.Console.WriteLine(«Hello, world!»);
}
}
Hello, world!
هر خط هدفی دارد:
class ExampleClass
در بالا، تعریف کلاس آمدهاست.هر چیزی که در بین در علامت پرانتز باشد،ExampleClass را توصیف میکند:
static void Main()
این یک تابه عضو کلاس را در زمان شروع اجرای برنامه اعلان میکند.دات نت در زمان اجرا، تابع Main را صدا میزند(نکته: Main ممکن است از هر جای دیگری نیز صدا زده شود، مثلا توسط تابع ExampleClass و با کد ()Main).کلمه کلیدی static تابع را بدون داشتن نمونهای از ExampleClass قابل دسترس میکند.هر تابع Main در هر کنسولی باید به صورت static تعریف شود.در غیر این صورت برنامه به یک نمونه نیاز خواهد داشت و هر نمونه به یک برنامه نیاز دارد.برای اجتناب از این وابستگی دایرهای تجزیه ناپذیر، کامپایلرهای #C در صورت Static نبودن تابع Main، یک خطا اعلام میکنند.کلمه کلیدی void نشان دهنده این است که تابع Main هیچ مقداری را بر نمیگرداند.
Console.WriteLine(«Hello, world!»);
خط بالا، خروجی را مینویسد.در فضای اسم System، Console یک کلاس استاتیک است که یک میانجی بین ورودی، خروجی و خطای کنسول میباشد.برنامهای که متدWriteLine را از کنسول صدا میزند، خروجی رشته «Hello، world!» را در خروجی نمایش میدهد.
استانداردسازی
در آگوست سال ۲۰۰۰، شرکت مایکروسافت، و Hewlett-Packard و شرکت Intel به عنوان پشتیبان مشخصات سی شارپ را مانند CLI به سازمان استانداردسازی ECMA ارائه کردند.در دسامبر سال ۲۰۰۱، این سازمان ، ECMA-۳۳۴ را با عنوان مشخصات زبان سی شارپ منتشر کرد.سی شارپ در سال ۲۰۰۳ به عنوان یک استاندارد ISO به ثبت رسید(ISO/IEC ۲۳۲۷۰).در سال ۲۰۰۲، ECMA دومین ویرایش از خصوصیات زبان سی شارپ را پذیرفت.
در ژوئن سال ۲۰۰۵ ، ECMA سومین ویرایش را با اضافه کردن مواردی همچون کلاسهای partial، متدهای ناشناس، انواع nullable و Genericها منتشر کرد. در جولای ۲۰۰۵، ECMA استانداردها و TRها را همراه با پردازش Fast-Track اخیر به ISO/IEC JTC پیشنهاد کرد.این روند معمولاً ۶ تا ۹ ماه زمان میبرد. آخرین ویرایش این زبان در ۱۹ نوامبر سال ۲۰۰۷ در قالب Framework۳.۵ارائه گردید
کارائی
برنامههای سی شارپ، همچون تمام برنامههای نوشته شده در .NET و سایر محیطهای ماشینی مجازی مانند جاوا، نیازمند منابع سیستم و حافظه بیشتری نسبت به برنامههای نوشته شده با سایر زبانها مانند سی پلاس پلاس است و هم چنین سرعت کمتری نیز دارد. هر چند تعریف زبان #C و CLI تحت استانداردهای ISO و ECMA استاندارد شدهاند،CLI تنها قسمتی از Base Class Library (BCL) ماکروسافت میباشد که شامل کلاسهای غیر استاندارد استفاده شده در برنامههای #C نیز میشود.از این گذشته، بعضی از قسمتهای BCL تحت حق امتیاز ماکروسافت هستند که ممکن است پیاده سازی کامل framework را مختل کند، زیرا تنها بخشهای استاندارد دارای حق محافظت RAND در برابر مدعیان را دارند.
پیاده سازیها
متداولترین کامپایلر #C ، Microsoft Visual C# میباشد.
کامپایلرهای C# :
پروژه Microsoft Rotor (در حال حاضر به عنوان Shared Source Common Language Infrastructure شناخته میشود) (ثبت شده فقط برای استفاده آموزشی و تحقیقی) یک پیاده سازی منبع اشتراکی از CLR Runtime را فراهم میآورد و یک کامپایلر سی شارپ، و یک زیرمجموعه از کتابخانه]] CLI Framework مورد نیاز.
پروژه Mono یک اوپن سورس از کامپایلر سی شارپ است، یک پیاده سازی اوپن سورس کامل از CLI شامل کتابخانههای Framework مورد نیاز که در ECMA ظاهر شدهاند، و یک پیاده سازی کامل نزدیک به بقیه کتابخانههای اختصاصی کلاس .NET مایکروسافت.
پروژه DotGNU نیز یک اوپن سورس از کامپایلر سی شارپ است، که پیاده سازی آن بسیار نزدیک به Common Language Infrastructure میباشد و کتابخانههای framework مورد نیاز موجود در ECMA و زیر مجموعهای از کلاسهای کتابخانهای شخصی ماکروسافت در دات نت و دات نت ۲ را در بر دارد. کاملاً شبیه به پروژه Mono .
نام زبان
اسم سی شارپ از علامت موسیقی شارپ گرفته شدهاست که در موسیقی بیان گر این است که متن نوشته شده باید نیم قدم از خط بالاتر باشد. مطابق با ECMA-۳۳۴، بخش ۶، مخففها و اختصارها، نام زبان به صورت «#C» نوشته میشود(«کلمه لاتین C (U+۰۰۴۳) به همراه علامت عددی #(U+۰۰۲۳)») که به صورت «سی شارپ» تلفظ میشود.علامت «#» نباید با علامت شارپ در موسیقی(♯ ، U+۲۶۶F) که در یک صفحه کلید استاندارد وجود ندارد اشتباه گرفته شود. پسوند شارپ، توسط بسیاری دیگر از زبانهای دات نت مانند #J،#Aو #F نیز به کار رفتهاست.پیاده سازی اولیه از زبان ایفل تحت دات نت نیز #Eiffel نام داشت که الان زبان ایفل را به طور کامل پشتیبانی میکند.هم چنین این پسوند بعضی وقتها در کتابخانهها نیز به کار میرود، مانند #Gtkو #Cocoa و #Qt .
گروه دور همی پارسی کدرز
https://t.me/joinchat/GxVRww3ykLynHFsdCvb7eg
https://t.me/joinchat/GxVRww3ykLynHFsdCvb7eg