0

مقدمه ای بر سی شارپ

 
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

مقدمه ای بر سی شارپ

با سلام به راسخونی های عزیز

در این قسمت از تالار برنامه نویسی C# می خواهیم به صورت مقدمه ای این زبان برنامه نویسی جامع و معروف و پرکاربرد را به شما عزیزان یاد بدهیم،پس با ما همراه باشید.

از جلسه بعد شروع می کنیم.

شنبه 17 خرداد 1393  2:08 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت اول

 


طی سلسله مقالاتی می خواهیم با C# بیشتر آشنا شویم. فرض این مقالات بر این است که آشنایی مختصری با زبانهای برنامه نویسی دارید ، هر چند کار ما تقریبا از صفر شروع می شود و هدف آن سادگی هر چه بیشتر است.

C# از دو زبان C++ و Java متولد شده است! حاوی بسیاری از جنبه های C++ می باشد اما ویژگی های شیء گرایی خودش را از جاوا به ارث برده است.

C# اگرچه از C++ گرفته شده است اما یک زبان "خالص" شیء گرا (Object oriented) می باشد. هر دو زبان یاد شده جزو زبانهای هیبرید محسوب می شوند اما طراحان C# این مورد را به اندازه ی C++ مهم تلقی نکرده اند. یک زبان هیبرید اجازه ی برنامه نویسی با شیوه های مختلف را میسر می کند. دلیل اینکه C++ هیبرید است ، این است که قرار بوده تا با زبان C سازگار باشد و همین امر سبب گردیده تا بعضی از جنبه های C++ بسیار پیچیده شوند.

زبان سی شارپ فرض اش بر این است که شما می خواهید تنها برنامه نویسی شیء گرا انجام دهید و همانند C++ مخلوطی از برنامه نویسی رویه ایی (Procedural) و شیء گرا را نمی خواهید به پایان برسانید. بنابراین باید طرز فکر خودتان را با دنیای شیء گرایی تطبیق دهید. در ادامه خواهید دید که در سی شارپ هر چیزی شیء است حتی یک برنامه ی سی شارپ.

برنامه ی اول :

Visual studio.net را اجرا کنید و سپس در صفحه ی ظاهر شده New Project را برگزینید. حالا از گزینه ی Visual C# projects قسمت Console applications را انتخاب نمایید. نامی دلخواه همانند ex01 را وارد نموده و سپس Ok نمایید. کد زیر به صورت خودکار برای شما تولید خواهد شد:

 


using System;

namespace ex01
{
///
/// Summary description for Class1.
///
class Class1
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start application here
//
}
}
}
 


اگر یک سری از مفاهیم آنرا متوجه نمی شوید اصلا مهم نیست! در مقالات آتی تمام این موارد مفصل توضیح داده خواهند شد.
متد استاندارد Main در اینجا قسمتی است که عملیات اصلی برنامه در حالت Console ( شبیه به برنامه های تحت داس اما 32 بیتی ) در آن انجام می شود.
بدون متد Main برنامه های سی شارپ قادر به اجرا نخواهند بود. نوع آن در اینجا void تعریف شده است یعنی این متد خروجی ندارد. حتی اگر برنامه های استاندارد ویندوز را هم بخواهید با C# بنویسید بازهم متد Main حضور خواهد داشت ، هر چند به صورت خودکار ویژوال استودیو آنرا تولید می کند.

فعلا برای پایان قسمت اول از شیء Console و متد WriteLine آن برای نمایش یک جمله ی ساده استفاده می کنیم. راجع به متدها ، متغیرها و غیره در آینده بیشتر صحبت می کنیم.
در آخر برنامه ی ما چیزی شبیه به عبارت زیر می باشد:

 


using System;

namespace ex01
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("Hello C#!");
}
}
}
 


دکمه ی F5 را فشار دهید تا برنامه اجرا شود.

تعریف متغیرها در سی شارپ:

سی شارپ عناصری را که بکار می گیرد همانند اعداد و کاراکترها ، به صورت نوع ها (Types) طبقه بندی می کند. این انواع شامل موارد زیر می شوند :
نوع های پایه ایی از پیش تعریف شده مانند اعداد و غیره.
نوع های تعریف شده توسط کاربر که شامل STRUCT ها و ENUM ها می شوند.

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


int a;



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

نوع های داده ای پایه ی زیر در در سی شارپ به صورت پیش فرض مهیا هستند:

object : نوعی است نامحدود که می تواند تمام انواع دیگر را نیز شامل شود. مثال :
 


object = null;
 


string : رشته ؛ در اینجا یک رشته توالی کاراکترهای یونیکد می باشد. مثال :



string s= "hello";



sbyte : نوع داده ایی صحیح 8 بیتی علامت دار.
byte : نوع داده ایی صحیح 8 بیتی بدون علامت. مثال :
 


sbyte val = 12;
 


short : نوع داده ایی صحیح 16 بیتی علامت دار.
ushort : نوع داده ایی صحیح 16 بیتی بدون علامت. مثال :
 


short val = 12;



int : نوع داده ایی صحیح 32 بیتی علامت دار.
unit : نوع داده ایی صحیح 32 بیتی بدون علامت. مثال :
 


int val = 12;



long : نوع داده ایی صحیح 64 بیتی علامت دار.
ulong : نوع داده ایی صحیح 64 بیتی بدون علامت. مثال :
 


Long val1 = 12; long val2 = 34L;
 


کلا در اینجا u به معنای unsigned است.

float : نوع اعشاری با single precision .
double : نوع اعشاری با double precision . مثال :



float val = 1.23f;



bool : نوع داده ایی Boolean که می تواند true و یا false باشد. مثال :
 


Bool val = true;



char : کاراکتر، دراینجا char یک کاراکتر یونیکد است.
 


char val = 'h';
 


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

decimal : نوع داده ایی دسیمال با 28 رقم معنی دار.
 


decimal val = 1.23M;



یک نکته :

- بهتر است هنگام تعریف یک متغیر ، نامی با مسما برای آن انتخاب شود تا در هنگام کار خواندن کد ساده تر گردد. همچنین رسم شده است که نوع متغیر را به صورت خلاصه به نام متغیر اضافه می کنند. برای مثال بجای FirstName بهتر است بنویسیم strFirstName . به این نوع نگارش Hungarian notation می گویند.
- تمام نوع های پیش فرض تعریف شده در سی شارپ شیء هستند. در آینده بیشتر در این مورد صحبت خواهیم کرد.

مثال این قسمت :

یک برنامه ی console جدید در را VS.NET باز کنید. نام آنرا در ابتدا ex02 انتخاب نمایید. در اینجا می خواهیم دو متغیر رشته ایی و صحیح را تعریف و سپس در خروجی نمایش دهیم.

کد نهایی به صورت زیر می باشد:
 


using System;

namespace ex02
{
///
/// Summary description for Class1.
///
class Class1
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
int intVar1 = 0;

int intVar2;
intVar2=1;

int intV3=15 , intV4 = 12;

string strText1 = "abcd";

Console.WriteLine(
"The value for variables are : n intVar1="+intVar1 +
"n intVar2="+ intVar2 +
"n intV3=" + intV3 +
"n intV4=" + intV4 +
"n strText1=" + strText1);

Console.WriteLine("nn Press any key to terminate");
Console.ReadLine(); // pause screen!

}
} }
 


نکاتی در مورد کد فوق:

- بک اسلش ان ، در زبانهای مشتق شده از سی به معنای new line می باشد.
- در کد فوق نحوه ی تعریف چند متغیر در یک خط و حالتهای مقدار دهی مختلف را ملاحظه می کنید.
- از متد ReadLine برای نگه داشتن خروجی و مشاهده ی آن در اینجا استفاده کردیم.
- عادت کنید به صورت دندانه دار کد بنویسید. اینکار خوانایی کد را صد برابر می کند. در اینجا کدهای داخل متد main ، کاملا چند دندانه از آکولادهای باز و بسته کردن آن جلو تر هستند.
- در کد بالا در متد WriteLine اعداد و رشته ها با هم جمع شده اند! این مورد بدلیل وجود overload های زیاد این تابع و ... میسر گشته است. اصلا به آن دل نبندید! چون در آینده کامپایلر سی شارپ اگر چنین اعمالی را در جاهای دیگری مرتکب شوید به شدت با شما برخورد خواهد کرد!! برای جمع کردن اعداد با رشته ها حتما باید عدد به رشته تبدیل گردد و بعد ... . در این مورد در مقالات بعدی بحث خواهد گردید.

 

شنبه 17 خرداد 1393  2:09 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت دوم

 


مقدمه :

در این قسمت می خواهیم با یک سری از اصول اولیه ی شیء گرایی در سی شارپ کمی آشنا شویم. لازم به ذکر است ، بسیاری از مواردی که در این قسمت مطرح می شوند فقط برای آشنایی شما است و در آینده بیشتر بحث و مرور خواهند شد.

آشنایی با فضاهای نام (NameSpaces) :

فضاهای نام روشی برای مدیریت کد نویسی هستند. برای مثال آنها ایجاد شده اند تا تداخلی بین نام های توابع در برنامه شما رخ ندهد. این مساله در پروژه های بزرگ خود را نشان می دهد و ممکن است دو آیتم در یک پروژه نام های یکسانی را پیدا کنند. بدین وسیله این شانس تصادم و تداخل کاهش پیدا می کند. برای ایجاد یک فضای نام به صورت زیر عمل می شود:

 



namespace anyName
{
……..

Class anyClassName
{
……….
}

…….

}


یکی از فضاهای نام پایه ای در دات نت فریم ورک ، فضای نام System می باشد. برای استفاده از آن می توان از کد زیر کمک گرفت :
 


using System;



تمام فضاهای نام به صورت پیش فرض public می باشند و در خارج از کد شما قابل دسترسی هستند. روش استفاده از آنها به صورت زیر است:
 


ProjectName.NameSpace.ClassName.MemberName
 


نکته :
اگر دقت کرده باشید هنگامی که کرسر ماوس را روی هر آیتمی در منوی autocomplete نگه می دارید و یا آنرا انتخاب می کنید یک راهنمای کوچک نمایش داده می شود که در حقیقت کامنت مربوط به آن تابع می باشد. روش نوشتن چنین کامنت حرفه ای که در منوهای ویژوال استودیو ظاهر شود به صورت زیر است که بهتر است (!) قبل از هر تابع یا خاصیت یا کلاس و .... نوشته شود



///
///
///
///
 


کلاس ها :

چون سی شارپ تمام سر و کارش با کلاس ها است بنابراین باید در مورد نحوه ی تعریف و استفاده از آنها تسلط کافی داشته باشیم.

یک پروژه ی جدید console در VS.NET باز کنید و نام آنرا در ابتدا ex03 وارد نمایید.
بعد از باز شدن پروژه ، از منوی Project گزینه ی Add class را انتخاب کنید تا کلاسی جدید به نام clsDate.cs را اضافه نماییم. ساختار فایل ایجاد شده توسط VS.NET به صورت زیر است :
 

 


using System;

namespace ex03
{
///
/// Summary description for clsDate.
///
public class clsDate
{
public clsDate()
{
//
// TODO: Add constructor logic here (chashm!)
//
}
}
}



تابع یا متد clsDate که در اینجا به صورت پیش فرض ایجاد شده است اصطلاحا سازنده (constructor) نام دارد. این تابع هر بار که یک شیء جدید از کلاس می سازیم به صورت خودکار اجرا می شود.

از این کلاس می خواهیم برای نمایش تاریخ/ ساعت و غیره استفاده کنیم.

برای مثال می خواهیم تاریخ جاری سیستم را به صورت یک خاصیت از این کلاس دریافت کنیم. برای این منظور کد زیر را به برنامه اضافه می نماییم:
 


public string currentSystemDate
{
get
{
return System.DateTime.Today.ToString() ;
}
}
 


توضیح کد فوق :

خاصیتی را که می خواهیم از برنامه دریافت کنیم با کلمه ی کلیدی get معرفی می نماییم. هر چیزی که این قسمت برگرداند خروجی currentSystemDate خواهد بود. این دستور زبان که در بالا معرفی شد استاندارد است و در همه جا به یک صورت تعریف و بکار برده می شود. پس شکل آنرا به خاطر بسپارید.
از کلمه ی کلیدی return برای برگرداندن یک خروجی از خاصیت و یا تابع استفاده می شود.

برای استفاده از این خاصیت جدید ، در فایل Class1.cs که متد main برنامه ی ما در آنجا قرار دارد به صورت زیر عمل می کنیم :
 


clsDate m_var = new clsDate(); // initialize variable
Console.WriteLine ( m_var.currentSystemDate );
Console.ReadLine();//pause!
 


توضیح کد فوق :

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



int i=0;
 


رای تعریف یک متغیر از نوع داده ای که خودمان تعریف کرده ایم نیز باید به همین صورت عمل شود.
 


clsDate m_var = new clsDate();
 


از کلمه ی کلیدی new اینجا به صورت استاندارد برای مقدار دهی اولیه به این متغیر جدید استفاده می نماییم.

سپس به روش دستیابی به این خاصیتی که به کلاس اضافه کرده ایم می رسیم.



m_var.currentSystemDate
 


کلا چه یک خاصیت و یا یک متد را به کلاس اضافه نماییم برای دستیابی به آن از عملگر نقطه پس از ذکر نام متغیر تعریف شده از نوع کلاس خود ، استفاده می نماییم. برای استفاده از خاصیت ها نیازی به آوردن () بعد از ذکر نام خاصیت نمی باشد.

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

توضیحی در مورد ; () System.DateTime.Today.ToString
استفاده از خواص :

شما به ویژگی های یک شیء با استفاده از خواص آن می توانید دسترسی پیدا کنید. یک property عضوی است که امکان دسترسی به ویژگی شیء یا کلاس را فراهم می کند. برای مثال طول یک رشته (string) ، سایز یک فونت ، عنوان یک فرم و نام یک مصرف کننده ، خاصیت هستند .

بسیاری از اشیاء ذاتی دات نت فریم ورک ، خواص مفید زیادی را به همراه دارند. برای مثال شیء DateTime را در نظر بگیرید. با استفاده از خاصیت Today آن می توان تاریخ جاری سیستم را بدست آورد. برای استفاده از یک خاصیت لازم است تا کلاس تعریف کننده شیء در برنامه مهیا باشد. منظور همان استفاده از فضای نام مربوطه می باشد. پس از وارد کردن فضای نام کلاس مورد نظر می توانید از شیء و خواص آن استفاده کنید. دو راه وجود دارد یا به صورت کامل تمام موارد باید ذکر شوند مانند System.DateTime.Now; و یا با وارد کردن فضای نام System کوتاه سازی صورت می گیرد.

برای استفاده از هر متد و یا شیء ایی در سی شارپ باید این شیء قابل دسترسی باشد. برای مثال شیء Console که از آن برای چاپ کردن خروجی بر روی صفحه ی نمایش استفاده می کنیم در فضای نام System واقع شده است. یا باید در ابتدای برنامه ذکر کرد using System ; و سپس خیلی راحت از این شیء استفاده کرد و یا می توان اینکار را انجام نداد و نوشت : System.Console و الی آخر. با ذکر فضای نام در ابتدا با استفاده از using می توان خلاصه نویسی کرد.

نتیجه ی نهایی مثال این فصل :

محتویات فایل Class1.cs :



using System;

namespace ex03
{
///
/// Summary description for Class1.
///
class Class1
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
clsDate m_var = new clsDate(); // initialize variable
Console.WriteLine ( m_var.currentSystemDate );

Console.ReadLine();//pause!
}
}
}
 


محتویات فایل clsDate.cs که به برنامه اضافه کردیم:
 


using System;

namespace ex03
{
///
/// Summary description for clsDate.
///
public class clsDate
{
public clsDate()
{
//
// TODO: Add constructor logic here
//
}

public string currentSystemDate
{
get
{
return System.DateTime.Today.ToString() ;
}
}


}
}

 

شنبه 17 خرداد 1393  2:10 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت سوم

 


ساختارهای تصمیم گیری :

در بسیاری از موارد هنگام برنامه نویسی لازم است تا از عبارات شرطی استفاده کنیم. برای انجام اینکار دو روش عمده وجود دارد. استفاده از if و یا switch . از if بیشتر برای مقایسه هایی تکی و کوچک استفاده می شود و حاصل مقایسه ی آن یا true است و یا false . از عبارت switch هنگامی استفاده می شود که مقایسه های متعددی باید در مورد یک مقدار صورت گیرد.
هر دو عبارت if و switch توسط عبارتهایی Boolean کنترل می شوند ( true و یا false ) . در هنگام استفاده از if اگر عبارت Boolean حاصل اش true باشد اولین قسمت شرط اجرا می شود و سپس برنامه از انتهای if ادامه پیدا می کند. اگر حاصل عبارت Boolean مساوی false باشد کنترل برنامه به قسمت else منتقل می شود.

مثال :

یک پروژه ی جدید console باز کنید و نام آنرا ex04 بگذارید. سپس کد زیر را در آن وارد و جرا کنید :
 


using System;

namespace ex04
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("Enter 1 character to be evaluated");

char cUserInput = (char) Console.Read();

if ( char.IsDigit( cUserInput ) )
Console.WriteLine("The char is a number!");
else
Console.WriteLine("The char is not a number!");

}
}
}



نکاتی در مورد کد فوق :

1- سی شارپ به کوچکی و بزرگی حروف حساس است . برای مثال cUserInput با cUserinput فرق می کند.
2- حتما باید بعد از if پرانتزها ذکر گردد.
3- حتما باید داخل if یک عبارت Boolean ذکر شود مانند if(x>5) .
4- در سی شارپ مقایسه ی تساوی دو عبارت با == و انتساب با = انجام می شود. ( موارد 1 و 4 مواردی هستند که اغلب تازه کاران با آن مشکل دارند! ) برای مثال if(i==3) صحیح است اما if(i=3) در سی شارپ معنایی ندارد.
5- اگر بعد از if یک خط کد قرار گیرد نیازی به آوردن آکولاد ها نیست. هنگامی نیاز به آکولادها می باشد که بیش از یک خط باید بعد از if قرار گیرد.
6- در سی شارپ همانند اسلاف خودش برای تبدیل نوع های داده ایی می توان به صورت زیر نیز عمل کرد : (char) Console.Read() ; یعنی دریافتی Read به char تبدیل می شود .در این مورد باز هم صحبت خواهد شد.
7- همانطور که ذکر شد در سی شارپ همه چیز شیء است حتی نوع های پایه ایی مانند char . با استفاده از متد IsDigit آن می توان چک کرد که آیا ورودی آن عدد است یا خیر؟ ( در مورد متدها صحبت خواهد شد )

استفاده از switch :

بهتر است این مورد را با یک مثال دنبال کنیم.
پروژه ی سی شارپ جدیدی به نام ex05 در حالت console در VS.NET باز کنید. دراینجا می خواهیم یک کلاس جدید تعریف کرده و توسط خاصیتی که در آن ایجاد می کنیم متوجه شویم روز جاری مطابق سیستم چه روزی است .
یک کلاس جدید از منوی پروژه ،‌با استفاده از گزینه ی Add class به برنامه اضافه کنید و نام آنرا در ابتدا clsDate بگذارید.



using System;

namespace ex05
{
///
/// Summary description for clsDate.
///
public class clsDate
{
public clsDate()
{
//
// TODO: Add constructor logic here
//
}

public string systemDayOfWeek
{
get
{

string res="";
switch( System.DateTime.Now.DayOfWeek.ToString())


هنگام ذخیره کردن این کد ویژوال استودیو به شما اخطار می دهد که کد دارای حروف یونیکد است. از منوی فایل گزینه ی advanced save options را انتخاب کنید. در اینجا می توان نوع ذخیره سازی را یونیکد انتخاب کرد.

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


using System;

namespace ex05
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
clsDate m_var = new clsDate();
Console.WriteLine( m_var.systemDayOfWeek );
Console.ReadLine();

}
}
}



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

همانطور که ملاحظه کردید اگر از switch استفاده نمی شد باید از 7 عدد if ‌استفاده می گردید که اصلا ظاهر حرفه ای و شکیلی نداشت!
با استفاده از عبارت زیر کار مقایسه شروع می شود. روز سیستم در یافت شده و وارد بدنه ی switch می گردد. سپس توسط case ها چک می شود تا تساوی آن با عبارت بعد از case به اثبات برسد.
 


switch( System.DateTime.Now.DayOfWeek.ToString())
 


اگر هر کدام از عبارات بعد از case صحیح بودند کار پس از آن که در اینجا انتساب است انجام شده و سپس توسط break کنترل برنامه از switch خارج می شود و ادامه ی کار دنبال می گردد.
اگر هیچکدام از case ها صحیح نبودند می توان از گزینه ی default هم در صورت نیاز استفاده کرد. این حالت در یک چنین مواقعی اجرا می گردد.

 

شنبه 17 خرداد 1393  2:12 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت چهارم

 



آرایه ها در سی شارپ :

هنگامی آرایه ها ایجاد می شوند که بخواهیم با مجموعه ای از اطلاعات همجنس کار کنیم. برای نمونه از یک آرایه برای ذخیره تعدادی کاراکتر می خواهیم استفاده نماییم. آرایه ها هم یک نوع متغیر هستند پس باید تعریف و مقدار دهی اولیه شوند ، نوع و تعداد اعضای آنها نیز باید معین گردد.
فرض کنید 10 داده ی هم جنس داریم ( برای مثال رشته (string) ) و می خواهیم آنها را ذخیره کنیم. یا می توان 10 متغیر مختلف را تعریف کرد و سپس تک تک آنها را مقدار دهی نمود و یا یک آرایه تعریف نمود و سپس در خانه های مختلف آن این ده عضو را چید. این مطلب زمانی حائز اهمیت می شود که داده های همجنس و به نوعی مرتبط ما تعداد زیادی داشته باشند.

برای تعریف آرایه چندین راه مختلف وجود دارد :
برای تعریف آرایه ابتدا نوع آنرا مشخص می کنید سپس [] را باید جلوی تعریف نوع بگذارید این دستور زبان است و چون چرا ندارد! در زبان سی کمی متفاوت بود. این کروشه ها بعد از نام متغیر می آمدند. و سپس در اینجا نام یک متغیر را که بعدا به آن ارجا می دهیم خواهید گذاشت. برای مثال

 



int[] table; // not int table[];

 



حد پایین آرایه صفر بوده برای مثال اگر آرایه chrData[] ده عضو داشته باشد، اولین عضو آن chrData[0] و آخرین عضو آن chrData[9] است.
مطلب دیگری که در مورد آرایه ها خیلی مهم است اندازه ی آن است. یعنی یک آرایه حاوی چند خانه ی خالی است که ما اجازه داریم آنرا پر کنیم. مثال :

 



int[] numbers; // declare numbers as an int array of any size
numbers = new int[10]; // numbers is a 10-element array
numbers = new int[20]; // now it's a 20-element array
 


1- تعریف آرایه ای از رشته ها و مقدار دهی اولیه آن.

 


String[] strData = new string[2];
 


2- تعریف و مقدار دهی اولیه

 



string [] strData = { "1234","abcd" };
 


که آرایه ای از نوع رشته ای به طول 2 عضو با مقدار دهی اولیه ایجاد شده است. در این حالت نیازی به تعیین طول آن نمی باشد.

3- روشی دیگر برای مقدار دهی اولیه

 


strData[0] = "1234";
strData[1] = "abcd";

 


مثال : یک پروژه ی جدید Console سی شارپ را باز کنید و نام آنرا در ابتدا ex06 بگذارید. در این مثال می خواهیم نحوه ی کار با آرایه ها را مرور کنیم :

 


using System;

namespace ex06
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
string[] sGoalList = new string[3];
string sReplyStatement = "You have choosen Goal '";

// Store goals in the array
sGoalList[0] = "Hike the Appalachian Trail";
sGoalList[1] = "Run the marathon";
sGoalList[2] = "Give $1 million to worthwhile causes";

// Store response to goals in the array
//(declaring and initializing on same line)
string[] sGoalResponse = {
"If you are staring from GA, you should get "
+ "started in early spring, so you will "+
"not get caught in snow.",
"Make sure that you have a good pair of shoes.",
"Start saving as soon as possible."};

// Give the user a list of goals to choose from
Console.WriteLine("GOAL LIST");

for(int i = 0; i < sGoalList.Length; i++)
{
Console.WriteLine("Goal " + i +
" - " + sGoalList[i]);
}


// Request the user to choose a goal.
Console.WriteLine (""); // Write an empty line for space
Console.Write("Please choose the number of the "
+ "goal that you want to achieve [0,1,2]: ");

Console.ReadLine();

}
}
}
 


نکاتی در مورد کد فوق :
1- نحوه ی استفاده از عملگر + را برای اتصال رشته های بلند در کد فوق می توان دید.
2- در سی شارپ پایان خط سمی کولون می باشد. بنابراین نگرانی در مورد چند خطی شدن یک دستور وجود ندارد.
3- هنگامی که آرایه ای را با مقادیر درون آکولادها ، مقدار دهی اولیه می کنید لزومی ندارد طول آن آرایه را مشخص کنید ؛ مانند آرایه sGoalResponse در بالا. در غیر اینصورت حتما باید طول یک آرایه را که معرف تعداد خانه های خالی آن است ، معرفی کنید مانند آرایه sGoalList .
4- فعلا حلقه ی for را در این مثال بخاطر داشته باشید تا در مقاله ی بعدی راجع به آن صحبت کنیم.

 

شنبه 17 خرداد 1393  2:13 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت پنجم

 



حلقه ها در سی شارپ :

مقدمه :

اگر نیاز باشد تا قطعه ای از کد بیش از یکبار اجرا شود نیاز به استفاده از حلقه ها می باشد. برای مثال فرض کنید آرایه ای به طول 1000 تعریف کرده اید. اکنون می خواهید آنرا با هزار عدد متوالی پرکنید. بدیهی است که روش زیر کارآمد نیست! :


int[] intData = new int[1000];
intData[0]=0;
.
.
.
intData[999]=1000;


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

تعریف حلقه ها و استفاده از آنها :

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

استفاده از حلقه ی for :

عموما کدنویسی را با کد نویسی می توان آموخت! بنابراین در مورد انواع حلقه ها مثالهایی ارائه خواهد گردید.

یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex07 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex07
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int[] intData = new int[1000];

for (int i=0 ; i<1000 ; i++ )
intData[i]=i;


for(int i=0 ; i< intData.Length ; i++)
{
int j = intData[i];
Console.WriteLine("intData[" + i + "]=" + j);
}

Console.ReadLine();

}
}
}


توضیحاتی در مورد کد فوق :
1- برای تعریف حلقه ی for همانطور که می بینید باید تعداد بار اجرای حلقه ( اینجا از 0 تا 999 است ) و همچنین نحوه ی رسیدن از 0 به 1000 را مشخص کرد ( در اینجا i++ است یعنی هر بار یک واحد به شمارشگر حلقه اضافه می شود. )
2- در زبان سی i++ یعنی i=i+1 و i-- یعنی i=i-1 و کلا i-=n یعنی i=i-n و به همین ترتیب. برای مثال i*=n یعنی i=i*n و i+=n یعنی i=i+n و ...
3- اگر پس از حلقه ی for یک خط کد داشته باشیم نیازی به آکولاد نیست (مانند قسمت اول کد). ولی اگر تعداد خطوط مربوط به بدنه ی for زیاد بود باید حتما از آکولاد استفاده شود (مانند قسمت دوم کد). (این قاعده ای کلی است در زبانهای مشتق شده از زبان سی در مورد هر چیزی!)
4- فرض کنید در قسمت اول کد بالا بجای 1000 می نوشتید 1001 . سریعا با یک خطای زمان اجرا مواجه می شدید. زیرا می خواستید به عضوی از آرایه دسترسی پیدا کنید که تعریف نشده است. راه مدرن چک کردن این مسائل استفاده از خاصیت Length آرایه است که در قسمت دوم کد در عمل مشاهده می نمایید. همیشه از این روش استفاده کنید.
5- حلقه ی اول یعنی اینکه کار پر کردن آرایه intData را از صفر تا 999 یکی یکی (i++) انجام بده.

استفاده از حلقه ی while :
یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex08 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex08
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int n = 1;

while (n < 6)
{
Console.WriteLine("Current value of n is {0}", n);
n++;
}

Console.ReadLine();
}
}
}


توضیحاتی در مورد کد فوق :
1- حلقه ی while در بالا کار انجام حلقه را تا هنگامی انجام می دهد که شرط ذکر شده در ابتدای آن صادق و برقرار باشد. یعنی در حلقه ی فوق تا وقتی n<6 است این حلقه ادامه خواهد یافت.
2- حلقه ی while صفر یا بیشتر بار ممکن است اجرا شود.
3- در کد فوق از {0} استفاده گردیده است. متد WriteLine به شما این اجازه را می دهد که n تا آرگومان برای آن تعریف کنید و مقادیر هر کدام را که خواستید در کد نمایش دهید از {x} استفاده کنید. در این مورد مقدار آرگومان x ام نمایش داده می شود.

استفاده از حلقه ی do :

یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex09 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex09
{

class Class1
{
[STAThread]
static void Main(string[] args)
{
int x;
int y = 0;

do
{
x = y++;
Console.WriteLine(x);

}while(y < 5);

Console.ReadLine();

}
}
}


توضیحاتی در مورد کد فوق :
1- این حلقه به حلقه ی do…while معروف است و هر دو جزء آن باید ذکر گردد.
2- این حلقه تا زمانی که شرط ذکر شده در قمست while صحیح است ادامه می یابد.
3- این حلقه در ابتدای کار بدون توجه به قسمت while حداقل یکبار اجرا می شود. (مثال زیر را اجرا نمایید)


int n = 10;
do
{
Console.WriteLine("Current value of n is {0}", n);
n++;
} while (n < 6);


استفاده از حلقه ی foreach :

یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex10 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex10
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int odd = 0, even = 0;
int[] arr = new int [] {0,1,2,5,7,8,11};

foreach (int i in arr)
{
if (i%2 == 0)
even++;
else
odd++;
}

Console.WriteLine(
"Found {0} Odd Numbers, and {1} Even Numbers.",
odd, even) ;

Console.ReadLine();

}
}
}


توضیحاتی در مورد کد فوق :
1- از foreach برای حرکت در بین اعضای یک آرایه (مانند مثال بالا) و یا مجموعه ایی از اشیاء استفاده می شود (روشی شکیل ، مدرن و مطمئن! و تقریبا به ارث رسیده از ویژوال بیسیک!!).
2- در زبانهای مشتق شده از C ، عملگر % ، باقیمانده را محاسبه می کند.
3- در کد فوق با استفاده از حلقه ی foreach تک تک اعضای آرایه در مورد زوج و یا فرد بودند مورد بررسی قرار گرفته اند و تعداد اعضای زوج و فرد در آخر نمایش داده می شود.

 

شنبه 17 خرداد 1393  2:14 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت ششم



دو مورد تکمیلی در مورد حلقه ها در سی شارپ :

1- هر جایی خواستید به هر دلیلی حلقه را پایان دهید می توانید از دستور break; استفاده کنید. در این حالت به صورت آنی حلقه خاتمه یافته و کدهای ادامه ی برنامه پس از حلقه اجرا می شوند.
2- نحوه ی استفاده از دستور continue : فرض کنید حلقه ی شما در راند 15 خودش است! حالا در این راند شما می خواهید یک سری از دستورات درون حلقه اجرا نشوند و حلقه به راند بعدی منتقل شده و کارش را ادامه دهد. اینجا است که از دستور continue استفاده می شود. بهتر است به یک مثال ساده در این زمینه توجه کنیم.

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex11 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex11
{
class Class1
{
[STAThread]
static void Main(string[] args)
{

Console.WriteLine(
"for (int i = 1; i <= 100; i++) -> break at i==5" );
for (int i = 1; i <= 100; i++)
{
if (i == 5)
break;
Console.WriteLine(i);
}
Console.ReadLine();


Console.WriteLine(
"for (int i = 1; i <= 10; i++) -> continue if i<9" );
for (int i = 1; i <= 10; i++)
{
if (i < 9)
continue;
Console.WriteLine(i);
}
Console.ReadLine();

}
}
}


موارد تکمیلی مربوط به رد و بدل کردن مقادیر به/از کلاس ها :

در قسمت بعدی می خواهیم خاصیتی را تعریف کنیم که یک مقدار را از کاربر می گیرد و در برنامه می توان توسط قسمت های دیگر از آن استفاده کرد.

ابتدا یک متغیر عمومی باید در سطح کلاس تعریف کرد تا مقدار دریافت شده توسط set را در خود نگاه داری کند (در مورد scope متغیرها ( متغیرهای عمومی و محلی و امثال اینها) در هنگام معرفی توابع بیشتر بحث خواهد شد) . سپس از طریق کلمه ی کلیدی value مقدار دریافت شده به متغیر انتساب می یابد و چون در سطح کلاس عمومی است در تمام کلاس قابل درسترسی است.

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex12 انتخاب نمایید. سپس از منوی پروژه یک کلاس جدید به آن اضافه نمایید (به نام clsDate) و کد زیر را درون آن بنویسید :


using System;

namespace ex12
{
public class clsDate
{
private int Year;

public clsDate()
{
}

public int setYear
{
set
{
Year = value;
}
}

public bool IsLeapYear
{
get
{
return System.DateTime.IsLeapYear(Year);
}
}


}
}


برای استفاده از آن در متد main برنامه به صورت زیر عمل می کنیم:


using System;

namespace ex12
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
clsDate m_var = new clsDate();

m_var.setYear = 1990;

if (m_var.IsLeapYear)
Console.WriteLine("1990 is a leap year.");
else
Console.WriteLine("1990 is not a leap year.");

Console.ReadLine();
}
}
}

 


توضیحاتی در مورد کد فوق:

1- نحوه ی تعریف متغیر از یک کلاس جزو اساسی ترین قسمت های کار با یک کلاس محسوب می شود که در قسمت های پیشین نیز معرفی گردید.
2- هنگامی که از if استفاده می کنیم لزومی ندارد حتما بنویسیم m_var.IsLeapYear==true . همین که این خاصیت ذکر می شود در وهله ی اول true بودن آن چک خواهد شد.
3- نحوه ی مقدار دهی به یک خاصیت را هم در کد فوق ملاحظه می نمایید. در هنگام استفاده از خاصیت ها نیازی به آوردن پرانتزها () در مقابل نام آنها وجود ندارد.
4- برای مرور ، نحوه ی معرفی خاصیت ها با get نیز بیان گردید. با استفاده از set و get می توان به کلاس ها ، مقادیر متغیرها را پاس کرد و یا مقداری را دریافت نمود.

 

شنبه 17 خرداد 1393  2:15 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت هفتم

 




تعریف متدها در سی شارپ

در این قسمت به یکی از مهمترین مباحث برنامه نویسی سی شارپ می رسیم.
متدها در سی شارپ و یا همان توابع در زبان C ، اعضای یک شیء یا کلاس هستند و مجموعه ای از یک سری از کارها را انجام می دهند. فرض کنید در برنامه ی شما ، قسمتی باید یک عملیات ریاضی خاص را انجام دهد و این قسمت از کد که شامل چندین خط نیز می گردد باید بارها و بارها در برنامه صدا زده شود. برای نظم بخشیدن به برنامه ، آنها را می توان به صورت توابع بسته بندی کرد و بجای نوشتن چندین خط تکراری، فقط نام این بسته ( تابع ) و پارامترهای آن را فراخوانی نمود.

در سی شارپ یک تابع به صورت زیر تعریف می شود :

(نوع و اسامی پارامترها) نام تابع نوع خروجی تابع سطح دسترسی به تابع
}
بدنه ی تابع
{


برای تعریف یک متد یا تابع ابتدا سطح دسترسی به آن مانند public و private سپس نوع خروجی تابع مانند void ( هیچی ) ذکر می گردد که داخل این پرانتزها می توان ورودی های تابع یا بقولی آرگومان های ورودی را معرفی کرد. سپس تابع باید با { شروع و با یک } خاتمه یابد.

برای مثال :


public int myFunc( int x )
{
...….
}

 



هر تابعی می تواند صفر تا تعداد بیشماری آرگومان ورودی و صفر تا تعداد بیشماری خروجی داشته باشد. بوسیله یک تابع می توان پیچیدگی کار را مخفی کرد و صرفا با صدا زدن نام آن ، یک سری از عملیات را انجام داد. گاهی از اوقات لازم می شود دو یا چند تابع با یک نام داشته باشیم بطوریکه پارامترهای ورودی یا مقادیر خروجی و یا نوع آرگومان های ورودی آنها با هم متفاوت باشد به این کار overloading می گویند.
بسیاری از کلاس های دات نت فریم ورک متدها و یا توابع مفید حاضر و آماده ای را دارند. برای مثال کلاس DateTime ، متدی به نام ToLongDatastring دارد که تاریخ را به صورت یک رشته طولانی بر می گرداند.

توابع void :

توابعی که با نوع void معرفی می شوند هیچ خروجی ندارند و در زبان ویژوال بیسیک به آْنها sub و در دلفی به آنها procedure می گویند.

بازگرداندن یک مقدار از یک تابع :

پس از اینکه عملیات یک مجموعه از کدها درون تابع به پایان رسید با استفاده از کلمه ی return می توان خروجی تابع را معرفی کرد. لازم به ذکر است ، هرجایی این کلمه ی return ذکر شود کار تابع خاتمه می یابد.

بهتر است موارد فوق را با چند مثال مرور کنیم :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex13 انتخاب نمایید. در اینجا می خواهیم تابعی را تعریف کنیم که سه برابر جذر یک عدد را بر می گرداند.


using System;

namespace ex13
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine( int3SQL(3) );
Console.ReadLine();
}

public static double int3SQL( double intInput )
{
double i=0;
i = Math.Sqrt( intInput );
return i;
}
}
}


توضیحاتی در مورد کد فوق :

1- از شیء Math در سی شارپ می توان برای انجام یک سری عملیات ریاضی ابتدایی استفاده کرد. در اینجا از متد جذر گرفتن آن استفاده شده است.
2- در تعریف تابع خودمان از کلمه ی کلیدی static استفاده شده است. درون تابع Main نمی توان توابع غیر استاتیک را فراخوانی کرد. فعلا این نکته را بخاطر را داشته باشید تا در مقالات بعدی بیشتر راجع به آن صحبت شود.
3- بد نیست تابع تعریف شده را کمی بیشتر آنالیز کنیم :


public static double int3SQL( double intInput )
{
double i=0;
i = Math.Sqrt( intInput );
return i;
}


ابتدا سطح دسترسی به تابع ذکر شده است. پابلیک ، یعنی این تابع خارج از کلاس یک برنامه نیز قابل دسترسی است. سپس از کلمه ی static استفاده گردیده که توضیح مختصری را در مورد آن ملاحظه کردید. در ادامه نوع خروجی تابع که در اینجا double می باشد معرفی گردیده است. دقت کنید که حتما باید نوع تعریف شده با مقداری که یک تابع بر می گرداند یکسان باشد و گرنه با یک خطا برنامه متوقف می شود. سپس نام تابع تعریف شده است. داخل پرانتز ها نوع و نام آرگومانی ارائه شده است که در بدنه ی تابع استفاده می گردد. اگر به تعداد بیشتری پارامتر و یا آرگومان نیاز بود می توان آنها را با , از هم جدا کرد.
پس از اینکه عملیات تابع خاتمه می یابد با استفاده از return این خروجی را معرفی می نماییم.
برای استفاده از این تابع به سادگی نام تابع و سپس پرانتزها به همراه یک عدد دلخواه را می نویسم که آنرا در متد Main برنامه می توان مشاهده کرد.

تعریف توابع در کلاس های دیگر برنامه و نحوه ی استفاده از آنها :

یکی از زیبایی های برنامه نویسی شیء گرا نظم و ترتیب و بسته بندی کارها می باشد که اصطلاحا در اینجا به آن encapsulation می گویند. یعنی ما یک سری از توابع و خواص را درون کپسولی به نام کلاس قرار می دهیم تا به سادگی بارها و بارها از آن استفاده نماییم.
برای اینکار به سادگی یک توابع را به صورت معمول درون کلاس تعریف می نماییم و سپس همانند خواص که در مورد آنها صحبت شد ، از توابع می توان استفاده کرد با این تفاوت که هنگام کار با توابع حتی اگر آنها هیچ آرگومان و یا پارامتر ورودی هم نداشته باشند ذکر پرانتزها الزامی است.

مثالی دیگر در این زمینه :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex14 انتخاب نمایید. سپس از منوی پروژه یک کلاس جدید را به برنامه اضافه نمایید (نام آنرا clsTools بگذارید) .


using System;

namespace ex14
{
public class clsTools
{
public clsTools()
{
}

public uint intCalc ( uint a , uint b )
{
uint c = Math.Min (a,b);
double x = Math.Sqrt(c) ;
uint w = Convert.ToUInt32 ( x);
return w;
}
}
}


سپس در متد Main برنامه می توان به صورت زیر از آن استفاده کرد :


using System;

namespace ex14
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
clsTools m_var = new clsTools();
Console.WriteLine( m_var.intCalc(4,9));
Console.ReadLine();
}
}
}


توضیحاتی در مورد کد فوق :
1- تابع intCalc ما دو عدد صحیح مثبت را می گیرد و سپس جذر کوچکترین دو عدد ورودی را محاسبه می کند.
2- برای تبدیل نوع های عددی مختلف به هم می توان از شیء Convert استفاده کرد.
3- بدون استفاده از شیء Convert یکبار برنامه را اجرا کنید و دلیل خطای بوجود آمده را بیان نمایید.

شنبه 17 خرداد 1393  2:16 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت هشتم


چگونه از یک تابع بیش از یک خروجی دریافت کنیم.

ظاهرا به نظر می رسد که توابع فقط می توانند یک return داشته باشند و بلافاصله پس از فراخوانی return کار تابع پایان یافته است. در سی شارپ دو کلمه ی کلیدی به نام های ref و out اضافه شده اند که این امر را ساده تر می کنند.

استفاده از کلمه ی کلیدی out :

از out در تعریف تابع قبل از معرفی نوع آرگومان ورودی استفاده می کنیم . در این حالت بجای اینکه به این آرگومان ، آرگومان ورودی بگوییم ، می توان آنرا آرگومان خروجی نامید. تا یک مثال را در این زمینه با هم مرور نکنیم این مورد مفهوم نخواهد بود :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex15 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex15
{
class Class1
{

public static int TestOut(out char i)
{
i = 'b';
return -1;
}

[STAThread]
static void Main(string[] args)
{
char i; // variable need not be initialized
Console.WriteLine(TestOut(out i));
Console.WriteLine(i);
Console.ReadLine();

}
}
}

 



توضیحاتی در مورد کد فوق :
1- در تابع TestOut آرگومان i از با کلمه ی کلیدی out مشخص شده است. یعنی اینکه درون تابع هر گونه تغییری روی i انجام شود ، خارج از تابع قابل دسترسی است.
2- توابعی که دارای آرگومانهایی تعریف شده با کلمه ی کلیدی out هستند نیز می توانند از return هم استفاده کنند. همانند مثال فوق.

استفاده از کلمه ی کلیدی ref :

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

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex16 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex16
{
class Class1
{
public static void FillArray(ref int[] arr)
{
// Create the array on demand:
if (arr == null)
arr = new int[10];
// Otherwise fill the array:
arr[0] = 123;
arr[4] = 1024;
}

[STAThread]
static void Main(string[] args)
{
// Initialize the array:
int[] myArray = {1,2,3,4,5};

// Pass the array using ref:
FillArray(ref myArray);

// Display the updated array:
Console.WriteLine("Array elements are:");
for (int i = 0; i < myArray.Length; i++)
Console.WriteLine(myArray[i]);

Console.ReadLine();
}
}
}


توضیحاتی در مورد کد فوق :
1- همانطور که ملاحظه می کنید در اینجا هنگام استفاده از تابع FillArray باید آرگومانی را که می خواهیم به آن پاس کنیم مقدار دهی اولیه کنیم.
2- پس می توان نتیجه گرفت آرگومانهایی که با out تعریف می شوند به صورت خالص خروجی هستند و نیازی به مقدار دهی اولیه هنگام استفاده از آنها وجود ندارد. از ref هنگامی استفاده می کنیم که بخواهیم روی متغیر موجود و مقدار دهی شده ی خارج از تابع ، درون تابع عملیاتی صورت گیرد و سپس همان متغیر دستکاری شده ، عودت داده شود.

تعریف تابعی با تعداد آرگومانهای نامعلوم :

گاهی از اوقات نیاز است تا تابعی تعریف کنیم که تعداد آرگومانهای آن متغیر باشند .برای این منظور از کلمه ی کلیدی params استفاده می شود.
دونکته در اینجا حائز اهمیت است:
1- در هر تابعی تنها می توان یکبار از params استفاده کرد.
2- پس از بکار بردن params دیگر نمی توان هیچ آرگومانی را تعریف کرد.

یکی از مثالهایی که در این زمینه می توان ارائه داد استفاده از آرایه ها به عنوان آرگومان ورودی است. در این حالت یا می توان یک آرایه را به صورت کامل به تابع معرفی کرد و یا تنها نام آنرا به تابع پاس کرد. مثال زیر را ملاحظه کنید :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex17 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex17
{
class Class1
{
public static void UseParams(params int[] list)
{
for ( int i = 0 ; i < list.Length ; i++ )
Console.WriteLine(list[i]);
Console.WriteLine();
}

[STAThread]
static void Main(string[] args)
{
UseParams(1, 2, 3);

int[] myarray = new int[3] {10,11,12};
UseParams(myarray);

Console.ReadLine();

}
}
}


توضیحاتی در مورد کد فوق :

1- در تابع main به دو صورت از تابع UseParams ما استفاده شده است. یا اینکه خیلی ساده هر تعداد آرگومان را می توان به تابع فرستاد و یا اینکه در ادامه آرایه ایی رسما تعریف و سپس به تابع فرستاده شود.
2- نحوه ی تعریف و استفاده از آرایه ها به صورت آرگومان ورودی را نیز می توان در مثال فوق آموخت.

 

شنبه 17 خرداد 1393  2:17 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت نهم

 



مبحث overloading :

گاهی از اوقات لازم است تا نگارش های مختلفی از یک تابع داشته باشیم. برای مثال تعریف سه تابع با یک نام اما با آرگومانهای مختلف. به این نوع توابع و یا متدها اصطلاحا Overloaded Methods می گویند . ( فکر کنم آنرا سربارگذاری توابع ترجمه کرده اند! ) برای مثال :


void myMethod(int p1);
void myMethod(int p1, int p2);
void myMethod(int p1, string s1);


مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex18 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex18
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
writeIT();

writeIT(12);

Console.ReadLine();
}

public static void writeIT()
{
Console.WriteLine(" writeIT() Ver." );
}

public static void writeIT(int intI)
{
Console.WriteLine(" writeIT(intI) Ver. = " + intI );
}


}
}


توضیحاتی در مورد کد فوق :

1- نحوه ی تعریف دو تابع با یک نام را ملاحظه می نمایید. اینکار در زبان سی ممنوع است!
2- کامپایلر به صورت هوشمند بر اساس نوع و تعداد آرگومانهای ورودی ، ورژن مناسب را انتخاب و اجرا می کند.

نمونه ی ضعیفی از این بحث در وی بی 6 به صورت تعریف توابعی با پارامترهای Optional وجود داشت .

مباحث تکمیلی آرایه ها (آرایه های چند بعدی):

آرایه های معمولی (یک بعدی) را می توان یک ردیف با تعدادی خانه خالی آماده ی پر شدن در نظر گرفت. آرایه ی دوبعدی را می توان مانند یک جدول تشکلیل شده از ردیف ها و ستون ها در نظر گرفت و الی آخر...
سی شارپ دو نوع آرایه ی چند بعدی را پشتیبانی می کند : rectangular and jagged
در یک آرایه ی rectangular هر ردیف ، طولش با ردیف بعدی یکی است. آرایه ی jagged در حقیقت آرایه ایی از آرایه ها است ، بنابراین هر کدام از آنها می تواند طول مختلفی داشته باشد.

تعریف یک آرایه ی دوبعدی به صورت زیر است :


type [,] array-name


مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex19 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex19
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
const int rows = 4;
const int columns = 3;
// declare a 4x3 integer array
int[,] rectangularArray = new int[rows, columns];
// populate the array
for (int i = 0;i < rows;i++)
{
for (int j = 0;j
{
rectangularArray[i,j] = i+j;
}
}
// report the contents of the array
for (int i = 0;i < rows;i++)
{
for (int j = 0;j
{
Console.WriteLine("rectangularArray[{0},{1}] = {2}",
i,j,rectangularArray[i,j]);
}
}

Console.ReadLine();
}
}
}


توضیحاتی در مورد کد فوق :
1- نحوه ی تعریف ، مقدار دهی اولیه و استفاده از آرایه های دو بعدی را در مثال فوق ملاحظه می نمایید.
2- در یک آرایه ی دوبعدی محل قرار گیری ردیف ها و ستون ها برای مثال به صورت زیر است :


new int[rows, columns]-


استفاده از آرایه های چند بعدی :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex20 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex20
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
const int rows = 4;
const int columns = 3;
// imply a 4x3 array
int[,] rectangularArray =
{
{0,1,2},
{3,4,5},
{6,7,8},
{9,10,11}
};
for (int i = 0;i < rows;i++)
{
for (int j = 0;j
{
Console.WriteLine("rectangularArray[{0},{1}] = {2}",
i,j,rectangularArray[i,j]);
}
}
}
}
}


توضیحاتی در مورد کد فوق :
1- در حقیقت مثال فوق تعریف آرایه ایی از آرایه ها بود.
2- چون مقدار دهی اولیه به صورت واضحی انجام شده نیازی به ذکر ابعاد آرایه به صورت صحیح وجود نداشت.

شنبه 17 خرداد 1393  2:18 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت دهم

 


Jagged arrays

Jagged arrays آرایه ای از آرایه ها است و همانطور که ذکر شد لزومی ندارد که هر ردیف آن با ردیف بعدی هم طول باشد . هنگام تعریف این نوع آرایه شما تعداد ردیف ها را مشخص می نمایید. هر ردیف یک آرایه را نگهداری می کند. در اینجا هر آرایه باید تعریف شود. روش تعریف Jagged array به صورت زیر است:


type [] []...


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


int [] [] myJaggedArray;


و برای مثال برای دسترسی به پنجمین عنصر آرایه ی سوم به صورت زیر عمل می شود :


myJaggedArray[2][4]


مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex21 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex21
{
class Class1
{
[STAThread]
static void Main(string[] args)
{

const int rows = 4;
// declare the jagged array as 4 rows high
int[][] jaggedArray = new int[rows][];
// the first row has 5 elements
jaggedArray[0] = new int[5];
// a row with 2 elements
jaggedArray[1] = new int[2];
// a row with 3 elements
jaggedArray[2] = new int[3];
// the last row has 5 elements
jaggedArray[3] = new int[5];
// Fill some (but not all) elements of the rows
jaggedArray[0][3] = 15;
jaggedArray[1][1] = 12;
jaggedArray[2][1] = 9;
jaggedArray[2][2] = 99;
jaggedArray[3][0] = 10;
jaggedArray[3][1] = 11;
jaggedArray[3][2] = 12;
jaggedArray[3][3] = 13;
jaggedArray[3][4] = 14;
for (int i = 0;i < 5; i++)
{
Console.WriteLine("jaggedArray[0][{0}] = {1}",
i,jaggedArray[0][i]);
}
for (int i = 0;i < 2; i++)
{
Console.WriteLine("jaggedArray[1][{0}] = {1}",
i,jaggedArray[1][i]);
}
for (int i = 0;i < 3; i++)
{
Console.WriteLine("jaggedArray[2][{0}] = {1}",
i,jaggedArray[2][i]);
}
for (int i = 0;i < 5; i++)
{
Console.WriteLine("jaggedArray[3][{0}] = {1}",
i,jaggedArray[3][i]);
}

Console.ReadLine();

}
}
}


توضیحاتی در مورد کد فوق :

هنگام کار با آرایه های rectangular برای درسترسی به اعضا به صورت زیر عمل می شد :


rectangularArrayrectangularArray[i,j]


اما در اینجا بدین صورت است :


jaggedArray[3][i]


استفاده از System.Array :

دات نت فریم ورک کلاسی را معرفی کرده است به نام Array. توسط این کلاس کار با آرایه ها و اعمال روی آنها برای مثال سورت کردن و غیره به شدت ساده می شود .


مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex22 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;

namespace ex22
{
class Class1
{
public static void PrintMyArray(object[] theArray)
{
foreach (object obj in theArray)
{
Console.WriteLine("Value: {0}", obj);
}
Console.WriteLine("n");
}

[STAThread]
static void Main(string[] args)
{
String[] myArray = {
"Who", "is", "John", "Galt"
};
PrintMyArray(myArray);
Array.Reverse(myArray);
PrintMyArray(myArray);
String[] myOtherArray = {
"We", "Hold", "These", "Truths",
"To", "Be", "Self", "Evident" };

PrintMyArray(myOtherArray);
Array.Sort(myOtherArray);
PrintMyArray(myOtherArray);

Console.ReadLine() ;

}
}
}


توضیحاتی در مورد کد فوق :
از دو متد Sort و Reverse در اینجا برای سورت کردن و نمایش آرایه به ترتیب معکوس (از انتها به ابتدا) استفاده گردیده است.

تعریف آرایه های دینامیک در سی شارپ :

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

هنگام استفاده از ArrayList نیازی به دانستن تعداد اعضایی که باید اضافه شوند نمی باشد و با استفاده از متد Add آن به سادگی می توان اعضاء را به آن اضافه نمود . تعدادی از خواص و متدهای این کلاس به صورت زیر هستند :


Adapter , FixedSize , ReadOnly , Repeat , Synchronized , Capacity,Count , IsFixedSize , IsReadOnly , IsSynchronized , Item , SyncRoot , Add , AddRange , BinarySearch , Clear , Clone , Contains , CopyTo , GetEnumerator , GetRange , IndexOf , Insert , InsertRange , LastIndexOf , Remove , RemoveAt , RemoveRange , Reverse , SetRange , Sort , ToArray , TrimToSize


مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex23 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


using System;
using System.Collections;

namespace ex23
{
// a simple class to store in the array
public class Employee
{
public Employee(int empID)
{
this.empID = empID;
}
public override string ToString( )
{
return empID.ToString( );
}
public int EmpID
{
get
{
return empID;
}
set
{
empID = value;
}
}
private int empID;
}

class Class1
{
[STAThread]
static void Main(string[] args)
{

ArrayList empArray = new ArrayList( );
ArrayList intArray = new ArrayList( );
// populate the array
for (int i = 0;i<5;i++)
{
empArray.Add(new Employee(i+100));
intArray.Add(i*5);
}
// print all the contents
for (int i = 0;i
{
Console.Write("{0} ", intArray[i].ToString( ));
}
Console.WriteLine("n");
// print all the contents of the button array
for (int i = 0;i
{
Console.Write("{0} ", empArray[i].ToString( ));
}
Console.WriteLine("n");
Console.WriteLine("empArray.Capacity: {0}",
empArray.Capacity);

Console.ReadLine();

}
}
}


توضیحاتی در مورد کد فوق :

1- با کلمه ی کلیدی override در قسمت های بعدی آشنا خواهیم شد.
2- برای استفاده از ArrayList لازم بود تا فضای نامی را که این کلاس در آن تعریف شده است ، به برنامه اضافه کرد.
3- در مثال فوق نحوه ی تعریف دو کلاس را در یک فضای نام مشاهده می نمایید.
4- نحوه ی تعریف و مقدار دهی ArrayList و همچنین استفاده از خواص آن در مثال فوق بررسی شده است.

شنبه 17 خرداد 1393  2:19 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت یازدهم


از این قسمت به بعد می خواهیم نگاهی دقیق تر به بحث شیء گرایی در سی شارپ بیاندازیم؛ همانند فضاهای نام ، کلاس ها ، ارث بری ، پلی مرفیسم و غیره.

در قسمت های قبل آشنایی مختصری با فضاهای نام پیدا کردیم. در ادامه جزئیات بیشتری را در مورد آن بررسی خواهیم کرد.
فضاهای نام (namespaces) برای اداره کردن و نظم بخشیدن به کدها ارائه شده اند. همچنین از امکان تشابه اسمی در بین قسمت های مختلف برنامه نیز جلوگیری می کنند. استفاده از آنها عادت پسندیده ای است هنگامیکه قصد داریم از کد نوشته شده بارها و بارها استفاده کنیم.

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex24 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


// Namespace Declaration
using System;

namespace ex24
{
namespace tutorial
{
// Program start class
class NamespaceCSS
{
// Main begins program execution.
public static void Main()
{
// Write to console
Console.WriteLine("This is the new Namespace.");
}
}
}

 



توضیحاتی در مورد کد فوق :
یکی از روش های مناسب برای معرفی فضاهای نام ، ارائه ی آنها به صورت سلسله مراتبی می باشد. قسمت های عمومی تر در بالا و قسمت های اختصاصی تر در فصاهای نام داخلی تر قرار داده می شوند. این روش به معرفی فضاهای نام تو در تو منتهی می شود (nested namespaces) ، همانند مثال بالا.

کد فوق را به صورت زیر با استفاده از عملگر دات (.) می توان خلاصه نویسی کرد و نتیجه با قبل تفاوتی ندارد:


// Namespace Declaration
using System;

namespace ex24.tutorial
{
// Program start class
class NamespaceCSS
{
// Main begins program execution.
public static void Main()
{
// Write to console
Console.WriteLine("This is the new Namespace.");
}
}
}


طریقه ی فراخوانی اعضای فضاهای نام :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex25 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


// Namespace Declaration
using System;

namespace ex25
{
// nested namespace
namespace tutorial
{
class myExample1
{
public static void myPrint1()
{
Console.WriteLine("calling another namespace member1.");
}
}
}

// Program start class
class NamespaceCalling
{
// Main begins program execution.
public static void Main()
{
// Write to console
tutorial.myExample1.myPrint1();
tutorial.myExample2.myPrint2();
}
}
}

// same namespace as nested namespace above
namespace ex25.tutorial
{
class myExample2
{
public static void myPrint2()
{
Console.WriteLine("calling another namespace member2.");
}
}
}


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


ProjectName.NameSpace.ClassName.MemberName


برای مثال در فصای نام tutorial کلاس myExample1 قرار دارد و داخل آن متد myPrint1 تعریف شده است. پس نحوه ی دسترسی به متد آن به صورت زیر است :


tutorial.myExample1.myPrint1();


کلاس های myExample1 و myExample2 هر دو به یک فضای نام (ex25.tutorial) تعلق دارند ، هر چند جدا از هم نوشته شده اند. حتی آنها را با حفظ سلسله مراتب خودشان می توان در فایلهای جداگانه ای نیز نوشت.

استفاده از using :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex26 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :


// Namespace Declaration
using System;
using ex26.tutorial;

// Program start class
class UsingDirective
{
// Main begins program execution.
public static void Main()
{
// Call namespace member
myExample.myPrint();
}
}

// C# Namespace
namespace ex26.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine("Example of using a using directive.");
}
}
}


توضیحاتی در مورد کد فوق :

همانند مثال بالا ، برای خلاصه نویسی می توان از کلمه ی using به همراه نام namespace مورد نظر استفاده کرد. برای مثال اگر متد WriteLine را بخواهیم کامل بنویسیم به صورت زیر است :


System.Console.WriteLine(...);


اما با قید کردن و الحاق کردن فضای نام آن ، دیگر نیازی به ذکر System در ابتدای آن نیست.

نکته :

باز هم می توان خلاصه نویسی بیشتری را ارائه داد:


using csTut = ex26.tutorial.myExample; // alias


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


csTut.myPrint();

 

شنبه 17 خرداد 1393  2:21 AM
تشکرات از این پست
amir193
amir193
کاربر نقره ای
تاریخ عضویت : فروردین 1393 
تعداد پست ها : 357
محل سکونت : بوشهر

پاسخ به:مقدمه ای بر سی شارپ

مقدمه ای بر سی شارپ : قسمت دوازدهم


کلاس ها در سی شارپ :

تا بحال در حد کاربرد ، با کلاس ها آشنا شده ایم . اما در این قسمت می خواهیم نگاهی دقیق تر به کلاس ها بیاندازیم.

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


using System;

class Data
{
public int x;
}
class App
{
public static void Main()
{
Data d1 = new Data();
d1.x = 1;
Data d2 = new Data();
d2.x = 2;
Console.WriteLine("d1.x = {0}", d1.x);
Console.WriteLine("d2.x = {0}", d2.x);
}
}


در اینجا کلاس Data تعریف شده است و دارای یک عضو به نام x می باشد. به این نوع داده در کلاس فیلد گفته می شود و هنگامیکه به صورت public معرفی می شود یعنی خارج از کلاس نیز قابل دسترسی است. در کد بالا دو متغیر از کلاس تعریف و مقدار دهی اولیه شده اند. خروجی برنامه به صورت زیر است :


d1.x = 1
d2.x = 2


دلیل این خروجی آن است که هر instance (نمونه) از کلاس منحصر بفرد است و در اینجا نمی توان انتظار داشت که هر دو خروجی یکی شوند.

برای مقدار دهی اولیه متغیرهایی که به صورت فیلد تعریف می شوند ، بهتر است مقدار دهی آنها را در سازنده ی کلاس (constructor) انجام دهیم.


class Data
{
public int x;
public Data(){x = 99;}
}


همانطور که پیشتر نیز ذکر شد ، متدی که هم نام کلاس است ، سازنده نام می گیرد. یک کلاس می تواند بیش از یک سازنده داشته باشد. برای مثال :


class Data
{
public int x;
private Data(){}
public Data(int y){x = y;}
public Data(int y, int z){x = y + z;}
}


از آنجائیکه که سازنده ی بدون پارامتر ذکر شده در کد فوق private تعریف شده است بنابراین خارج از کلاس دیگر قابل دسترسی نمی باشد . بنابراین کدی خارج از کلاس ، تنها می تواند از دو سازنده ی دیگر استفاده کند. برای مثال تعریف دو متغیر جدید از این کلاس به صورت زیر می باشد :


Data d1 = new Data(44);
Data d2 = new Data(22, 33);


سی شارپ به شما اجازه می دهد تا سازنده ها را در یک کلاس توسط کلمه ی کلیدی this نیز فراخوانی کنید یعنی بجای ذکر نام متد سازنده از کلمه ی this استفاده شود .

اگر می خواهید متغیری را بین نمونه (instance) های مختلف یک کلاس به اشتراک بگذارید کلمه ی کلیدی static وارد صحنه می شود. به مثال زیر توجه کنید :


using System;

class Counted
{
public static int count = 0;
public Counted()
{
count++;
}
public int GetInstanceCount()
{
return count;
}
}
class App
{
public static void Main()
{
Counted d1 = new Counted();
Console.WriteLine("current total {0}", d1.GetInstanceCount());
Counted d2 = new Counted();
Console.WriteLine("current total {0}", d2.GetInstanceCount());
Console.WriteLine("total {0}", Counted.count);
}
}


باید خاطر نشان کرد که متغیرهای استاتیک توسط نمونه های کلاس قابل دستیابی نیستند و فقط درون کلاس به شکل زیر می توان از آْنها استفاده کرد :

.

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

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


class Counted
{
public static int x = 0;
public Counted()
{
x++;
}
public int InstanceCount // property
{
get{return x;}
}
}


و در این صورت قسمت بعدی کد به صورت زیر اصلاح می شود (فراخوانی خواص ، بدون ذکر پرانتزها بعد از نام آنها صورت می گیرد):


Counted d1 = new Counted();
Console.WriteLine("current total {0}", d1.InstanceCount);
Counted d2 = new Counted();
Console.WriteLine("current total {0}", d2.InstanceCount);


اگر یک خاصیت هم خواندنی و هم نوشتنی باشد به صورت زیر تعریف می شود :


private string name;
public string Name
{
get{return name;}
set{name = value;}
}


فیلدهای پابلیک را می توان خواند و یا تغییر داد. اگر لازم باشد تا کاربر نتواند آنها را تغییر دهد می توان از کلمه ی کلیدی readonly قبل از تعریف آنها استفاده کرد. مثال :


class Data
{
public readonly int x = 42;
}

 

شنبه 17 خرداد 1393  2:23 AM
تشکرات از این پست
دسترسی سریع به انجمن ها