PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آموزش سي شارپ



P a R y A
09-19-2010, 03:13 PM
سي شارپ در سال 2001 توسط شركت مايكروسافت به همراه بسته دات نت براي اولين بار مطرح و ارائه شد. كه بعد ها به عنوان يك زبان برنامه نويسي استاندارد توسط ECMA (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fcsha rptuning.blogfa.com%252FECMA%2525C3%252599%2525C2% 25258D) و ISO (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fcsha rptuning.blogfa.com%252FISO) مورد تائيد قرار گرفت.

زبان برنامه نويسي سي شارپ توسط تيمي به مديريت اندرز هايلزبرگ (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fcsha rptuning.blogfa.com%252F%2525C3%252598%2525C2%2525 A7%2525C3%252599%2525C2%252586%2525C3%252598%2525C 2%2525AF%2525C3%252598%2525C2%2525B1%2525C3%252598 %2525C2%2525B2%252520%2525C3%252599%2525C2%252587% 2525C3%252598%2525C2%2525A7%2525C3%252599%2525C2%2 5258A%2525C3%252599%2525C2%252584%2525C3%252598%25 25C2%2525B2%2525C3%252598%2525C2%2525A8%2525C3%252 598%2525C2%2525B1%2525C3%25259A%2525C2%2525AF) كه قبلا تجربه ارائه زبان هاي برنامه نويسي موفقي همچون توربو پاسكال و دلفي رو داشت ايجاد شد. هايلزبرگ سي شارپ را يك زبان برنامه نويسي شي گراء كه از زبان هاي برنامه نويسي بزرگ (همچون دلفي , جاوا و اسمال تاك) تاثير پذيري داشته معرفي مي كنه. Syntax زبان سي شارپ شبيه به ++C مي باشد و البته تفاوت هاي بسياري هم داره.

حالا قبل از اينكه بخواهم بيشتر در مورد سي شارپ توضيح بدم بايد يه توضيحاتي هم در مورد دات نت و امكاناتش بگم.

دات نت فريم ورك (NET Framework) يه بسته نرم افزاري شامل راه حل بسياري از نيازهاي توسعه نرم افزاري (Base Class Library) و همچنين امكان توسعه و اجراي برنامه هاي توليد شده براي اين فريم ورك مي باشد. برنامه هاي توليد شده براي دات نت فريم ورك توسط Common Language Runtime اجراء مي شوند.

CLR يا همان Common Language Runtime سرويس هايي مهمي از قبيل Garbage Collection , Memory Managment و Exception Handling رو ارائه مي دهد.

Garbage Collection: در زبان برنامه نويسي سي شارپ ديگر نگراني از جهت مديريت اشياء در حافظه وجود ندارد به اين معني كه وقتي شما شيء ايجاد مي كنيد بعد از اينكه ديگر از آن شي ء استفاده نكرديد آن شيء به طور اتوماتيك از حافظه پاك خواهد شد. اين كار توسط GC يا همان Garbage Collector انجام مي شود.
روش كار GC به اين ترتيب است كه تا موقعي كه Referenceي به يك object وجود داشته باشد آن شيء در حافظه باقي خواهد ماند اما در صورتيكه Referenceي به آن شيء وجود نداشته باشد بعد از يك بازه زماني نامشخص آن شيء به صورت اتوماتيك از حافظه پاك خواهد شد. در مورد نحوه عملكردش بعدا بيشتر توضيح ميدم.

يه نكته ديگري كه بايد بهش اشاره كنم اينه كه برخلاف زبان هاي برنامه نويسي ديگر وقتي كد شما در زبان برنامه نويسي سي شارپ (يا هريك از زبان هاي ديگر دات نت) كامپايل مي شود به يك زبان ديگري به نام Intermediate Language يا همان IL تبديل مي شود. و در موقعي كه درخواست براي اجراء آن داده مي شود توسط يك مكانيزمي به نام Just In Time Compiler كه در CLR موجود است به زبان خاص آن ماشين تبديل شده و اجراء مي گردد.




http://www.u2u.net/Res/articles/images/msdnet11.gif

P a R y A
09-19-2010, 03:15 PM
حالا مي خوام در مورد سي شارپ كمي بيشتر صحبت كنيم. سي شارپ يك زبان شيء گراست به اين معني كه هرآنچه كه در سي شارپ وجود دارد در غالب دو مفهوم كلاس (Class) و شيء (Object) و روابط بين آنها خلاصه مي شود.


كلاس(Class): در واقع يك ايده (Concept) يا ذهنيت مي باشد. مثلا يك نجار چه ذهنيتي نصبت به يك "ميز" دارد؟ خوب مسلما يه صفحه , چهار پايه و .... اين ذهنيتي است كه يك نجار نسبت به "ميز" دارد. اين دقيقا مفهوم كلاس است. يعني تا موقعي كه آن ميز ساخته نشه فقط يك ذهنيت يا در واقع كلاس است.


شيء (Object): اشياء موجوديت هايي هستند كه از كلاس ها (ذهنيت) ساخته مي شوند. باز براي مثال همان نجار وقتي ذهنيتش رو به واقعيت تبديل مي كنه در واقع يك ميز مي سازه يا يك Object (شيء) ايجاد كرده است.


حالا اگر يكم دقت كنيم مي بينيم كه توي دنياي واقعي هم همينطوره. مفهوم انسان يك كلاس است و وقتي يك نفر متولد مي شود يك شيء از آن كلاس داريم.


باز وقتي بيشتر دقت مي كنيم مي بينيم كه همه كلاس ها (ذهنيت ها) مي تونن يكسري مشخصات داشته باشند. مثلا انسان. مسلما هر انساني اسم داره , سن داره , رنگ مو , رنگ پوست و ... اين اطلاعات state يا خصوصيات هر فرد هستند. و البته هر انساني يكسري توانمندي داره يعني مي تونه يكسري كار انجام بده. مثلا راه بره , حرف بزنه , گوش كنه , بنويسه , .... اين ها رفتار ها يا behavior هر فرد هستند.

حالا سوالي كه پيش مياد اينه كه آيا ميشه دو نفر با خصوصيات مشترك و رفتار مشترك رو يكي دونست؟

علي احمدي 33 ساله - علي احمدي 33 ساله؟
آيا به نظر شما اين دو يك نفر هستند!؟!

خير. پس هميشه يك چيز وجود داره كه ما ميتونيم دو نفر رو از هم تميز بديم: ما به اون مي گيم Identity (وسيله شناسايي). براي اين دو مي تونه شماره شناسنامشون باشه يا كد ملي يا ...

حالا به نظر شما براي كامپيوتر دو موجود كه داراي اطلاعات و رفتار هاي كاملا مشترك هستند چطور از هم تشخيص داده مي شوند؟ جواب محل قرار گيريشان در حافظه است.

P a R y A
09-19-2010, 03:19 PM
كلاس هاي پايه دات نت - dot Net Base Class Library
بعد از اينكه مفهوم كلاس و شيء رو متوجه شديم. براي اطلاعتون بايد بگم كه دات نت فريم ورك حدود 2500 كلاس داره كه قبلا براي شما نوشته شده و شما بدون اينكه احتياجي به نوشتنشون داشته باشين خيلي راحت مي تونين از اين 2500 كلاس موجود استفاده كنين.

Namespace چيست؟
اگر يك مقدار فكر كنيم مي بينيم كه پيدا كردن يك كلاس بين 2500 كلاس پايه و احتمالا كلاس هايي كه خودتون نام گذاري شون مي كنين كار سختي خواهد بود!
Namespace ها در حقيقت اين امكان رو بشما مي دهند كه بتوانيد كلاس هاي خودتون رو دسته بندي كنين و هر كلاس رو داخل دسته مورد نظر خودشون قرار بدين. به عنوان مثال ما كلاسي داريم به نام SqlConnection و همينطور كلاس ديگري به نام SqlDataAdapter و .... براي همين يك Namespace به نام System.Data.SqlClient ايجاد شده كه كلاس هايي كه مربوط به System و كار با داده ها (Data) و در نهايت مختص Sql Server هستند رو داخل اين namespace قرار مي دهيم. توي اين تصوير تعدادي از namespace هاي عمومي دات نت نمايش داده شده اند.




http://msdn2.microsoft.com/en-us/library/Aa446549.net_vs_netcf02%28en-us,MSDN.10%29.gif


اين نكته رو هم بياد داشته باشين كه اسم كامل يك كلاس شامل اسم به همراه نام namespace آن است:
System.Data.SqlClient.SqlConnection اسم كامل ( Qualified Name) كلاس SqlConnection مي باشد.

using
اما اگر قرار باشد براي استفاده از يك كلاس هميشه اسم كاملش رو بنويسيم كار ما خيلي سخت مي شود. براي همين شما ميتوانيد با يكبار نوشتن اسم Namespace آن كلاس (يا كلاس هايي كه مي خواهيد استفاده كنين) با استفاده از يك keyword به نام using از تكرار آن جلوگيري كنين.

به عنوان مثال من در يك مثال مي خواهم ده ها بار از كلاس Console و دستوراتش استفاده كنم. براي همين بالاي كدم يك بار using System; رو ذكر مي كنم تا از نوشتن كلمه System براي دفعات مكرر جلوگيري كنم:



کد:
using System;

P a R y A
09-19-2010, 03:22 PM
http://forum.irantrack.com/images/icons/icon1.gif


اجازه بدين كمي از دنياي تئوري خارج شيم و كمي هم كد بنويسيم. اما قبل اينكه وارد كد نويسي بشيم بايد با محيطي كه قراره توش كد بنويسيم رو بشناسيم.

برنامه نويسان سي شارپ دات نت معمولا از Visual Studio .NET براي توليد كد استفاده مي كنند. هرچند كه در اين مورد شما هيچ محدوديتي ندارين و مي تونين از هر ابزاري حتي Notepad براي توليد كد استفاده كنين.

Visual Studio .NET 2005
نسخه 8 Visual Studio شركت مايكروسافت كه خيلي راحت مي تونين از بازار تهيه كنين و خوشبختانه (يا شايد هم متاسفانه) دو سه هزار تومان بيشتر قيمت نداره. البته به دليل قيمتي زيادي كه در بيرون از ايران داره مايكروسافت يك نسخه مجاني به نام Visual Studio 2005 Express Edition رو هم ارائه مي كنه كه مي تونين از لينك زير دانلودش كنين.
Visual Studio 2005 Express Edition (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fwww. microsoft.com%252Fexpress%252F2005%252F)
! من توي توضيحاتم از نسخه Professional استفاده خواهم كرد.

بعد از اينكه مراحل نصب (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Frame zanpour.spaces.live.com%252Fblog%252Fcns%252521CE5 255FECBD193D%252521218.entry) تمام شد. از منوي Start --> All Programm --> Microsoft Visual Studio 2005 روي Microsoft Visual Studio 2005 كليك كنين تا پنجره مقابل براتون باز بشه. اين صفحه Start Page مي باشد.

http://www.tabatabaei.info/csharpsamples/VS2005.GIF


اگر دقت كنين سمت چپ بالا دو تا گزينه Open و Create كه امكان ايجاد يا باز كردن پروژه يا وب سايت رو به شما مي دهد دارين. روي گزينه Create Project كليك كنين(مي تونين اين كار رو با استفاده از كليد هاي Shift + Ctrl + N هم انجام بدين. بهتون پيشنهاد مي كنم براي سريع تر شدن كارتون Shortcut ها رو ياد بگيرين.

http://www.tabatabaei.info/csharpsamples/VSNewProject.GIF

در پنجره مقابل روي گزينه Visual CSharp كليك كنين تا انواع پروژه هايي كه مي شه با زبان سي شارپ توليد كرد رو بينين. در ابتدا دوره ما با پيروي از اصول مايكروسافت مثال هايمان در محيط Console Application كه يك محيطي شبيه با DOS و بدون طراحي UI مي باشد شروع خواهيم كرد. در ادامه وارد Windows و ... مي شويم.

در قسمت پائين صفحه داخل قسمت Name نام پروژه خود رو بنويسين و در قسمت Location مسير پروژه خود رو مشخص كنين و در نهايت اسم Solution رو وارد نمائيد. به صورت پيش فرض اسم Solution همان اسم پروژه شماست. دقت كنين كه در دات نت براي هر پروژه يك Folder ايجاد خواهد شد. البته در صورتيكه شما گزينه Create directory for solution رو هم تيك بزنين يك Folder هم براي Solution ايجاد خواهد شد.

Solution چيست؟
Solution يا به معناي فارسي راه حل بالاترین سطح دسته بندي در محيط ويژوال استوديو دات نت است. يك Solution مي تواند يك يا چند پروژه و هم اين طور فايل را در كنار هم دسته بندي نمايد.اصولا وظيفه Solution نگهداري اطلاعات روابط بين پروژه هاست كه يك فايل با پسوند sln مي باشد. و داراي تاثير در خروجي پروژه نخواهد بود. در ادامه دوره بيشتر در اين مورد توضيح خواهم داد.

در مقابل Project يا همان پروژه ها داراي خروجي مستقيم با توجه به نوعشان هستند. به عنوان مثال Console Application ها داراي خروجي با پسوند exe به معناي executable يا همان فايل هاي قابل اجراء مي باشند.
! در دات نت ما به خروجي هر پروژه فارغ از اينكه چه نوع فايلي است (exe يا dll) اسمبلي - Assembly مي گويم.

بعد از اينكه كليد OK رو زديد پروژه شما ايجاد مي شود و براي شما يك فايل به نام Programm.cs رو باز مي نمايد. اين فايل به صورت پيش فرض محلي است كه نرم افزار شما از داخل آن شروع خواهد شد. حالا فقط براي اينكه شروع كرده باشيم داخل اين فايل و مطابق شكل زير شروع به تايپ كردن نمائيد:
کد:
Console.WriteLine("Hello World - C# Tuning!");


http://www.tabatabaei.info/csharpsamples/HelloWorldCsharpTuning.gif

و در نهايت براي اينكه نرم افزارتون رو بتونين تست كنين كافيه كه كليد Ctrl + F5 رو بزنين تا اين نتيجه رو بگيرين:



http://www.tabatabaei.info/csharpsamples/RunHWCsharpTuning.gif

P a R y A
09-19-2010, 03:25 PM
اجازه بدين ابتدا كدي كه قبلا نوشتيم رو بررسي كنيم.



کد:
Console.WriteLine("Hello World - C# Tuning");
اين خط در حقيقت همان جمله Hello World - C# Tuning رو براي ما چاپ مي كنه. در حقيقت كلاس Console داراي يك رفتار (Method) مي باشد كه امكان چاپ بر روي صفحه رو به ما مي دهد. اين متد WriteLine مي باشد.

پس اگر شما هر چيز ديگري داخل پرانتز و بين " " قرار دهيد همان را براي شما چاپ خواهد كرد.

Method چيست؟
در واقع Method ها همان رفتار هايي هستند كه ما از كلاس ها انتظار داريم. در مثال بالا نوشتن بر روي تصوير رو مي توانيم با استفاده از متد WriteLine بر روي كلاس Console استفاده كنيم.

ايجاد متغيير ها در سي شارپ - Variables in CSharp

براي ايجاد يك متغيير در سي شارپ بايد ابتدا نوع داده اي آن و سپس نام متغيير را وارد نمائيم و در انتها ; را تايپ كنيم:



کد:
int MyNumber = 1000;Console.WriteLine(MyNumber);
در مثال بالا از نوع داده اي int كه يك نوع داده اي عددي است استفاده شده است. پس مي توانيم مقادير عددي رو داخل اين متغيير قرار دهيم. و مثل كد بالا با استفاده از WriteLine چاپش كنيم.


نوع هاي داده اي در سي شارپ - C# DataTypes
نوع هاي داده اي رو مي توان بسته به محل قرار گيريشان در حافظه به سه دسته تقسيم كرد:

Values Types
Reference Types
Pointer Types
!!! تاكيد دارم كه اين مطلب يكي از مهمترين مباحث برنامه نويسي در سي شارپ است.

اگرحافظه رو به دو قسمت Stack و Heap تقسيم كنيم. مقادير تمامي متغيير هاي نوع اول در حافظه Stack قرار مي گيرد و به همين جهت داراي رفتارهاي خاصي مي شود كه بيشتر توضيح خواهم داد. مقادير متغيير هاي نوع دوم در حافظه Heap قرار مي گيرند. در مورد Poiter Type ها صحبت نخواهيم كرد.

Value Types: همان طور كه گفتيم مهمترين خاصيت اين نوع متغيير ها قرارگيري مقادير آن ها در حافظه Stack مي باشد كه به همين دليل رفتارهاي خاصي خواهند داشت. اين نوع متغيير ها شامل : Primitive Types يا همان نوع هاي بدوي - Enum ها و Struct ها مي باشند.

Numeric Types , Boolean , Char نوع هايي هستند كه به آن ها Primitive Types مي گوييم. نوع هاي عددي شامل : int , double , decimal , long , short , byte و ... كه مقادير مختلفي از اعداد رو داخل خوشان نگه مي دارند.
Boolean ها متغيير هايي هستند كه فقط مقدار True و False به معني مثبت يا منفي رو داخل خوشان نگه مي دارند. و در نهايت Char ها همان كاراكتر ها هستند.



کد:
bool married = false;int myNumber = 1000;char c = 'c';
! دقت داشته باشين كه براي مقدار دهي char از ' يا همان Single Quotation استفاده كرديم. و براي bool فقط مقدار true يا false امكان پذير است

P a R y A
09-19-2010, 03:26 PM
اجازه بدين تا مقداري موضوع بحث رو از Value Type ها به يك Reference تايپ تغيير بديم.


كلاس ها - Classes
قبل از اين تعريف كلاس رو با هم بررسي كرديم. اما حالا چطور مي توان يك كلاس توليد كرد. فرض بفرمائيد مفهومي مثل انسان رو مي خواهيم در غالب يك كلاس تعريف كنيم.

ابتدا يك پروژه جديد از نوع Console Application با يك نام دلخواه در مسير دلخواه تان ايجاد كنين. سپس يك فايل با نام Prgoramm.cs خواهيد داشت كه در مثال قبلي ديده بوديم. حالا بايد يك كلاس جديد به پروژه اضافه كنيم. براي اين كار بايد از منوي View گزينه Solution Explorer رو انتخاب كنيم يا مي توانيم از كليد هاي Alt + Ctrl + L استفاده نمائيم.


Solution Explorer در واقع يك نمايش مبنتي بر فايل از پروژه يا Solution شماست كه به صورت يك درخت واره (TreeView) مي باشد. راس آن Solution شماست و سپس پروژه و Properties و Reference و در نهايت كلاس ها و آيتم هاي ديگر پروژه شماست. روي Project يعني دومين آيتم از اين درخت واره راست كليك كرده و گزينه Add و بعد New Item رو كليك مي نمائيم. در پنجره اي كه باز مي شود يك Class را انتخاب و در قسمت پايين اسم فايل رو مشخص مي نمائيم. دقت كنين كه پسوند فايل هاي سي شارپ cs مي باشد. (براي اين مثال نام Person رو تايپ نمائيد.)
! نكته اي كه لازمه در نامگذاري فايل ها متدها و ... رعايت كنين اين است كه نام گذاري كلاس ها بهتر است به ترتيبي باشد كه حرف اول هر كلمه با حروف بزرگ (Upper Case) و ما بقي با حروف كوچك باشد. به عنوان مثال كلاس Person كه P با حروف بزرگ و ما بقي كوچك مي باشد. يا كلاس SqlConnection حروف اول هر كلمه يعني S و C با Upper case نوشته مي شوند.

وقتي اسم رو تايپ كردين و گزينه Add رو زديد. سپس يك فايل به Solution Explorer اضافه خواهد شد و همزمان براي شما نمايش داده مي شود. متن داخل فايل به اين ترتيب است:

کد:
using System;using System.Collections.Generic;using System.Text;namespace CSharpTuning.Samples{ class Person { }}
قبل از اين در مورد كلمه using و namespace صحبت كرده ايم. همانطور كه مي دانيد يك namespace يك دسته بندي براي كلاس هاست. حالا ما داريم يك namespace به نام CSharpTuning.Samples براي مثال هاي اين وبلاگ توليد مي كنيم و كلاس Person را داخل اين namespace قرار مي دهيم. دقت كنين كه هر namespace داراي يك block از كد مي باشد كه با استفاده از علامت } شروع و بعد با { پايان مي يابد و هر آنچه كه داخل اين علامت باشد داخل آن namespace قرار خواهد گرفت.

ايجاد كلاس در سي شارپ
براي ايجاد يك كلاس در سي شارپ شما بايد داخل يك namespace از كلمه كليدي class و سپس نام كلاس استفاده كنين. مثال با براي ايجاد كلاس Person داخل namespaceي به نام CSharptuning.Samples جمله فوق يعني class Person‍ رو به همراه يك block از كد براي اين كلاس ايجاد مي كنيم. دقت كنين كه شما تا به اينجا دو علامت } و دو علامت ‍{ ديده ايد يعني شما دو block از كد داريد كه يكي براي namespace و ديگري براي كلاس Person مي باشد. هر آنچه كه داخل {} علامت مربوط به كلاس Person قرار گيرد متعلق به كلاس Person است.

فيلد ها - Fileds در سي شارپ
تا ايجاي كار كلاس ما هنوز هيچ عضوي ندارد اما ما مي توانيم از اين كلاس استفاده كنيم. حالا بايد داخل اين كلاس اطلاعات مورد نظرمان را تعريف كنيم. من مي خواهم Field هاي Name و Age رو براي اين كلاس تعريف كنم. به اين معنا كه هر انسان (Person) داراي نام و سن مي باشد.

براي تعريف يك Field با داخل block كلاس مورد نظر ابتدا كلمه public و سپس نوع داده اي و سپس نام متغيير را وارد نمائيم. پس من داخل block كلاس Person اين دو جمله را تايپ مي نمايم.



کد:
public string Name;public int Age;
! توجه داشته باشين كه فعلا فقط از كلمه public استفاده مي نمائيم. در آينده در مورد ما بقي Access Modifier ها صحبت مي كنيم.

پس تا اينجا كلاس ما بايد به اين شكل باشد:



http://www.tabatabaei.info/csharpsamples/ClassPerson.JPG

حالا مي توانيم از اين كلاس شي ء بسازيم و به اشيايي كه ايجاد كرديم مقادير Name و Age رو ست كنيم.

P a R y A
09-19-2010, 03:28 PM
بعد از اينكه يك كلاس رو ايجاد كرديم بايد بتوانيم از آن كلاس استفاده كنيم. اصولا براي استفاده از يك كلاس مي توانيم از آن كلاس يك شيء بسازيم و سپس به آن شيء اطللاعات ست كنيم و از رفتار هاي آن كلاس استفاده كنيم. همانطور كه قبلا هم گفتم (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fcsha rptuning.blogfa.com%252Fpost-9.aspx) حافظه رو مي توان به دو قسمت Stack و Heap تقسيم كرد. براي ساختن يك شيء (object) بايد ابتدا يك متغيير از جنس كلاس مورد نظر ايجاد كنيم:


کد:
Person p;
در حقيقت متغيير p يك رابطه (Reference) به شيء مورد نظر خواهد بود. پس يك شيء رو به آن متغيير نسبت مي دهيم. دقت داشته باشين كه reference شما در حاقظه Stack و خود شيء شما در حافظه Heap ساخته خواهد شد:

کد:
p = new Person();
البته در تمامي پست ها من براي اينكه بتوانم به شيء مورد نظرم دسترسي داشته باشم reference رو يك object صدا خواهم زد امادقت داشته باشين كه در حقيقت p يك refernce است و نه objcet اما بدون آن reference ما به آن object دسترسي نخواهيم داشت (اگرobject رو يك تلويزوين در يك محلي عمومي مثل فرودگاه در نظر بگيرين بدون داشتن remote control نمي توانين كانال تلويزيون رو عوض كنين. پس اين reference يا متغيير p در نقش يك remote control براي شيء است كه ما در حافظه Heap داريم).

خطوط بالا رو مي توان در يك خط خلاصه كرد و همان موقع كه يك reference مي سازيم همان موقع هم با يك object جديد مقدار دهي نمائيم:


کد:
Person p = new Person();p.Name = "Ali";p.Age = 20;
به شكل زير دقت كنين:


http://www.tabatabaei.info/csharpsamples/objectinitilization.GIF

اين در واقع اتفاقي است كه با توجه به خط بالا مي افتد , يعني يك متغيير در حافظه Stack و يك شيء در حافظه Heap. اما با استفاده reference كه داريم (p) مي توانيم مقادير object مورد نظرمون رو ست كنيم و ...
دقت داشته باشين كه وقتي شما از كلمه new و سپس اسم كلاس با استفاده از پرانتز استفاده مي كنين, در واقع يك شيء جديد در حافظه ساخته مي شود و اگر اين شيء رو به يك متغيير مثل p كه قبلا ساخته شده بود مقدار دهي كنين يك رابطه جديد و در نتيجه مقاديرتان را از دست خواهيد داد:
کد:
کد:
Person x = new Person();x.Name = "Reza";x.Age = 44;x = new Person();Console.WriteLine(x.Age); // خروجي اين خط صفر خواهد بودx.Name = "Ali";
شكل زير اتفاقاتي كه در خطوط با مي افتد را تفسير مي نمايد:



http://www.tabatabaei.info/csharpsamples/GarbageCollection.GIF


دقت نمائيد كه objectي كه مقادير Reza و 44 را داشته است توسط Garbage Collection به دلايلي كه قبلا هم توضيح داديم (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fcsha rptuning.blogfa.com%252Fpost-4.aspx) از حافظه حذف خواهد شد.

حالا با توجه به مثال هايي كه صحبت شد به نظر شما خروجي خطوط زير چه خواهد بود؟



کد:
Person myPerson = new Person();myPerson.Name = "Masoud";myPerson.Age = 33;Person yourPerson = myPerson;yourPerson.Name = "Amir";yourPerson.Age = 23;

Console.WriteLine("myPerson Info: Name:{0}, Age:{1}",myPerson.Name,myPerson.Age);Console.Write Line("yourPerson Info: Name:{0}, Age:{1}",yourPerson.Name,yourPerson.Age);

خروجي كه اين چند خط كد دارند بايد به شكل زير باشد:




کد:
myPerson Info: Amir, Age: 23yourPerson Info: Amir, Age : 23

P a R y A
09-19-2010, 03:29 PM
http://forum.irantrack.com/images/icons/icon1.gif


كپي در سي شارپ

اجازه بدين كمي بيشتر در مورد اين خط كد توضيح بديم:


کد:
Person yourPerson = myPerson;
در حقيقت در كدي كه نوشته شده يك كپي از يك شيء به نام myPerson ايجاد شده و نام آن را yourPerson نهاده ايم. دقت كنين كه در سي شارپ رفتار پيش فرض كپي از اشياء reference copy است. همانطور كه در آخرين تصوير پست قبلي (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fwww. tabatabaei.info%252Fcsharpsamples%252Freferencecop y.GIF) ديديم , وقتي من از myPerson يك Reference copy تهيه مي كنم در حقيقت فقط آدرس حافظه myPerson رو در متغيير yourPerson قرار مي دهم و نه خود شيء را. البته اين يك نوع از انواع كپي ها (نوع پيشفرض) مي باشد در پست هاي آينده در مورد انواع كپي صحبت خواهيم كرد.

Place Holders



کد:
Person p = new Person();p.Name = "Ali";p.Age = 20;Console.WriteLine("MyName is {0} and I 'm {1} years old.",p.Name,p.Age);
اگر به كدي كه در خط بالا نوشته ايم دقت كنين يك سري عدد داخل متن رشته اي كه در متد WriteLine استفاده شده است مي بينيند. اعداد در داخل دو علامت {} قرار گرفته اند و از 0 تا n مي باشند. در واقع اين اعداد جاينگهدار (PlaceHolder)هايي هستند كه بايد با مقادير متغيير هايي كه به ترتيب بعد از متن رشته اي قرار مي گيرند جايگزين شوند. در واقع خروجي كد بالا متن زير خواهد بود. كه متغيير p.Name يا همان "Ali" جايگزين {0} شده و مقدار متغيير p.Age كه 20 بود نيز جايگزين {1} شده است.


کد:
MyName is Ali and I 'm 20 years old.
متد ها در سي شارپ - Methods in CSharp
همانطور كه در ابتداي صحبتمان در مورد كلاس ها صحبت كرديم در واقع رفتار هاي كلاس ها (يا همان اشياء شان) از طريق متد ها پياده سازي مي گردد. به اين معني كه اگر كلاس Person توانمندي چاپ اطلاعاتش را نياز داشته باشد بايد يك متد براي اين كار ايجاد كند.
براي ايجاد يك متد در سي شارپ كافي است از Syntax زير استفاده كنيم:


کد:
AccessModifier returnType MethodName([parameter type parameter name]){}
در مورد Access Modifier ها در پست هاي بعدي به تفضيل صحبت خواهيم كرد اما فعلا ما از public يا همان عمومي استفاده خواهيم كرد.

در صورتيكه متد شما بايد مقدار برگرداند (شبيه function ها در vb) بايد جنس متغيير خروجي را مشخص كنيم. مثلا اگر متد شما دو عدد رو با هم جمع مي زند و يك حاصل رو در غالب يك عدد بر مي گرداند نوع آن را int تعريف مي كنيم. اگر متد شما خروجي ندارد و فقط يك سري كار را انجام مي دهد (subroutine ها در vb) نوع خروجي آن را void تعريف مي كنيم.

MethodName كه اسم متد مورد نظر شماست.

در صورتيكه متد شما داراي ورودي (parameter) است كافيه كه به ترتيب نوع داده اي پارامتر و سپس نام آن را تايپ مي كنيم. اگر تعداد پارامتر ها بيش از يكي است از , براي جدا كردن آن ها استفاده مي كنيم.

دقت كنين كه هر متد داراي يك block of code براي خودش مي باشد. پس حتما {} رو قرار مي دهيم و كد هايي كه نياز داريم را ما بين اين دو علامت مي نويسيم.

! محل قرار گيري متد ها در block of code كلاس هاست.
حالا به متد ShowInfo كه براي نمايش اطلاعات اشخاص در داخل كلاس Person مي نويسم دقت كنين:


کد:
public void ShowInfo(){Console.WriteLine("Name: {0},Age: {1}",Name,Age);}
براي استفاده از متد ها هم كافيه كه بعد از اسم شيء (object) نام متد را به همراه پرانتز استفاده كنيم. دقت كنين كه اگر متد شما داراي ورودي است مقادير ورودي داخل پرانتز قرار مي گيرد.


کد:
Person p = new Person();p.Name = "ali";p.age = 20;p.ShowInfo();
يك مثال هم از متدي كه دو عدد را گرفته و حاصل جمعشان را بر ميگرداند:


کد:
publc class Calc{public int Add(int num1,int num2){return num1 + num2;}}
و استفاده از آن:



کد:
Calc c= new Calc();int result = c.Add(10,50);Console.WriteLine("Result of {0} + {1} is: {2}",10,50,result);
در مورد متد ها در پست هاي بعدي بيشتر صحبت خواهيم كرد.

P a R y A
09-19-2010, 03:30 PM
http://forum.irantrack.com/images/icons/icon1.gif


توي آخرين پست در مورد متد ها صحبت كرديم اما اگر دقت كرده بوديد متوجه مي شديد كه ما تا اينجا از يك متد استفاده كرده ايم كه ننوشته ايم! به كد زير دقت كنين:



کد:
Person p = new Person();
همانطور كه قبلا هم گفتم (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fcsha rptuning.blogfa.com%252Fpost-13.aspx) براي استفاده از متد ها كافيه اسم متد رو با استفاده از () بنويسيم. كد بالا نيز اسم يك متد به نام ()Person ذكر شده است:


سازنده ها در سي شارپ - Constructors in CSharp
سازنده (Constructor) متدي است هم نام با كلاس كه چه بنويسيم (تايپ كنيم) و چه ننويسيم بر روي كلاس ها وجود دارد. همانطور كه قبلا هم ديديد من براي كلاس Person متدي هم نام با كلاس ننوشتم اما مي توانستم از اين متد در كنار كلمه new استفاده كنيم. كلمه new فقط براي ايجاد كردن يك شيء در حافظه در كنار نام متد استفاده مي شود. پس دقت داشته باشين كه وقتي ما يك reference copy از يك شيء تهيه ميكنيم در واقع فقط يك كپي از آدرس حافظه همان شيء را داريم (مثل 2 ريموت كنترل به يك تلويزويون) , اما وقتي از new به همراه اسم متد استفاده مي كنيم يك شيء جديد در حافظه داريم.

سازنده پيشفرض - Default Constructor
سازنده پيش فرض يا همان Default Constructor متدي است هم نام با كلاس كه پارامتر ورودي ندارد و شما به صورت پيش فرض يك ورژن از سازنده ها رو در كلاستان دارين. به اين معني كه حتي وقتي كلاس شما داراي هيچ عضوي نيست (مثل اين كلاس Emp ) باز داراي يك متد سازنده يا همان Constructor مي باشد. البته اين به اين معني نيست كه شما نمي توانيد سازنده ها را تايپ كنين:
[code]
public class Emp
{

}

public class Student
{
public Student()
{
// default constructor
}
}
[code]

در هر دو كلاس بالا شما داراي default constructor مي باشد پس مي توانين كه كد هاي زير را تايپ كنين:



کد:
Emp e = new Emp();Student st = new Student();
نكته بسيار مهم استفاده است كه شما مي توانين از Constructor ها داشته باشيد. دقت كنين كه وقتي شما كدي را داخل block of code يك سازنده از يك كلاس مي نويسيد مادامي كه از اين كلاس شيء جديد ساخته مي شود كدي كه داخل constructor نوشته شده نيز اجرا خواهد شد در نتيجه شما با استفاده از سازنده ها اين توانمندي را خواهيد داشت كه در زمان ساخته شده هر شيء كد مورد نظرتان را اجراء نمائيد.

فرض كنين كه من مي خواهم هر زماني كه يك object از كلاس Emp ساخته شد يك جمله در محيط كنسول چاپ شود كه يك object جديد ساخته شد. پس:


کد:
public class Emp{public Emp(){Console.WriteLine("New Emp Object Created ...");}}
Constructor Overloading
در سي شارپ شما اين امكان را داريد كه ورژن هاي متفاوتي از يك متد را داشته باشين. از آنجايي كه سازنده ها هم به نوعي متد محسوب مي شوند شما مي توانيد ورژن هاي متفاوتي از سازنده ها را داشته باشين. براي مثال در نظر بگيرين كه من مي خواهم يك ورژن از سازنده براي كلاس Person بنويسم كه وقتي از اين كلاس شيء ايجاد مي شود حتما نام و سن فرد ذكر شود. پس براي اينكار سازنده اي تعريف مي كنم كه داراي دو ورودي , يكي از جنس رشته اي (براي نام) و ديگري از جنس عددي (براي سن) داشته باشد:



کد:
public class Person{public Person(string name, int Age){Name = name;Age = age;}public int Age;public string Name;}
! دقت داشته باشين كه وقتي شما يك ورژن ديگر از سازنده را مي نويسن (ورژني به غير از سازنده پيش فرض) در حالتيكه سازنده پيش فرض را تايپ نكنين ديگر امكان استفاده از سازنده پيش فرض را نداريد.

به همين دليل در صورتيكه شما كد بالا را بنويسين ديگر امكان استفاده از سازنده پيش فرض كلاس Person وجود نخواهد داشت و اين به اين معني است كه شما به برنامه نويس اجبار خواهيد كرد كه حتما موقع ساختن شيء از كلاس شما نام و سن شيء را مشخص كند.




کد:
//You will get compile time error if you uncomment the next line//Person p = new Person();Person p =new Person("Ali",20);
در صورتيكه امكان ايجاد كردن شيء از اين كلاس بدون مشخص كردن نام و سن را نياز داريد مي توانين سازنده پيش فرض را نيز تايپ نمائيد.

نقش هاي يك برنامه نويس - Programmer 's Role
1. Class Programmer
2. Class Creator
هر برنامه نويس در حين نوشتن كد مي تواند دو نقش داشته باشد و بسيار مهم است كه نقش خود را در هر لحظه بتواند تشخيص دهد.
فرض كنين كه شما در حال نوشتن كلاس Emp هستين :



کد:
public class Emp{...
در اين حالت شما يك Class Creator مي باشيد. به اين معني كه شما يك كلاس را ايجاد مي كنين فرقي نمي كند كه شما از اين كلاس استفاده كنين يا كس ديگري.

در حالتي كه شما در كلاس Programm هستيد و داخل متد Main از كلاس Empاستفاده مي كنين شما يك Class Programm براي كلاس Emp هستيد يعني از اين كلاس استفاده مي كنين. دقت كنين كه در همين لحظه شما براي كلاس Programm يك Class Creator مي باشين.
درك كردن اين نقش ها به شما كمك خواهد كرد كه ديد بهتري نسبت به توليد كلاس ها داشته باشين و متوجه باشين كه چه چيزي رو در اختيار چه نقشي قرار مي دهيد.

P a R y A
09-19-2010, 03:30 PM
حالا كه در مورد Constrcutor ها و Method ها صحبت كرديم مي تونيم بگيم كه تا حدودي كلاس ها رو شناختيم و حالا مي تونيم ادامه مطالبمون در رابطه با Value Type ها رو پيش ببريم:


Structures in CSharp
Structure ها نوع هاي داده اي هستند شبيه به كلاس ها به اين معنا كه مي توانند Field و Method و Constructor داشته باشند و حتي در بعضي از موارد به خاطر نوع رفتاري كه Value Type ها دارند به جاي كلاس ها استفاده شوند. براي تعريف يك Structure كافيست در جايي از namespace با استفاده از keyword ي كه به همين منظور ايجاد شده است يعني struct شروع به ايجادش نمائيم:



کد:
public struct Teacher{public int Age;public string Name;public void Print(){Console.WriteLine("Name: {0}, Age: {1}",Name, Age);}}
همانطور كه مي بينيم ساختار ظاهري Struct ها كاملا شبيه به كلاس است اما تفاوت اصلي آن ها در رفتارهايشان مي باشد.

در تعريف رفتار هاي كلاس گفتيم (http://forum.irantrack.com/redirector.php?url=http%3A%2F%2Fforum.parsigold.co m%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fcsha rptuning.blogfa.com%252Fpost-12.aspx) وقتي شما يك شيء از نوع يك كلاس مثل Person ايجاد مي كنين و بعد از آن شيء كپي تهيه مي كنين فقط آدرس حافظه شيء قبلي به شيء جديد اختصاص يافته و در حقيقت شما فقط يك شيء داريد.
اما در مورد Struct ها جريان كاملا شبيه به كپي گرفتن از تايپ هاي بدوي (Primitive Types) ها مي باشد. به چند خط كد زير دقت كنين:



کد:
Teacher t = new Teacher();t.Name = "Ali";t.Age = 44;Teacher t2 = t;t2.Name = "Reza";t.Print();t2.Print();
به نظر شما خروجي اين چند خط كد چيست؟
به اشكال زير دقت كنين:

http://www.tabatabaei.info/csharpsamples/Struct-CSharp.GIF




http://www.tabatabaei.info/csharpsamples/Struct-CSharp2.GIF

نكته بسيار مهم در شكل اول اينست كه اصولا به خاطر Value Type بودن Struct ها هيچ شيء اي در حافظه Heap ايجاد نشده است و فقط دو متغيير در حافظه Stack ايجاد شده است. نكته مهم دوم اينه كه وقتي شما از يك متغيير از نوع Struct كپي مي گيرين تمامي مقادير موجود در آن Struct كپي شده و در متغيير جديد يك كپي از آن مقادير قرار خواهد گرفت. پس در نتيجه تغييراتي كه ما در متغيير دوم يعني t2 داديم برروي متغيير اول يا همان t تاثيري نخواهد داشت.


Constructors in Structures - سازنده ها در ساختار ها

نكته مهم ديگري كه مي توان در مورد Struct ها بيان كرد در مورد سازنده ها در اين جنس است. در پست قبلي در مورد ايجاد سازنده ها در كلاس ها صحبت كرديم و گفتم كه شما مي توانين ورژن هاي مختلفي از سازنده ها را در يك كلاس داشته باشين. اما بايد بگويم كه در مورد Struct ها جريان كمي متفاوت خواهد بود.
نكته اول: شما سازنده پيشفرض را در Struct ها دارين اما امكان تايپ كردن آن را به صورت دستي ندارين. به اين معني كه اگر شما يك Constructor بدون پارامتر در يك Struct تعريف كنين به Compile Time Error بر خورد خواهيد كرد و در حقيقت شما نمي تونين هيچ تغييري در رفتار سازنده پيشفرض Struct ها ايجاد كنين. بايد بدونين كه سازنده پيش فرض در Structureها در حقيقت يك object ايجاد نمي كند بلكه به تمامي متغييرهايي كه داخل Struct شما وجود دارند مقدار پيش فرض را Set مي كند.
Teacher t = new Teacher();
در نتيجه كد بالا فيلد Age مقدار 0 و فيلد Name مقدار "" را كه مقادير پيشفرض int و String هستند را خواهند گرفت.
نكته دوم: در تمامي ورژن هاي سازنده ها بايد تمامي متغيير هاي Struct شما مقدار دهي شوند. در غير اينصورت بازهم Compile Time Error خواهين داشت.
در نتيجه Struct شما مي تواند به اين شكل باشد:




کد:
public struct Teacher{public int Age;public string Name;public void Print(){Console.WriteLine("Name: {0},Age: {1}",Name,Age);}public Teacher(int age, string Name){Name = name;Age = age;}public Teacher(int age){Age = age;Name = "";}}

P a R y A
09-19-2010, 03:35 PM
http://forum.irantrack.com/images/icons/icon1.gif


خوب البته صحبت ما در مورد Structure ها هنوز تمام نشده اما اجازه بدين ادامه مطلب رو بعد از اينكه كلاس ها رو بيشتر بررسي كرديم داشته باشيم.

نوع هاي در سي شارپ - Reference Type in CSharp
مهم ترين نوع داده اي Reference Type در سي شارپ همان Class يا كلاس ها مي باشند كه تا حدودي در موردشان صحبت كرديم. اما يك نوع داده اي ديگر به نام object وجود دارد كه بايد در موردش صحبت كنيم.

اصولا object خود نيز يك كلاس است اما به جهت اهميتي كه دارد من آن را به صورت جدا از بقيه كلاس ها بررسي مي نمايم. همانطور كه قبلا هم گفتم سي شارپ يك زبان Object Oreinted يا همان شيء گراست و تمامي مفاهيم شيء گرايي در اين زبان رعايت مي شود. يكي از مهمترين مفاهيم شيء گرايي مفهوم Inheritance يا همان توارث مي باشد. توارث در حقيقت به معني به ارث رفتن خصوصيات يك موجود از موجود ديگر مي باشد. و نكته اي كه Inheritance رو به object ربط مي دهد اين است كه object به عنوان base class تمامي كلاس هاي موجود در دات نت فريم ورك مي باشد. به اين معني كه تمامي كلاس هايي كه در دات نت فريم ورك و كلاس هايي كه شما مي نويسيد, همه و همه از كلاس object به ارث رفته اند.

وقتي يك كلاس از يك كلاس ديگر به ارث مي رود تمامي خصوصيات عمومي آن نيز به آن كلاس به ارث مي رود. مثلا اگر من كلاسي به نام Person داشته باشم كه داراي اطلاعات Name و Age و متد Print باشد وقتي كه كلاس Student را از كلاس Person به ارث مي برم خصوصيات عمومي كلاس Person در كلاس Student نيز قابل استفاده مي باشد.

به مثال زير دقت كنيد:



کد:
public class Test{}
با توجه به كدي كه بالا نوشته شده است در اين كلاس هيج موجودي (اعم از Field يا Method و يا ...) وجود ندارد اما اگر از اين كلاس يك شيء بسازيم متوجه مي شويم كه در اين كلاس يك سري متد وجود دارد:



http://www.tabatabaei.info/csharpsamples/personclass.gif


نكته قابل تامل اينجاست كه اين چهار متد (ToString(), GetHashCode(), GetType(),Equal) همگي در تمام كلاس هايي كه در دات نت يافت مي شود وجود دارد. پس مي توان نتيجه گرفت كه اين متد ها از كلاس object به همه كلاس ها به ارث مي رسند.

P a R y A
09-19-2010, 03:36 PM
http://forum.irantrack.com/images/icons/icon1.gif


رشته ها در سي شارپ - String in CSharp
نوع داده اي رشته اي نيز يكي از مهم ترين نوع هاي داده ايست كه در اين گروه قرار مي گيرد(Reference Types). براي ايجاد يك متغيير از نوع داده اي رشته اي مي توانيم از نمونه كد زير استفاده كنيم:
کد:
string myName = "Ali";
همانطور كه در كد بالا مشاهده مي كنيد براي مقدار دهي يك متغيير از نوع داده اي رشته اي كافيست مقدار مورد نظرمان را داخل دو علامت "" قرار داده و با استفاده از = مقدار دهي را انجام دهيم.



کد:
myName += "Reza";
با توجه به كد بالا مقدار myName با استفاده از operation += كه در حقيقت مقدار قبلي را + مقدار جديد كرده و مقدار دهي مي نمايد از Ali به AliReza تغيير يافت. البته شما مي توانستيد اين كد را به صورت زير نيست بنويسيد:



کد:
myName = myName + "Reza";
البته دليل ذكر مثال با روش استفاده از =+ نيست بلكه مي خواهم در مورد رفتار كلاس string كمي توضيح دهم.

در حقيقت كلاس string يك كلاس از نوع Reference Type هاست اما به دليل استفاده بسيار زيادش در زبان هاي برنامه نويسي مايكروسافت روش استفاده از آن را با استفاده keyword ي با همان نام و با حروف كوچك يعني string آسانتر و به روش value type ها نموده است. به عبارت ديگر وقتي شما مي نويسيد:



کد:
string myName = "ali";
در واقع كامپايلر يك شيء از نوع string در حافظه Heap براي شما ايجاد مي كند:



http://www.tabatabaei.info/csharpsamples/String-CSharp.GIF


و وقتي مقدار قبلي را با مقدار جديد "Reza" جمع مي كنين يك شيء كاملا جديد در حافظه ايجاد مي شود. و شيء قبلي توسط Garbage Colletion از حافظه پاك خواهد شد.



http://www.tabatabaei.info/csharpsamples/String-CSharp2.GIF



با توجه به نكته بالا اگر در شرايطي نياز داشتيد تا يك متن را مرتبا تغيير دهيد بهترين روش استفاده از string ها نخواهد بود. چرا كه هر چه تعداد دفعات تغيير متن شما بيشتر باشد به همان ميزان تعداد object هاي ساخته شده در حافظه Heap نيز زياد خواهد شد (البته كه Garbage Collection آن ها را حذف خواهد كرد) اما بهتر از كلاس ديگري به نام StringBuilder براي اين موضوع استفاده شود. تا به بهترين نحو از حافظه سيستم استفاده كنيم. كلاس StringBuilder در namespace System.Text قرار گرفته است و براي استفاده از آن بايد يك شيء از آن بسازيم:



کد:
StringBuilder st = new StringBuilder();
و بعد مي توانيم با استفاده از متد Append متن مورد نظرمان را به آن اضافه كنيم:



کد:
st.Append("Ali");st.Append("Reza");
و در نهايت با استفاده از متد ()ToString نتيجه را در غالب يك String در اختيار بگيريم:



کد:
string Name = st.ToString();
رفتار StringBuilder برخلاف رفتار String مي باشد و به اين ترتيب خواهد بود كه در ابتدا مثلا 16 بايت حافظه براي خودش در نظر خواهد گرفت. وقتي نصف اين 16 بايت پر شده (با استفاده از دستور Append - يعني 8 بايت) آنوقت خودش به صورت اتوماتيك يك شيء جديد خ با دو برابر اندازه فعلي در حافظه خواهد ساخت (يعني 32 بايت) سپس مقادير قبلي را داخل اين شيء جديد كپي مي گيرد. و باز وقتي نصف اين 32 بايت پر شد به همين ترتيب عمل خواهد كرد. نتيجتا به صورت تساعدي اين مقدار حافظه بيشتر مي شود و در نتيجه تعداد اشيايي كه در حافظه ساخته مي شوند كمتر و كمتر خواهد بود و در نتيجه سرعت عملكرد آن به مراتب سريعتر خواهد بود.

متد ()ToString
! دقت داشته باشين كه متد ToString از كلاس object به تمامي كلاس هاي دات نت به ارث مي رسد. در نتيجه ميتوانيد از اين متد هر جا كه به شكل رشته اي يك شيء نياز داشتين استفاده كنين:



کد:
int i = 12;int j = 32;string myResult = (i * j).ToString();
البته دقت كنين كه هميشه اون چيزي انتظار دارين رو به شما بر نخواهد گرداند:به عنوان مثال وقتي از شيء اي از كلاس Person را ToString كنيم (يا هر كلاسي كه شما ايجاد كرده باشيد) به صورت پيشفرض خروجي ToString آن اسم كامل (Qualified Name) آن خواهد بود:



کد:
Person p = new Person();p.Name = "Ali";p.Age = 20;Console.WriteLine(p.ToString());
يعني اگر كلاس Person من در اين مثال داخل namespaceي به نام ConsoleApplication12 باشد خروجي اين مثال ConsoleApplication12.Person خواهد بود.

P a R y A
09-19-2010, 03:36 PM
http://forum.irantrack.com/images/icons/icon1.gif


آرايه ها در سي شارپ - Arrays in CSharp
مسلما به مانند بيشتر زبان هاي برنامه نويسي استفاده از آرايه ها در سي شارپ نيز مرسوم است. استفاده از آرايه ها براي نگهداري چندين مقدار از يك نوع داده اي استفاده مي شود.

آرايه ها را مي توان از يك ديدگاه به سه دسته تقسيم كرد:
1. آرايه هاي تك بعدي - Simple Arrays
2. آرايه هاي مستطيلي - Rectangular Arrays
3. آرايه هاي نامنتظم - Jagged Arrays

براي تعريف يك آرايه تك بعدي در سي شارپ مي توانيد از Syntax زير استفاده كنين:

[code]

numbers = new int[3];
numbers[0] = 100;
numbers[1] =400;
numbers[2] = 500;
[code]

همانطور كه مي بينين در كد بالا من يك آرايه از اعداد ايجاد كردم كه داراي سه خانه مي باشد. براي دسترسي به هر كدام از خانه هاي اين آرايه بعد از نام متغييرم از [] استفاده مي كنم و بين اين دو علامت از يك عدد (indexer) كه از صفر تا n مي باشد. دقت كنين كه هميشه n يكي كمتر از طول آرايه شماست.
البته به غير از كدي كه بالا نوشته شده است من مي توانم از هر يك از روش هاي زير نيز براي ايجاد آرايه هاي استفاده كنم:



کد:
int[] numbers = new int[]{100,400,500};
در روش بالا بدون ذكر طول آرايه با مقدار دهي مستقيم آن به وسيله مقاديري كه بين دو علامت {} قرار مي گيرند طول آن را مشخص مي نمائيم.
اين هم يك نمونه ديگر از ايجاد آرايه ها:



کد:
int numbers = {100,400,500};
نكته قابل تامل در مورد آرايه ها اين است كه اين نوع هاي داده اي در دسته Reference Type ها قرار مي گيرند و اصولا مقادير آن ها در حافظه Heap نگهداري مي شود:



http://www.tabatabaei.info/csharpsamples/Arrays%20in%20CSharp.GIF

حالا اگر من يك آرايه از يك كلاس مثلا Person داشته باشم به نظر شما شكل حافظه اين آرايه من چگونه خواهد بود؟ به كد زير دقت كنين و سعي كنين كه شكل حافظه آن را رسم نمائيد:



کد:
Person[] personList = new Person[3];
دقت كنين كه حتما تمامي خانه هاي اين آرايه من بايد قبل از اينكه مورد استفاده بگيرند مقدار دهي شوند:



کد:
personList[0] = new Person("Ali",24);personList[1] = new Person("Reza",35);personList[2] = new Person("John",44);
كه در نتيجه خطوط با شكل حافظه ما به اين ترتيب خواهد بود:


http://www.tabatabaei.info/csharpsamples/Arrays%20in%20CSharp%20Ref.GIF


نكته بسيار مهم ديگر اين است كه ساختار آرايه ها به نحوي است كه طول آن ها ثابت مي باشد و در صورتيكه شما بخواهيد طول آن را تغيير دهيد مثلا از 3 خانه به 5 خانه ارتقاء دهيد بايد يكبار ديگر آن را new كنيد و در نتيجه اين new كردن شما اطلاعات قبلي خود را از دست خواهيد داد.



کد:
personList = new Person[5];
و نتيجه كد بالا اين شكل خواهد شد:
http://www.tabatabaei.info/csharpsamples/Arrays%20in%20CSharp%20Ref%20New.GIF

پس دقت داشته باشيد كه در صورتيكه مي خواهيد طول يك آرايه را بيشتر كنين حتما ابتدا يك آرايه جديد ساخته و طول آن را بيشتر در نظر بگيريد و سپس مقادير آرايه قبلي را در آرايه جديد كپي كنين.

ساختار foreach در سي شارپ
شما مي توانيد با استفاده از ساختار foreach در سي شارپ اطلاعات موجود در آرايه هاي خود را خوانده و از آن ها استفاده كنين. در حقيقت foreach يك نوع حلقه است كه بر روي آرايه ها شما انجام مي شود و تعداد دفعات انجام آن برابر است با طول حلقه شما و در هر با حركت يكي از خانه هاي آرايه شما را در اختيارتان قرار مي دهد. از Syntax زير براي ايجاد حلقه foreach استفاده مي نمائيم:



کد:
int[] myNums = new int[4];myNums[0] = 10;myNums[1] = 320;myNums[2] = 150;myNums[3] = 510;
و براي نمايش اطلاعات داخل اين آرايه:



کد:
foreach(int num in myNums)Console.WriteLine(num);

! دقت داشته باشين كه در ساختار foreach شما اجازه تغيير آرايه خود را به هر نحوي نداريد و اگر اين عمل را انجام دهيد به runtime error برخورد خواهيد كرد.

آرايه هاي مستطيلي در سي شارپ - Rectangular Arrays in CSharp
براي ايجاد يك آرايه مستطيلي از Syntax زير استفاده كنين:



کد:
int[,] myMatrix = new int[10,10];
با توجه به كد بالا شما داراي يك ماتريكس 10 در 10 هستيد و براي استفاده از هر خانه از اين آرايه به index هاي x , y آن احتياج دارين:



کد:
myMatrix[0,0] = 0;myMatrix[0,1] = 100;
و ....

آرايه هاي نامنتظم - Jagged Arrays
اين آرايه ها را مي توان با استفاده از كد زير توليد كرد:



کد:
int[][] jaggedArray = new int[3][];
دقت داشته باشين كه در خط اول فقط طول يك بعد از آرايه را مشخص كرديم ==> 3



کد:
jaggedArray[0] = new int[3];jaggedArray[1] = new int[2];jaggedArray[2] = new int[4];
و در نتيجه اين خطوط شما يك آرايه به مانند تصوير زير خواهيد داشت:


http://www.tabatabaei.info/csharpsamples/Jagged%20Arrays%20In%20Csharp.GIF


استفاده از ArrayList در سي شارپ - ArrayList in Csharp
به خاطر ساختار آرايه ها در سي شارپ وقتي شما نياز به آرايه اي دارين كه طول آن نا مشخص است مي توانين از يك كلاس به نام ArrayList كه در namespaceي به نام System.Collection قرار دارد استفاده كنين.



کد:
ArrayList arList = new ArrayList();arList.Add(10);arList.Add(20);arList.A dd(40);foreach(int i in arList)Console.WriteLine(i);
ساختار ArrayList به نحوي است كه با شروع استفاده از آن يك طول مشخصي (مثلا 4) را براي خود اختصاص مي دهد. سپس وقتي شما 2 تا از اين خانه ها را با استفاده از متد Add پر كنين , طول آرايه داخلي خود را به دو برابر افزايش مي دهد و مقادير قبلي را داخل آرايه جديدش كپي ميكند و اين عمل را به صورت تصاعدي ادامه مي دهد كه در نتيجه اين عمل هم سرعت و كارايي خوبي دارد و هم طولش قابل تغيير است

P a R y A
09-19-2010, 03:37 PM
http://forum.irantrack.com/images/icons/icon1.gif


در سي شارپ
از يك ديدگاه مي توان متغيير ها را در سي شارپ به دو دسته تقسيم كرد:


Class Variable
Instance Variable
تا اينجا ما چند تا مثال از نوع دوم داشتين. متغيير هايي كه بايد از طريق اشياءشان دسترسي داشت:




کد:
Person p = new Person();p.Name = "Ali";p.Age = 20;
همانطور كه مي بينين براي دسترسي به Name و Age بايد حتما از كلاس Person يك شيء بسازيم و از طريق شيء به متغيير ها دسترسي داشته باشيم.


اما فرض بفرمائيد كه روي مفهومي مثل انسان (همان كلاس Person) مي خواهيم "جمعيت" رو پياده كنيم. به نظر شما من مي تونم رو اين فرد ("Ali") مفهوم جمعيت رو پياده كنم؟ آيا اصلا اين منطقي است؟ مثل بگويم علي چند نفر است؟

به نظر مي رسد كه تعريف مفهوم (متغيير) جمعيت يا تعداد روي يك فرد غير منطقي باشد و اصولا جمعيت مربوط به كل انسان هاست نه فقط يك نفر!


براي همين ما بايد از نوع اول متغيير ها استفاده كنيم كه به آنها Class Variable مي گوييم براي ايجاد يك Class Variable بايد از كلمه Static در تعريف متغييرمان استفاده كنيم:




کد:
public class Person{public static int Count;public string Name;public int Age;}
حالا اگر بخواهم جمعيت رو مقدار دهي كنم يا اينكه مقدار جمعيت رو بخوانم بايد ابتدا نام كلاس و سپس نام متغييرم رو بنويسم:




کد:
Person.Count = 1000;
حالا همين شرايط رو براي متد ها نيز در نظر داشته بگيريد. فرض كنين كه من مي خواهم متدي داشته باشم كه جمعيت را برايم چاپ كند. آيا در تعريف اين متد بايد كلمه static به كار گرفته شود؟ مسلما بله! چون من مي خواهم رفتاري را نشان دهم كه مربوط به كل Concept ما يا همان كلاس ماست نه مربوط به يك شيء خاص. براي همين متد PrintCount رو به صورت زير تعريف مي كنم:



کد:
public static void PrintCount(){Console.WriteLine("Count:{0}",Count); }
! فراموش نكنيد كه شما در متد هاي Static مجاز به استفاده از متغيير هاي غير static نمي باشيد.
وقتي مي خواهيم از يك متد Static استفاده كنيم كافيست كه اسم متد رو بعد از اسم كلاس بياوريم:



کد:
Person.PrintCount();
حالا با توجه به پست هايي كه تا امروز داشتيم, مي تونين 2 تا از متد هاي Staticي كه استفاده كرديم رو نام ببرين؟


كلاس هاي Static

مفهوم كلمه Static بر روي تعريف كلاس ها به اين معني است كه وقتي شما يك كلاس Static دارين تمامي Memberهاي اين كلاس بايد به صورت static تعريف شوند و اينكه شما نمي توانيد از اين كلاس objectبسازيد و البته اصولا احتياجي به اين كار هم ندارين.

Open-Source
09-19-2010, 07:20 PM
بهتر نیست که یه بخش به اسم .Net به انجمن اضافه کنیم.