آموزش سي شارپ - قسمت سيزدهم

رشته ها در سي شارپ - 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 براي شما ايجاد مي كند:



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



با توجه به نكته بالا اگر در شرايطي نياز داشتيد تا يك متن را مرتبا تغيير دهيد بهترين روش استفاده از 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 خواهد بود.
 
ادامه دارد...

آموزش سي شارپ - قسمت دوازدهم

خوب البته صحبت ما در مورد 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 و يا ...) وجود ندارد اما اگر از اين كلاس يك شيء بسازيم متوجه مي شويم كه در اين كلاس يك سري متد وجود دارد:



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

اين كه هر كدام از اين متد ها چه كاري انجام مي دهند را بعد ها بيشتر توضيح خواهم داد.