استاندارد ECMA این اهداف طراحی زبان را برای سی شارپ برآورده میسازد:
۱ تاریخچه
در سال ۱۹۹۹م، شرکت سان مایکروسیستمز اجازه استفاده از زبان برنامهنویسی جاوا را در اختیار شرکت مایکروسافت قرار داد تا در سیستمعامل خود از آن استفاده کند. جاوا در اصل به هیچ پلت فرم یا سیستمعاملی وابسته نبود، ولی مایکروسافت برخی از مفاد قرار داد را زیر پا گذاشت و قابلیت مستقل از سیستمعامل بودن جاوا را از آن برداشت. شرکت سان پروندهای علیه مایکروسافت درست کرد و مایکروسافت مجبور شد تا زبان شیءگرای جدیدی با کامپایل جدید که به ++C شبیه بود را درست کند. در طول ساخت دات نت، کلاسهای کتابخانهای با زبان و کامپایلر SMC نوشته شدند. در سال ۱۹۹۹ آندرس هلزبرگ گروهی را برای طراحی زبانی جدید تشکیل داد که در آن زمان نامش Cool بود و همانند C بود با خواص شیءگرایی. مایکروسافت در نظر داشت اسم این زبان را تا آخر COOL قرار دهد، ولی به دلیل مناسب نبودن برای اهداف تجاری این کار را نکرد. در ارائه و معرفی رسمی چارچوب داتنت در PDC در سال ۲۰۰۰ این زبان به سی شارپ تغییر نام یافت و کتابخانه کلاسها و runtime در ایاسپیداتنت به سی شارپ منتقل شدند. مدیر و سرپرست طراحان در مایکروسافت آندرس هلزبرگ بود که تجربه قبلی او در طراحی Framework و زبانهای برنامه سازی++Borland، دلفی، Turbo Pascal، ویژوال سی++ به آسانی در دستورالعملهای سی شارپ قابل رویت است و به همان خوبی در هسته CLR.
هیچ تابع یا متغیر سراسری(Global) وجود ندارد، تمام متدها و اعضا بایستی در داخل کلاسها تعریف شوند. این امر ممکن است، هر چند برای استفاده از متغیرها و توابع عمومی باید از متدها و متغیرها در کلاسهای عمومی استفاده کرد.
تمام انواع بازتابی(Reflection) و بازیابی(Recovery) قابل استفادهاست.
این کامپایلر در مقابل زبانهای C یا ++C دارای ساختار بسیار متفاوتی است که دانستن آن به برنامهنویس امکان نوشتن برنامههای بسیار بهینه را خواهد داد.
در C یا ++C ساختار رشته به صورت ارایهای از نوع char بود که امکان اضافه کردن به رشته را محدود میکرد به دلیل ثابت بودن طول در آغاز تعریف ولی در سی شارپ دو نوع متفاوت رشته وجود دارد؛ که یکی به صورت آرایهای با طول ثابت ۲۵۶(در عمل ۲۵۵)موجوداست (به صورت پیش فرض) و در صورتی که با کمبود جا روبرو شود فضای جدید (بزرگتر) یافته و به ان انتقال میدهد؛ ولی در نوع دوم رشتهها از لیست پیوندی استفاده میشود.
سی شارپ دارای یک سامانه نوع یکپارچهاست که به آن CTS میگویند. این بدان معناست که تمام انواع، شامل موارد اصلی مانند Integerها، مشتق شده از System.Object هستند. به عنوان مثال، هر نوع یک متد به نام ToString() را به ارث میبرد. بخاطر کارایی، انواع اولیه (و انواع مقداری) بهطور داخلی فضایی برای آنها بر روی پشته در نظر گرفته میشود.
نوع مقداری (Value Type)
انواع دادهای توده سادهای از داده میباشند. نمونههای انواع دادهای نه هویت مرجعی دارند و نه مفاهیم مقایسه مراجع را. برای مقایسه برابری یا عدم برابری انواع دادهای، خود مقدار دادهها را با یکدیگر مقایسه میکنیم مگر اینکه عملگرهای مشابه دوباره تعریف شده باشند. مقادیر دادههای مرجعی همیشه یک مقدار پیشفرض دارند و همیشه میتوانند ایجاد یا کپی شوند. یکی دیگر از محدودیتهای انواع دادهای این ات که آنها نمیتوانند از یکدیگر مشتق شوند (ولی میتوانند اشتراکاتی داشته باشند) و هم چنین نمیتوانند در سازنده مقدار دهی اولیه شوند. مثالی از انواع دادهای، بعضی از انواع اولیه مانند int و float و char و System.DateTime میباشند. در مقابل، انواع مرجعی مفهوم تعریف مرجعی را دارند (که در آن هر نمونه از نوع مرجع، بهطور ذاتی از دیگر نمونهها جدا میشود، حتی اگر داده هر دو نمونه یکی باشد). این دقیقاً نمونه مشابه مقایسه تساوی یا عدم تساوی دادههای مرجعی است، که در آن آزمایش برای مرجعها از دادهایها سریع تر است. در کل نه همیشه امکان تعریف نمونه مرجعی وجود دارد و نه امکان کپی یا نمایش مقادیر مقایسه دو نمونه؛ ولی به هر حال انواع مرجعی خاص میتوانند این اعمال را از طریق سازندههای عمومی یا اجرای واسطهای مشابه (مثل ICloneable یا IComparable) انجام دهند. نمونههایی از انواع مرجعی، اشیاء، System.String و Sysmet.Array میباشند. هر دو نوع داده قابلیت انعطاف توسط تعریف به وسیله کاربر را دارند. در واقع وقتی ما نوع دادهای را به تابع ای ارسال میکنیم، آدرس داده نیز فرستاده میشود. البته این امر پیشفرض است ولی برای دادههای مثل آرایه، رشتهای، آدرس فرستاده میشود و ارسال از نوع مرجع میشود
int foo = 42;// Value type…
int foo = 42;// Value type.
سی شارپ به برنامهنویس با استفاده از کلمه کلیدی Struct اجازه میدهد تا انواع مقداری User-defined را ایجاد کند. از دیدگاه برنامهنویسی، آنها کلاسهای سبک وزن به نظر میرسند. برخلاف کلاسها (که بر روی heap قرار میگیرند) و شبیه به انواع اولیه استاندارد مانند انواع مقداری Structها نیز بر روی پشته قرار میگیرند. آنها همچنین میتوانند قسمتی از یک شئ باشند، یا در یک آرایه مرتب شوند، بدون حافظه غیر مستقیمی که بهطور معمول برای انواع کلاس تخصیص مییابد.
ویژگیهای جدید در سی شارپ چارچوب داتنت SDK ۲٫۰ (مطابق با سومین ویرایش استاندارد ECMA-۳۳۴):
public partial class MyClass
public partial class MyClass
genericها یا نوعهای پارامتری شده یا چندریختیهای پارامتری یک ویژگی جدید چارچوب داتنت ۲٫۰ است که به وسیله سی شارپ پشتیبانی میشود. برخلاف Templateهای سی پلاس پلاس، در این انواع به جای اینکه نمونه سازی توسط کامپایلر انجام شود، در زمان اجرا صورت میگیرد، بنابراین میتوانند چند زبانه باشند در حالی که ++C نمیتواند. آنها دارای ویژگیهایی هستند که بهطور مستقیم توسط Templateهای ++C پشتیبانی نمیشوند مانند نوع محدودیتها در پارامترهای Generic با استفاده از رابطها(Interface). سی شارپ از پارامترهایهای Generic بدون نوع پشتیبانی نمیکند. بر خلاف genericهای جاوا، genericهای دات نت برای پارامتری کردن انواع دادهای در اشیاء ماشین مجازی CLI، از مفاهیم شیءگرایی استفاده میکنند که اجازه بهینهسازی و حفاظت انواع اطلاعات را میدهد.
کلاسها به صورت Static قابل تعریف نیستند مگر اینکه تمام اعضای آنها Static باشند؛ که این امر بسیار شبیه به مفهوم مدل در زبانهای رویهای است. (زبان رویهای: یک زبان برنامهنویسی که در آن عنصر اصلی برنامهنویسی یک زیربرنامهاست. مانند زبانهای C، پاسکال و…)
// Method that takes an iterable input (possibly an array) and returns all even numbers.
int SumOfArrayElements(int[] array)
تبدیل گروههای متد به نوع Deletage در برگشت دارای covariant و در انواع پارامترها دارای contravariant هستند.
public string Status
نکته مهم: سطح دسترسی خاصیت نمیتواند بالاتر از سطح دسترسی اکسسورها باشد. به عنوان مثال private بودن خاصیت و public بودن اکسسور باعث بروز خطا میشود.
int? i = null;
وقتی درون شی ای کپی میشود، نمونه Nullable به صورت تشریفاتی در آن قرار میگیرد و در نتیجه مقادیر و منابع Null با هم برابر میشوند. در گذشته این خاصیت دارای مجادله بود تا زمانی که علاوه بر چارچوب داتنت ۲، به هسته CLR نیز مجهز شد و همه تکنولوژیها نظیر سی شارپ، ویژوال بیسیک، مایکروسافت اسکیوال سرور ۲۰۰۵ و مایکروسافت ویژوال استودیو ۲۰۰۵ را شامل شد.
object nullObj = null;
int? i = null;
این ورژن در تاریخ ۱۹ نوامبر سال ۲۰۰۷ به عنوان بخشی از چارچوب داتنت ۳٫۵ عرضه شد؛ که شامل ویژگیهای جدید الهام شده از زبانهای برنامهنویسی اصلی (Functional) مانند Haskell و ML، و الگوی LINQ برای CLR است. در حال حاضر توسط هیچ موسسه استانداردسازی تأیید نشدهاست.
// Select squares of all odd numbers in the array sorted in descending order
MyList list = new MyList();
فرض کنید که اجزای MyList و System.Collections.IEnumerable دارای متد عمومی Add هستند.
static void Main(string[] args)
چرا Anonymous types؟ انواع بی نام بهترین گزینه برای تولید Entity Typeها میباشند. همانطور که گفته شد Entity Typeها فقط حاوی دادهها هستند؛ بنابراین به بهترین نحو میتوان دادههای دریافت شده از کاربر را در انواع بی نام بستهبندی کرد.
این ویژگی تنها یک ntactic sugarراحت برای کوتاهتر بیان کردن متغیرهای محلی نمیباشد، بلکه برای تعریف متغیرهای بی نام لازم نیز است.
static void Main(string[] args)
int Fn(int x)
static void Main(string[] args)
public static class StringExtensions
string s = “foo”;
زبان سی شارپ کلمه کلیدی sealed را برای این منظور ارائه کرد که امکان ارث بری از یک کلاس را صلب کند. یعنی با اضافه شدن این کلمه کلیدی به ابتدای تعریف کلاس، امکان ارث بری از آن غیرممکن میشود. سی شارپ ۳٫۰ ویژگی جدیدی را در اختیار برنامه نویسان قرار میدهد به این صورت که میتوان هر نوع کلاسی حتی کلاسهای مهر شده با Sealed را با استفاده از Extension methodsبسط داد.
توابع جزئی به تولیدکنندههای کد اجازه تولید اعلان توابع به صورت نقاط گسترش یافتهای که تنها شامل کدهای اصلی هستند را میدهد، در صورتی که یک نفر آن را در قسمتی از کلاسی دیگر اجرا کند.
namespace CS3_Test
namespace CS3_Test
استفاده از var تنها در تعریف متغیرهای محلی امکانپذیر است. در اعلان متغیرها به صورت سراسری، پارامترهای توابع و مقادیر بازگشتی نمیتوان از var استفاده کرد. چرا var؟ این ویژگی آزادی عملی بیشتری برای کار با متغیرهای محلی در اختیار برنامهنویس قرار میدهد. سناریویی را در نظر بگیرید که یک تابع تحت شرایطی، مقادیر از انواع مختلف را برگرداند. در این صورت بدون درگیر شدن با casting و تبدیل نوع میتوان با تعریف متغیر ضمنی محلی هر نوعی را که تابع برمیگرداند، در اختیار داشت.
class Person
public string FirstName
public string LastName
public int Age
Person person = new Person
LINQ-to-Objects – talks to in-memory objects
static void Main(string[] args)
foreach (var selected in selective_array)
توضیح: در مثال بالا ابتدا یک آرایهٔ int با مقداردهی اولیه تعریف شدهاست. سپس با استفاده از دستورها) LINQ که جز کلمات کلیدی سی شارپ محسوب میشوند)، آرایهای با اعضای بزرگتر از ۵ انتخاب و در متغیر ضمنی محلی selective_array ذخیره میشود. در نهایت اعضای selective_array به صورت ۷ و ۹ و ۱۲ خواهد بود. در توضیح این ویژگی جدید به همین یک مثال بسنده میکنیم چون بیان تمامی جنبههای LINQ خود نیازمند نگارش مقالهای مفصل میباشد.
static void Main(string[] args)
ویژگی «دستورها پیش پردازنده» سی شارپ (اگرچه آنها به واقع یک پیش پردازنده نیستند) مبنی بر دستورها پیش پردازنده C است که به برنامهنویس اجازه تعریف سمبلهایی را میدهند. برخی از این دستورها عبارتند از: #if، #region، #define. راهنماهایی نظیر #region تذکراتی به ویرایشگرها برای code folding میدهند.
public class Foo
public class FooBar
public class Foo
public class Foo
public class Foo
/**
/**
سینتکس سندسازی توضیحات XML در یک ضمیمه بی قاعده از استاندارد ECMA از سی شارپ وجود دارد. یک استاندارد مشابه قوانینی برای پردازش توضیحات و تبدیل آنها به متون Plain در XML را با کمک قوانین CLI فراهم میکند. این به هر IDE در سی شارپ و دیگر ابزار گسترش دهنده امکان پیدا کردن هر نمادی را در کدها میدهد.
کامپایل سورس کد به MSIL.
یک نکته قابل توجه، اشتراک زبان میانی مایکروسافت با کد بایت جاوا(Bytecode)است. ایده این اشتراک از آنجا سرچشمه گرفت که چون Bytecode یک زیان سطح پایین با یک دستور زبان ساده میباشد (که به جای متن مبتنی بر کدهای عددی است)، میتواند به سرعت به کدهای بومی(Native) ترجمه شود.
شیءگرایی و بکارگیری واسطها
اشکالات
منبع چارچوب داتنت مایکروسافت برای اجرا فقط ویندوز است. پیادهسازیهای دیگری برای اجرای برنامههای سی شارپ در ویندوز، لینوکس،BSD یا Mac OS X وجود دارند اما هنوز کامل نیستند: Mono و DotGNU در نوامبر سال ۲۰۰۲ توسط مایکروسافت (نسخه ۱٫۰) برای پیادهسازی CLI برای کار در Free BSD و Mac OS X ۱۰٫۲ ارائه شد، اما نسخههای بعدی آنها فقط قابل اجرا بر روی ویندوز بود.
نسخه بعدی این زبان، سی شارپ ۴ است که از اکتبر سال ۲۰۰۸ در حال ساخته شدن است. مایکروسافت لیستی از ویژگیهای جدید سی شارپ ۴ را در کنفرانس توسعه دهندگان حرفهای اعلام کردهاست. تمرکز اصلی در ورژن بعدی روی قابلیت هماهنگی فریم ورکها و نوع زبانهایی است که کامال پویا یا قیمتی پویا هستند، مانند dynamic language runtime و COM. ویژگیهای زیر تاکنون اعلام شدهاند:
interface IEnumerable<out T>
void PrintAll(IEnumerable<object> objects)
IEnumerable<string> strings = new List<string>();
public interface IComparer<in T>
IComparer<object> objectComparer = GetComparer();
// Returns the value of Length property or field of any object
GetLength(“Hello, world”);// a string has a Length property,
void Print(dynamic obj)
Print(123);// ends up calling WriteLine(int)
class Base
class Derived: Base
dynamic x = 123;
هر مقداری که توسط دستیابی به عضو پویا برگردانده شده باشد، خودش از نوع پویا است. مقادیر نوع پویا به سایر نوعها و از سایر نوع عا قابل تبدیل هستند. در نمونه کد بالا، این امر به تابع GetLength اجازه با مقدار بازگردانده شده از Length بدون هیچ صریحی به عنوان integer استفاده کند. در زمان اجرا، مقدار واقعی به نوع خواسته شده تبدیل میشود.
void Increment(ref int x)
int x = 0;
void Increment(ref int x)
int x = 0;
void Increment(ref int x, int dx = 1)
int x = 0;
OpenFile(“file.txt”);// use default values for both “mode” and “access”
object fileName = “Test.docx”;
doc.SaveAs(ref fileName,
جزئیات مشخصات سی شارپ، حداقل تعداد نوعها و کتابخانههای کلاس است که کامپایلر نیاز به وجود آنها دارد. عملاً، اغلب سی شارپ توسط بیشترین استفاده از CLI را میکند، که استاندارد شده ECMA-۳۳۵ است.
class ConsoleApp1
خط بالا، خروجی را مینویسد. در فضای اسم System, Console یک کلاس استاتیک است که یک میانجی بین ورودی، خروجی و خطای کنسول میباشد. برنامهای که متدWriteLine را از کنسول صدا میزند، خروجی رشته «Hello, world!» را در خروجی نمایش میدهد.
در ژوئن سال ۲۰۰۵، ECMA سومین ویرایش را با اضافه کردن مواردی همچون کلاسهای partial، متدهای ناشناس، انواع nullable و Genericها منتشر کرد. در ژوئیه ۲۰۰۵، ECMA استانداردها و TRها را همراه با پردازش Fast-Track اخیر به ISO/IEC JTC پیشنهاد کرد. این روند معمولاً ۶ تا ۹ ماه زمان میبرد. آخرین ویرایش این زبان در ۱۵ آگوست سال ۲۰۱۲ در قالب Framework ۴٫۵ارائه گردید
با توجه به توابع موجود در چارچوب داتنت امکان استفاده از این توابع وجود دارد که میتوان گفت برای هر کاری شرکت مایکروسافت تابعی پیشبینی کرده؛ که این امکان را ایجاد میکند که به فایل اصلی پروژه هیچ فایل کتابخانی را اضافه نکنید (هم به صورت دستی یا خود کامپایلر). این موضوع خود باعث ایجاد فایلهای خروجی با حجم بسیار کم میشود. این موضوع در بسیاری از موارد بسیار اهمیت دارد. برنامههای سی شارپ، همچون تمام برنامههای نوشته شده در چارچوب داتنت و سایر محیطهای ماشینی مجازی مانند جاوا، نیازمند منابع سامانه و حافظه بیشتری نسبت به برنامههای نوشته شده با سایر زبانها مانند سی پلاس پلاس است و هم چنین سرعت کمتری نیز دارد. هر چند تعریف زبان سی شارپ و CLI تحت استانداردهای ISO و ECMA استاندارد شدهاند،CLI تنها قسمتی از Base Class Library (BCL) مایکروسافت میباشد که شامل کلاسهای غیر استاندارد استفاده شده در برنامههای سی شارپ نیز میشود. از این گذشته، بعضی از قسمتهای BCL تحت حق امتیاز مایکروسافت هستند که ممکن است پیادهسازی کامل framework را مختل کند، زیرا تنها بخشهای استاندارد دارای حق محافظت RAND در برابر مدعیان را دارند.
پروژه Microsoft Rotor (در حال حاضر به عنوان Shared Source Common Language Infrastructure شناخته میشود) (ثبت شده فقط برای استفاده آموزشی و تحقیقی) یک پیادهسازی منبع اشتراکی از CLR Runtime را فراهم میآورد و یک کامپایلر سی شارپ، و یک زیرمجموعه از کتابخانه]] CLI Framework مورد نیاز.
کاملاً شبیه به پروژه Mono.
اسم سی شارپ از علامت موسیقی شارپ گرفته شدهاست که در موسیقی بیان گر این است که متن نوشته شده باید نیم قدم از خط بالاتر باشد. مطابق با ECMA-۳۳۴، بخش ۶، مخففها و اختصارها، نام زبان به صورت «#C» نوشته میشود(«کلمه لاتین C (U+۰۰۴۳) به همراه علامت عددی #(U+۰۰۲۳)») که به صورت «سی شارپ» تلفظ میشود. علامت «#» نباید با علامت شارپ در موسیقی(♯، U+266F) که در یک صفحه کلید استاندارد وجود ندارد اشتباه گرفته شود. پسوند شارپ، توسط بسیاری دیگر از زبانهای دات نت مانند #J، #A و #F نیز به کار رفتهاست. پیادهسازی اولیه از زبان ایفل تحت دات نت نیز #Eiffel نام داشت که الان زبان ایفل را بهطور کامل پشتیبانی میکند. هم چنین این پسوند بعضی وقتها در کتابخانهها نیز به کار میرود، مانند #Gtk، #Cocoa و #Qt.
PDC: Professional Developers Conference
امکان درج دیدگاه بسته شده است
