بعد از اينكه يك كلاس رو ايجاد كرديم بايد بتوانيم از آن كلاس استفاده كنيم. اصولا براي استفاده از يك كلاس مي توانيم از آن كلاس يك شيء بسازيم و سپس به آن شيء اطللاعات ست كنيم و از رفتار هاي آن كلاس استفاده كنيم. همانطور كه قبلا هم گفتم حافظه رو مي توان به دو قسمت 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;

به شكل زير دقت كنين:

اين در واقع اتفاقي است كه با توجه به خط بالا مي افتد , يعني يك متغيير در حافظه 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";

شكل زير اتفاقاتي كه در خطوط با مي افتد را تفسير مي نمايد:



دقت نمائيد كه objectي كه مقادير Reza و 44 را داشته است توسط Garbage Collection به دلايلي كه قبلا هم توضيح داديم از حافظه حذف خواهد شد.

حالا با توجه به مثال هايي كه صحبت شد به نظر شما خروجي خطوط زير چه خواهد بود؟
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.WriteLine("yourPerson Info: Name:{0}, Age:{1}",yourPerson.Name,yourPerson.Age);

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

myPerson Info: Amir, Age: 23

yourPerson Info: Amir, Age : 23

در صورتيكه متوجه دليلش نمي شويد به شكل زير توجه كنين:


Reference كپي در سي شارپ

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

Person yourPerson = myPerson;

در حقيقت در كدي كه نوشته شده يك كپي از يك شيء به نام myPerson ايجاد شده و نام آن را yourPerson نهاده ايم. دقت كنين كه در سي شارپ رفتار پيش فرض كپي از اشياء reference copy است. همانطور كه در آخرين تصوير پست قبلي ديديم , وقتي من از 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);