تبليغاتX
جادوي سي شارپ
این سومین قسمت آموزشی سی شارپ مقدماتی است و ارسال این پست مصادف شده با تولد من. امیدوارم زمان اجازه بده که بتونم بیشتر از این در سال جدید موثر واقع بشم.


در سی شارپ چهار نوع حلقه وجود دارد که بر اساس نیاز می توان از یکی از آنها استفاده نمود. این حلقه ها عبارتند از: while, do-while, for, foreach
while: این حلقه بسیار ساده است و تا زمانی که شرط حلقه برقرار باشد، دستورات داخل حلقه اجرا می شوند.

i = 0;
while ( i < 100)
   {
   x = x + i++;
   }

do-while:این حلقه نیز مانند حلقه while می باشد با این تفاوت که حلقه while می تواند اصلا اجرا نشود اما حلقه do-while حداقل یکبار اجرا می شود

i = 0;
do {
   x += i++;
}
while (i < 100);

for:این حلقه یک حلقه ساخت یافته و دارای سه قسمت است: قسمت مقداردهی اولیه، شرط و عملگر تغییر شمارنده حلقه. این سه قسمت توسط ";" از یکدیگر جدا می شوند

for (i = 0; //initialize i to 0
     i < 100 ; //continue as long as i < 100
     i++) //increment i after every pass

در حلقه بالا شمارنده حلقه از عدد صفر شروع می شود. در هر مرجله از اجرا شمارنده i با عدد 100 مقایسه می شود و پس از بررسی اگر i کوچکتر از 100 باشد بدنه حلقه اجرا می شود سپس به i مقدار 1 اضافه می شود و ...

تعریف متغیر در حلقه:
در صورت نیاز به تعریف متغیر می تونید شمارنده حلقه را در زمان تعریف حلقه تعریف کنید. در این حالت شمارنده حلقه تعریف شده فقط در همان حلقه قابل دسترسی است. به مثال زیر توجه کنید:

for (int i =0; i< 5; i++) {
   x[i] = i;
}
System.Console.WriteLine("i=" + i.ToString());

استفاده از شمارنده حلقه، خارج از بدنه حلقه ای که متغیر در آن تعریف شده باشد باعث تولید خطا خواهد شد. پس اجرای خط آخر مثال فوق باعث تولید خطا خواهد شد.

استفاده از کاما "," در تعریف حلقه:
با استفاده از کاما می تونید بیش از یک شمارنده حلقه در تعریف حلقه داشته باشید. علاوه بر این شما می تونید در بخش عملگر نیز بیش از یک عملگر را استفاده نمایید:

for (x=0, y= 0, i =0; i < 100; i++, y +=2)
{
   x = i + y;
}

کد فوق را می توان به شکل زیر نیز نوشت:

x = 0;
y = 0;
for ( i = 0; i < 100; i++)
{
   x = i + y;
   y += 2;
}

foreach:در این حلقه شما می تونید عناصر یک مجموعه را دور بزنید. این مجموعه می تونه شما هر نوع عنصری باشد. برای درک بیشتر به مثال زیر توجه کنید:

float[] z = {1.0f, 2.9f, 5.6f};
ArrayList arl = new ArrayList ();
for (int j = 0; j < z.Length ; j++) {
   arl.Add (z[j]);
}
// Sulotion no 1 to access all member of "arl" with for loop
for (j = 0; j < arl.Count ; j++) {
  Console.WriteLine (arl[j]);
}
// Sulotion no 2 to access all member of "arl" with foreach loop
foreach (float a in arl) {
  Console.WriteLine (a);
}

+ نوشته شده در  دوشنبه هجدهم دی 1385ساعت 18:0  توسط کنستانتین  | 

قبل از اینکه برم سراغ مطلب جدید خواستم اینو بگم که VS2005 SP1 اومده و شما می تونید اونو از سایت مایکروسافت دانلود کنید. برای اطلاعات بیشتر و دانلود اون به آدرس زیر برید:

http://msdn.microsoft.com/vstudio/support/vs2005sp1/default.aspx

 

برای دیدن جزییات بیشتر در مورد این Service Pack به آدرس زیر برید:

http://support.microsoft.com/kb/928957

 

حالا بریم سر اصل مطلب:

 

وقتی یک کلاس Generic می سازید ممکنه بخواید محدودیتهایی در انواع داده مورد قبول اون کلاس ایجاد کنید. دو راه برای این کار دارید یا اینکه کلاس شما هر نوع داده ای را قبول کنه و بعد خودتون بر اساس کدهایی که می نویسید تشخیص بدید که نوع داده مجازه یا خیر. راه دوم اینه که قواعدی (Constraints) برای انواع داده مجاز برای کلاسمونو تعیین کنیم.

فرض کنید کلاسی داریم بنام Person با ساختار زیر:

 public class Person

 {

 private string _name="";

 private int _age=0;

 

 public Person(string s,int i)

 {

 _name = s;

 _age = i;

 }

 

 public string Name

 {

 get { return _name; }

 set { _name = value; }

  }

 

 public int Age

 {

 get { return _age; }

 set { _age = value; }

 }

 }

 

حالا می خوایم یک کلاس Generic بسازیم که فقط نوع Person را به عنوان نوع داده ورودی قبول کنه. به این نکته باید توجه کنید که وقتی می گیم فقط کلاس Person منظورمون خود Person است و کلاسهایی که از اون ارث بری دارن.

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

 public class GListClass

 {

 

 }

 

اما برای اینکه اونو محدود به کلاس Person کنیم تعریف کلاس جدیدو به شکل زیر عوض می کنیم:

 

 public class GListClass where T:Person

 {

 

 }

 

 

در اینجا نکته اول اینه که نوع داده شما در کلاس Generic شناخته شدس یعنی وقتی که یک متغیر از نوع T تعریف کنید و بعد Propery های اونو ببینید، Name و Age هم در لیست Property ها وجود دارن.

 

 

 

حالا اگه تو یه جایی از برنامتون یه شی از کلاس GListClass به شکل زیر بسازید در زمان کمپایل از شما Error میگیره:

 

GListClass<int> listClass = new GListClass<int>();

 

علتش اینه که شما نمی تونید نوع داده کلاس GListClass را چیزی بجز Person و یا کلاسهایی که از Person به ارث رسیدن انتخاب کنید ولی کد زیر کاملا صحیح و قابل اجراست:

 

GListClass<Person> listClass = new GListClass<Person>();

 

مقاله بعد احتمالا در مورد پیاده سازی یک Link List با استفاده از Generic Class ها خواهد بود یا شایدم در مورد Generic Method ها!

+ نوشته شده در  یکشنبه دهم دی 1385ساعت 13:47  توسط ققنوس  | 

 آرایه ها : قسمت دوم

سلام . تو این پست میخوام یه مقدار دیگه در مورد آرایه ها توضیح بدم
قبلا گفتیم که سه نوع آرایه داریم: یک بعدی . چند بعدی و دندانه ای (Jagged )
حالا اولین نوع آرایه یعنی آرایه یک بعدی ( Singel-Dimensional Arrays ) : همونطور که گفتیم تعریف آرایه به صورت زیر هست :

int[] array = new int[5];      or
string[] stringArray = new string[6];

اپراتور New برای ساختن آرایه و مقداردهی اولیه به اعضای آرایه به مقادیر پیش فرض براساس نوع آرایه بکار میرود.
شما میتوانید در حین تعریف آرایه نیز به آن مقداردهی کنید که در این صورت نیازی به مشخص کردن تعداد اعضای آرایه نیست . چون با معرفی اعضا تعداد آنها نیز مشخص میشود.

int[] array1 = new int[5] { 1, 3, 5, 7, 9 };   or
string[] weekDays = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

int[] array2 = { 1, 3, 5, 7, 9 };
string[] weekDays2 = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

  میتوانید آرایه را بدون مشخص کردن محدوده آن معرفی کنید . اما در هنگام اختصاص دادن مقادیر به آرایه باید حتما از کلمه New استفاده نمایید:

int[] array3;
array3 = new int[] { 1, 3, 5, 7, 9 }; // OK
//array3 = {1, 3, 5, 7, 9}; // Error

 SomeType[] array4 = new SomeType[10];

نتیجه تعریف یک آرایه به نوع تعریف شده آرایه بستگی دارد که آیا Value type  است یا Refrence Type. به عنوان مثال در بالا اگر SomeTYpe  از نوع Value Type  باشد حاصل این عبارت آرایه ای شامل 10 نمونه از نوع SomeTYpe است. اگر از نوع  Refrence Type  باشد آرایه شامل 10 عنصر خواهد بود که هرکدام به Null ارجاع خواهند داد.

فکر کنم توضیح مختصری در مورد Value Type , Refrence Type ها بد نباشه:

سه گروه type  در #c تعریف شده : Value Type , Refrence Type , Pointer Type

متغیر هایی از نوع Value Type , اطلاعات و داده ها را ذخیره میکنند در حالیکه متغیر های از نوع Refrence مراجع به داده ها و در واقع آدرس محل داده در حافظه را ذخیره میکنند . pointer ها فقط در حالت Unsafe قابل استفاده هستند. امکان تبدیل متغیری از نوع Value  به متغیری از نوع Refrence و برگشت دوباره به Value وجود دارد ( با استفاده از Boxing & Unboxing ) اما برعکس نه!

نوع دوم آرایه ها ,  آرایه های چند بعدی هستند : ( Multidimentional Arrays )

آرایه ها میتوانند بیش از یک بعد داشته باشند مثلا:

int[,] array = new int[4, 2];
int[, ,] array1 = new int[4, 2, 3];

که اولین آرایه ,  مشخص کننده یک آرایه 2بعدی است با 4 سطر و 2 ستون و دومین آرایه یک آرایه 3 بعدی است .
میتوانید مقداردهی آرایه را در همان زما« معرفی آن انجام دهید به صورت زیر :

int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 },{ 7, 8 } };
int[, ,] array3D = new int[,,] { { { 1, 2, 3 } }, { { 4, 5, 6 } } }; or
int[,] array4 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

 و مانند ارایه های یک بعدی , میتوانید آرایه را بدون مشخص کردن محدوده آن معرفی کنید . اما در هنگام اختصاص دادن مقادیر به آرایه باید حتما از کلمه New استفاده نمایید:

 int[,] array5;
array5 = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; // OK
//array5 = {{1,2}, {3,4}, {5,6}, {7,8}}; // Error

مقداردهی به یک عضو از اعضای آرایه نیز به صورت زیر است :

array5[2, 1] = 25;

توضیح آرایه های دندانه ای میمونه برای پست بعدی . موفق باشید .

+ نوشته شده در  شنبه نهم دی 1385ساعت 1:35  توسط آتاناز  |