PDA

View Full Version : ویژگی های سی شارپ 3.0



Sayehzendeh
یک شنبه 10 تیر 1386, 13:10 عصر
مقدمه
زبان برنامه نویسی سی شارپ با نسخه 1.0 به جهان برنامه نویسی عرضه شد. Visual Studio .NET مجهز به کامپایلر آن بود و برنامه نویسان می توانستند از ویژگی های نسخه اولیه استفاده کنند. نسخه دوم سی شارپ همراه با ویژوال استودیوی 2005 ارائه شد و توانایی را به نسخه قبلی افزود. مدتی است که شرکت مایکروسافت به صورت آزمایشی آخرین نسخه زبان سی شارپ یعنی نسخه 3.0 آن را در اختیار برنامه نویسان سراسر جهان قرار داد. این نسخه قرار است به صورت نهایی در سال 2008 به همراه Visual Studio 2008 ارائه شود. در این مقاله سعی خواهیم کرد مهم ترین ویژگی های افزوده شده به نسخه سی شارپ 3.0 را مورد بررسی قرار دهیم.

C# 3.0
شاید این سوال در ذهن بسیاری از کسانی که در حال فراگیری سی شارپ هستند، مطرح باشد که چرا سی شارپ با این سرعت در حال دگرگونی است؟ دو سال از ارائه شدن نخسه 2.0 نمی گذرد که نسخه 3.0 هم ارائه شده است! در پاسخ باید گفت که این روند کاملا طبیعی بوده و هیچ گونه مشکلی برای برنامه نویسانی که از زبان سی شارپ استفاده می کنند، ایجاد نمی کند.پایه زبان سی شارپ، نسخه 1.0 آن می باشد. این نسخه تمامی کمات کلیدی و ساختارهای اصلی زبان را مشخص می کند. آنچه که در نسخه های بعدی به زبان اضافه می شود تنها ویژگی های جدید است که موجب تسهیل امر کدنویسی می شود.
قبل از ارائه شدن نسخه جدید یک زبان، ویژگی ها و خصوصیات آن به صورت فایل متنی (Specification file) در اختیار جامعه برنامه نویسی قرار می گیرد. ویژگی ها و خصوصیات، نحوه عملکرد نسخه جدید را بیان می کنند.کسانی که قصد داشته باشند با ویژگی های نسخه 3.0 سی شارپ آشنا شوند می توانند فایل C# 3.0 Specification (http://download.microsoft.com/download/9/5/0/9503e33e-fde6-4aed-b5d0-ffe749822f1b/csharp%203.0%20specification.doc) را مطالعه کنند. ویژگی های جدید سی شارپ 3.0 که در این فایل بیان شده اند، عبارت اند از:

· Implicitly typed local variables, which permit the type of local variables to be inferred from the expressions used to initialize them.
· Extension methods, which make it possible to extend existing types and constructed types with additional methods.
· Lambda expressions, an evolution of anonymous methods that provides improved type inference and conversions to both delegate types and expression trees.
· Object initializers, which ease construction and initialization of objects.
· Anonymous types, which are tuple types automatically inferred and created from object initializers.
· Implicitly typed arrays, a form of array creation and initialization that infers the element type of the array from an array initializer.
· Query expressions, which provide a language integrated syntax for queries that is similar to relational and hierarchical query languages such as SQL and XQuery.
· Expression trees, which permit lambda expressions to be represented as data (expression trees) instead of as code (delegates).
در ادامه این مقاله، مهم ترین ویژگی های ذکر شده را شرح خواهیم داد.

Implicitly typed local variables – متغیرهای ضمنی محلی
سی شارپ 3.0 کلمه کلیدی جدید var را معرفی می کند که به کمک آن برنامه نویسان قادر خواهند بود متغیرهای محلی خود را بدون ذکر صریح نوع آن ها، تعریف کنند.با توجه به این ویژگی جدید، تعریف یک رشته و یا مقدار عددی به صورت زیر امکانپذیر است:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(1).png

یکی از ویژگی های اصلی زبان سی شارپ، Strong Type بودن آن است. Strong Type بودن زبان به این معناست که با اعلان یک متغیر، نوع آن صریحا باید توسط برنامه نویس مشخص شود. آیا اضافه شدن ویژگی جدید، منافاتی با Strong Type بودن سی شارپ دارد؟در پاسخ باید گفت که تعریف متغیرهای محلی به صورت ضمنی با استفاده از کلمه کلیدی var هیچ گونه منافاتی با Strong Type بودن سی شارپ ندارد. چون برنامه نویس می بایست نوع متغیر را به هنگام اعلان آن صریحا مشخص کند.نوع متغیر پس از اولین اعلان تا اتمام حوزه تعریف آن تغییر نخواهد کرد و هر گونه تلاش برای تغییر نوع با خطا مواجه خواهد شد.با توجه به موارد بیان شده دو اعلان زیر نامعتبر هستند:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture.png
دقت کنید که استفاده از var تنها در تعریف متغیرهای محلی امکانپذیر است. در اعلان متغیرها به صورت سراسری، پارامترهای توابع و مقادیر بازگشتی نمی توان ازvar استفاده کرد.
چراvar ؟ این ویژگی آزادی عملی بیشتری برای کار با متغیرهای محلی در اختیار برنامه نویس قرار می دهد. سناریویی را در نظر بیگیرید که یک تابع تحت شرایطی، مقادیر از انواع مختلف را برگرداند. در این صورت بدون درگیر شدن با casting و تبدیل نوع می توان با تعریف متغیر ضمنی محلی هر نوعی را که تابع برمی گرداند، در اختیار داشت.

Extension methods – توابع بسط داده شده
زبان سی شارپ کلمه کلیدی sealed را برای این منظور ارائه کرد که امکان ارث بری از یک کلاس را صلب کند. یعنی با اضافه شدن این کلمه کلیدی به ابتدای تعریف کلاس، امکان ارث بری از آن غیر ممکن می شود. سی شارپ 3.0 ویژگی جدیدی را در اختیار برنامه نویسان قرار می دهد به این صورت که می توان هر نوع کلاسی – حتی کلاس های مهر شده با Sealed را با استفاده از Extension methods بسط داد. به مثال زیر توجه کنید:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(2).png

اعضای کلاس String در آن نشان داده شده اند! کلاس String از جمله کلاس هایی است که با ارث بری قابل بسط دادن نمی باشد. اما اینک توابع زیادی به عنوان Extension methods به آن اضافه شده اند که با آیکون http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture(17).png مشخص می شوند. تنها نکته مهم این است که Extension methods فقط به کلاس های Static اضافه می شوند. مانند مثال زیر :

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(3).png

در این مثال کلاس استاتیک MyConvertor به همراه تابع عضو آن StringToInt32 تعریف شده است که مقادیر رشته ای را به مقادیر عددی تبدیل می کند.دقت کنید که MyConvertor، یک تابع بسط داده شده به کلاس String اضافه می کند.نحو (syntax) تعریف تابع بسط داده شده با زیرخط زرد رنگ مشخص شده است.در تعریف تابع بسط داده شده باید از کلمه کلیدی this به صورت قراردادی استفاده کرد.پس از کلمه کلیدی باید نوعی را مشخص کرد که دسترسی به تابع از طریق آن امکانپذیر خواهد بود.(در مثال بالا تابع Str_Int32 از طریق کلاس string قابل دسترسی خواهد بود) پس از تعریف تابع بسط داده شده، می توان در مجموعه توابع کلاس String از آن استفاده کرد که این مورد در شکل به خوبی نشان داده شده است.
چرا Extension methods؟ همانطور که بیان شد بسیاری از کلاس های ارائه شده در دات نت فریم ورک با برچسب sealed، قابل بسط داده شدن نیستند. کلاس مفیدی مثل List را در نظر بگیرید که از جمله این کلاس هاست. با استفاده از ویژگی معرفی شده برنامه نویسان قادر خواهند بود با اضافه کردن توابع دلخواه خود به این کلاس ها، آنها را بنا به نیاز خود بسط دهند.

Lambda expressions – عبارات لامبدا
یکی از ویژگی هایی که سی شارپ 2.0 ارائه کرد، توانایی تعریف توابع به صورت Inline بود که این ویژگی با عنوان توابع بی نام (anonymous methods) شناخته می شود. توابع بی نام در پاره ای مواقع بسیار مفیدند. اما نحو (syntax) به کارگیری آنها دشوار می باشد. عبارات لامبدا ویژگی توابع بی نام را دارند اما با نحو ساده تری در سی شارپ 3.0 معرفی شده اند. به نمونه ای از عبارات لامبدای تعریف شده توجه کنید:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(4).png
تعریف عبارات لامبدا از نحو (syntax) خاصی پیرو می کند. همانطور که در شکل مشاهده می کنید، پارامترهای تابع هم به صورت صریح و هم به صورت ضمنی قابل بیان اند. کلمه return به صورت ضمنی حذف شده است. تابع معادل عبارت لامبدای اول به شکل زیر می باشد:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(5).png

لیست پارامترها و بدنه عبارت لامبدا توسط => از هم جدا می شوند. در صورتی که تعریف عبارت لامبدا بیشتر از یک خط کد باشد می توان بدنه آن را با استفاده از {} نشان داد مانند شکل زیر:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(6).png

در ادامه یک مثال عملی از عبارات لامبدا بیان می شود. کلاس MyMath را در نظر بگیرید. یک نماینده و یک تابع در داخل این کلاس تعریف شده اند:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(7).png
تابع MathInvoker برای این منظور در نظر گرفته شده است که از طریق نماینده Operation که از نوع MathFn می باشد، یکی از چهار عملی اصلی را دریافت کرده، و با استفاده از آرگومان های ارسالی، تابع مربوطه را فراخوانی کند.به فراخوانی های زیر دقت کنید:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(8).png

تابع MathInvoker اول با پارامتر تابع بی نام و سپس باعبارت لامبدا فراخوانی شده است.سادگی کار با عبارت لامبدا نسبت به تابع بی نام کاملا مشهود می باشد. (عبارت لامبدا با زیر خط آبی مشخص شده است)

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(9).png
چرا Lambda expressions؟ عبارات لامبدا برای جایگزین کردن توابع بی نام ارائه شده اند.نحو ساده تری دارند.در ضمن در Expression trees از آنها استفاده می شود.

Object initializers – سازنده های پیشرفته
ماهیت تمامی برنامه های امروزی به گونه ای ست که با حجم عظیمی از داده ها سرو کار دارند.برای مدیریت داده ها، نیاز به کلاس هایی ست که در مهندسی نرم افزار آنها را Entity Types می نامیم.این کلاس ها به عنوان بسته هایی از داده ها محسوب می شوند.معضل فعلی موجود در رابطه با Entity Typeها تعدد سازنده های آن ها می باشد و ممکن است شما نیز با این مشکل برخورد کرده باشید.به این صورت که در سناریوهای مختلف، برنامه نویسان مجبور هستند سازنده یک کلاس را به چند شکل سربارگذاری کنند.سی شارپ 3.0 راه چاره ای فوق العاده برای این مشکل ارائه می دهد. Object initializer حالت پیشرفته ای از سازنده می باشد.یک کلاس Entity به نام Person در نظر بگیرید که داده های زیر را بسته بندی ( پکیج ) می کند:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(10).png
این کلاس شامل سه متغیر بوده و برای هرمتغیر شناسه ای تعریف شده است.اینک این سوالات مطرح می شوند : سازنده این کلاس را به چند شکل باید سربارگذاری کرد؟ سازنده ای که هر سه متغیر را مقداردهی کند؟ شاید در مواردی هر سه متغیر در دست نباشد در این صورت چه سازنده ای باید فراخوانی شود؟ سی شارپ 3.0 راه حل زیر را ارائه می دهد.فرض کنید بخوانیم نمونه ای ازکلاس Person را ایجاد کنیم:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(11).png
همانطور که مشاهده می کنید،در سی شارپ 3.0 به هنگام نمونه سازی، این امکان در اختیار برنامه نویس قرار می گیرد که هر یک از خصیصه های موجود در کلاس را به دلخواه و بنا به نیاز مقدار دهی کند ( فوق العاده است نه؟!) به شکل زیر :

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(12).png
توجه داشته باشید که به جای () از {} استفاده شده است.در ضمن هیچ سازنده ای در کلاس Person تعریف نشده است!

Anonymous types – تایپ های بی نام!
سی شارپ 2.0 توابع بی نام را معرفی کرد.سی شارپ 3.0 هم انواع بی نام را معرفی می کند.با استفاده از این ویژگی برنامه نویسان قادر خواهند بود به صورت Inline انواع دلخواه خود را ایجاد کنند! به نمونه زیر توجه کنید:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(13).png
کد ارائه شده، یک نوع بی نام را تعریف می کند که از طریق متغیر ضمنی محلی به نام anonymousType در اختیار قرار می گیرد.به توضیحات ویژوال استودیو نسبت به نوع ایجاد شده دقت کنید.همانطور که مشاهده می کنید، تمامی متغیرهایی که در سازنده پیشرفته ذکر شده اند، در ادامه به عنوان خصیصه های نوع بی نام مطرح می شوند.
چرا Anonymous types؟ انواع بی نام بهترین گزینه برای تولید Entity Typeها می باشند.همانطور که گفته شد Entity Typeها فقط حاوی داده ها هستند.بنابراین به بهترین نحو می توان داده های دریافت شده از کاربر را در انواع بی نام بسته بندی کرد.

Query expressions – عبارات کئوری
تیم طراح سی شارپ ویژگی فوق العاده ای را به آن اضافه کرد که برنامه نویسان را قادر می سازد نحو (Syntax) زبان های پرس و جو مانند SQL و XQuery را با استفاده از سی شارپ پیاده سازی کنند! این ویژگی با نام اختصاری LINQ شناخته می شود و دارای انواع زیر است:

§ LINQ-to-Objects - talks to in-memory objects
§ LINQ-to-SQL - talks to SQL Server databases
§ LINQ-to-XML - talks to hierarchical data represented in XML
§ LINQ-to-DataSets - talks to DataSet objects and underlying DataTables with their relationships
§ LINQ-to-Entities - talks to "entities", part of ADO.NET 3.0
نمونه ای ازکاربر LINQ در شکل زیر نشان داده شده است :

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(14).png
توضیح : در مثال بالا ابتدا یک آرایه ی intی با مقداردهی اولیه تعریف شده است.سپس با استفاده از دستورات LINQ ( که جز کلمات کلیدی سی شارپ محسوب می شوند)، آرایه ای با اعضای بزرگتر از 5 انتخاب و در متغیر ضمنی محلی selective_array ذخیره می شود.در نهایت اعضای selective_array به شکل زیر چاپ می شوند:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(15).png
در توضیح این ویژگی جدید به همین یک مثال بسنده می کنیم چون بیان تمامی جنبه های LINQ خود نیازمند نگارش مقاله ای مفصل می باشد.

دو ویژگی باقیمانده
شش ویژگی سی شارپ 3.0 را به طور کامل شرح دادیم و این شش مورد از اهمیت بیشتری برخودارند.در مورد Implicitly typed arrays باید گفت که این ویژگی عبارت است از تعریف متغیرهای آرایه ای با استفاده از کلمه کلیدی var .به مثال های زیر دقت کنید:

http://www.persiadevelopers.com/images/articles/csharp3/New%20Picture%20(16).png
trees نیز در رابطه با عبارات لامبدا مطرح می شود.در توضیحات مربوط به عبارات لامبدا بیان شد که این عبارات جایگزینی برای توابع بی نام هستند بنابراین ماهیت delegate ی دارند.اگر بخواهیم به عبارات لامبدا ماهیت داده ای (data) بدهیم،مقوله Expression trees مطرح می شود.برای کسب اطلاعات کامل تر به مراجع منتشر شده در این زمینه مراجعه کنید.

جمع بندی
در این مقاله سی شارپ 3.0 را به طور کامل بررسی کردیم. اگر دقت کرده باشید، بیشتر ویژگی های ارائه شده توسط نسخه جدید کار با داده ها را تسهیل بخشیده و با کاهش میزان کدنویسی، باعث صرفه جویی در وقت خواهند شد.
با اتمام مطالعه این مقاله، خواهشمندم نظر خود را از طریق رای و نیز بخش پیام منعکس کنید. این امر اینجانب را در ارائه هر چه بهتر مقاله های بعدی یاری خواهد کرد. منتظر نظرات شما در رابطه با سی شارپ 3.0 خواهم بود.

M-Gheibi
یک شنبه 10 تیر 1386, 13:32 عصر
ذکر منبع مقالاتی که از محل دیگری برداشت شده الزامیست !
منبع این مطلب : http://www.persiadevelopers.com/articles/csharp3.0.aspx