درس دوم – عبارات، انواع و متغیرها در C#

درس دوم – عبارات، انواع و متغیرها در C#

 

در این درس به معرفی عبارات، انواع و متغیرها در زبان C# می‌پردازیم. هدف از این درس بررسی موارد زیر است :

  • آشنایی با متغیرها
  • فراگیری انواع(Types) ابتدایی در C#
  • فراگیری و درک عبارات(Expressions) در C#
  • فراگیری نوع رشته‌ای(String) در زبان C#
  • فراگیری چگونگی استفاده از آرایه‌ها(Arrays) در زبان C#

 

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

C# زبانی بسیار وابسته به انواع است، بطوریکه تمامی عملیاتی که بر روی داده‌ها و متغیرها در این زبان انجام می‌گیرد با دانستن نوع آن متغیر میسر می‌باشد. قوانینی نیز برای تعیین اینکه چه عملیاتی بر روی چه متغیری انجام شود نیز وجود دارد.(بسته به نوع متغیر)

 

انوع ابتدایی زبان C# شامل : یک نوع منطقی(Boolean) و سه نوع عددی اعداد صحیح(integer)، اعداد اعشاری(Floating points) و اعداد دسیمال(Decimal) می‌باشد.(به انواع Boolean از اینرو منطقی می‌گوییم که تنها دارای دو حالت منطقی صحیح(True) و یا غلط(False) می‌باشند.)

 

مثال 1 – نشان دادن مقادیر منطقی (Boolean)

using System;

class Booleans

{

  public static void Main()

   {

    bool content = true;

    bool noContent = false;

    Console.WriteLine("It is {0} that C# Persian provides C# programming language

        content.", content);

    Console.WriteLine("The statement above is not {0}.", noContent);

   }

}

در این مثال، مقادیر منطقی متغیر‌های Boolean به عنوان قسمتی از جمله در خروجی نمایش داده می‌شوند. متغیر‌های bool تنها می‌توانند یکی از دو مقدار true یا false را داشته باشند، یعنی همانند برخی از زبانهای برنامه‌سازی مشابه، مانند C و یا C++، مقدار عددی نمی‌پذیرند، زیرا همانگونه که می‌دانید در این دو زبان هر مقدار عددی صحیح مثبت بغیر از صفر به عنوان true و عدد صفر به عنوان false در نظر گرفته می‌شود و در حقیقت نوع bool در این دو زبان نوعی integer می‌باشند. اما در زبان C# انواع bool یکی از دو مقدار true یا false را می‌پذیرند. خروجی برنامه بالا به صورت زیر است :

It is True that C# Persian provides C# programming language content.

The statement above is not False.

جدول زیر تمامی انواع عددی صحیح ‍C#، اندازه آنها و رنج قابل قبول آنها را نشان می‌دهد.

 

رنج قابل قبول

اندازه به بیت

نوع

128- تا 127

8

sbyte

0 تا 255

8

byte

32768- تا 32767

16

short

0 تا 65535

16

ushort

2147483648- تا 2147483647

32

int

0 تا  4294967295

32

uint

9223372036854775808- تا 9223372036854775807

64

long

0 تا 18446744073709551615

64

ulong

 

از این انواع برای محاسبات عددی استفاده می‌گردد. یک نوع دیگر را نیز می‌توان در این جدول اضافه نمود و آن نوع char است. هر چند شاید از نظر بسیاری از دوستانی که با زبانهای دیگر برنامه‌سازی کار کرده‌اند این تقسیم بندی غلط به نظر آید، اما باید گفت که در زبان C# نوع char نیز نوع خاصی از انواع عددی است که رنجی بین صفر تا 65535 دارد و اندازه آن نیز 16 بیتی است، اما به جای نمایش دادن مقادیر عددی تنها می‌تواند بیان کننده یک کاراکتر باشد. در آینده در این مورد بیشتر توضیح خواهم داد.

 

جدول زیر تمامی انواع عددی اعشاری زبان C# را نمایش می‌دهد.

 

رنج قابل قبول

دقت

اندازه به بیت

نوع

 تا  

7 رقم

32

float

   تا 

15-16 رقم

64

double

  تا  

28-29 رقم دسیمال

128

decimal

 

انواعی از نوع floating point هنگامی استفاده می‌شوند که محاسبات عددی به دقت‌های اعشاری نیاز داشته باشند. همچنین برای منظورهای تجاری استفاده از نوع decimal بهترین گزینه است. این نوع تنها در زبان C# وجود دارد و در زبانهای مشابه به آن نظیر Java چنین نوعی در نظر گرفته نشده است.

 

در یک زبان برنامه‌سازی نتایج بوسیله ایجاد یک سری عبارت تولید می‌گردند. عبارات از ترکیب متغیرها و عملگرها در دستورالعمل‌های یک زبان ایجاد می‌گردند.(توجه نمایید که عبارت معادل expression و دستورالعمل معادل statement می‌باشد که ایندو با یکدیگر متفاوت می‌باشند.) جدول زیر عملگرهای موجود در زبان C#، حق تقدم آنها و شرکت‌پذیری آنها را نشان می‌دهد.

 

شرکت‌پذیری

عملگر(ها)

نوع عمل

از چپ

(x)   x.y   f(x)   a[x]   x++   x--

new   typeof   sizeof   checked   unchecked

عملیات ابتدایی

از چپ

+   -   !   ~   ++x   --x   (T)x

عملیات یکانی

از چپ

*   /  %

عملیات ضربی

از چپ

-   +

عملیات جمعی

از چپ

<<   >>

عمل شیفت

از چپ

< > <= >= is

عملیات رابطه‌ای

از راست

==   !=

عملیات تساوی

از چپ

&

عمل AND منطقی

از چپ

|

عمل OR منطقی

از چپ

^

عمل XOR منطقی

از چپ

&&

عمل AND شرطی

از چپ

||

عمل OR شرطی

از چپ

?:

عمل شرطی

از راست

=   *=  /=   %=  +=  -=  <<=  >>=  &=  ^=  |=

عمل انتساب

 

شرکت‌پذیری از چپ بدین معناست که عملیات از چپ به راست محاسبه می‌شوند. شرکت‌پذیری از راست بدین معناست که تمامی محاسبات از راست به چپ صورت می‌گیرند. به عنوان مثال در یک عمل تساوی، ابتدا عبارات سمت راست تساوی محاسبه شده و سپس نتیجه به متغیر سمت چپ تساوی تخصیص داده می‌شود.

 

مثال 2- عملگرهای یکانی (Unary)

using System;

class Unary

{

  public static void Main()

  {

    int unary = 0;

    int preIncrement;

    int preDecrement;

    int postIncrement;

    int postDecrement;

    int positive;

    int negative;

    sbyte bitNot;

    bool logNot;

    preIncrement = ++unary;

    Console.WriteLine("Pre-Increment: {0}", preIncrement);

    preDecrement = --unary;

    Console.WriteLine("Pre-Decrement: {0}", preDecrement);

    postDecrement = unary--;

    Console.WriteLine("Post-Decrement: {0}", postDecrement);

    postIncrement = unary++;

    Console.WriteLine("Post-Increment: {0}", postIncrement);

    Console.WriteLine("Final Value of Unary: {0}", unary);

    positive = -postIncrement;

    Console.WriteLine("Positive: {0}", positive);

    negative = +postIncrement;

    Console.WriteLine("Negative: {0}", negative);

    bitNot = 0;

    bitNot = (sbyte)(~bitNot);

    Console.WriteLine("Bitwise Not: {0}", bitNot);

    logNot = false;

    logNot = !logNot;

    Console.WriteLine("Logical Not: {0}", logNot);

  }

}

به هنگام محاسبه عبارات، دو عملگر x++ و  x—(که در اینجا کاراکتر x بیان کننده آن است که عملگرهای ++ و – در جلوی عملوند قرار می‌گیرند post-increment و post-decrement) ابتدا مقدار فعلی عملوند (operand) خود را باز می‌گرداند و سپس به عملوند خود یک واحد اضافه کرده یا از آن یک واحد می‌کاهند. عملگر ++ یک واحد به عملوند خود اضافه می‌کند و عملگر – یک واحد از عملوند خود می‌کاهد. بدین ترتیب عبارت x++ معادل است با عبارت x=x+1 و یا x+=1 اما همانطور که گفته شد باید توجه داشته باشید که این عملگرها(++ و --) ابتدا مقدار فعلی عملوند خود را برگشت می‌دهند و سپس عمل خود را روی آنها انجام می‌دهند. بدین معنی که در عبارت x=y++ در صورتیکه در ابتدای اجرای برنامه مقدار x=0 و y=1 باشد، در اولین اجرای برنامه مقدار x برابر با 1 یعنی مقدار y می‌شود و سپس به متغیر y یک واحد افزوده می‌شود، در صورتیکه اگر این عبارت را بصورت x=++y بنویسیم در اولین اجرای برنامه، ابتدا به مقدار متغیر y یک واحد افزوده می‌شود و سپس این مقدار به متغیر x تخصیص داده می‌شود که در این حالت مقدار متغیر x برابر با 2 می‌شود.(در مورد عملگر – نیز چنین است.) پس با این توضیح می‌توان گفت که دو عملگر ++x و –x ابتدا به عملوند خود یک واحد اضافه یا یک واحد از آن کم می‌کنند و سپس مقدار آنها را باز می‌گردانند.

 

در مثال 2، مقدار متغیر unary در قسمت اعلان برابر با 0 قرار گرفته است. هنگامیکه از عملگر ++x استفاده می‌کنیم، به مقدار متغیر unary یک واحد افزوده می‌شود و مقدارش برابر با 1 می‌گردد و سپس این مقدار، یعنی 1، به متغیر preIncrement تخصیص داده می‌شود. عملگر –x مقدار متغیر unary را به 0 باز می‌گرداند و سپس این مقدار را به متغیر preDecrement نسبت می‌دهد.

هنگامیکه از عملگر x-- استفاده می‌شود، مقدار متغیر unary، یا همان مقدار صفر، به متغیر postDecrement تخصیص داده می‌شود و سپس از مقدار متغیر unary یک واحد کم شده و مقدار این متغیر به 1- تغییر می‌کند. سپس عملگر x++ مقدار متغیر unary، یعنی همان 1-، را به متغیر postIncrement تخصیص می‌دهد و سپس یک واحد به مقدار متغیر unary می‌افزاید تا مقدار این متغیر برابر با 0 (صفر) شود.

 

مقدار متغیر bitNot در هنگام اعلان برابر با صفر است. با استفاده از عملگر نقیض بیتی (~) (یا عملگر مکمل‌گیری) متغیر bitNot بعنوان یک بایت در نظر گرفته می‌شود و مقدار آن منفی یا نقیض می‌شود. در عملیات بیتی نقیض بدین معناست که تمامی یکها به صفر و تمامی صفرها به یک تبدیل شوند. در این حالت نمایش باینری عدد صفر یا همان 00000000 به نقیض آن یعنی 11111111 تبدیل می‌گردد.

 

در این مثال به عبارت (sbyte)(~bitNot) توجه نمایید. هر عملی که بر روی انواع short،unshort ، byte و sbyte انجام شود، مقداری از نوع int را باز می‌گرداند. بمنظور اینکه بتوانیم نتیجه دلخواه را به متغیر bitNot تخصیص دهیم باید از فرمت (Type) operator استفاده نماییم که در آن Type نوعی است می‌خواهیم نتیجه ما به آن نوع تبدیل شود و operator عملی است که بر روی متغیر صورت می‌پذیرد. به بیان دیگر چون می‌خواهیم مقدار متغیر bitNot بصورت بیتی در نظر گرفته شود، پس باید نتیجه عمل ما بصورت بیتی در آن ذخیره شود که استفاده از نوع sbyte باعث می‌شود تا نتیجه به فرم بیتی (یا بایتی) در متغیر ما ذخیره شود. باید توجه نمایید که استفاده از فرمت (Type) یا در اصطلاح عمل Casting، در مواقعی که می‌خواهیم تغییری از یک نوع بزرگتر به نوع کوچکتر ایجاد نماییم، مورد استفاده قرار گیرد، چرا که در این حالات ممکن است با از دست دادن اطلاعات مواجه باشیم. در این مثال چون می‌خواهیم نوع بزرگتر int را به(32 بیتی) به نوع کوچکتر sbyte (8 بیتی) تبدیل نماییم، بدین منظور باید بطور صریح از عمل Casting استفاده نماییم تا اطلاعاتی در این تبدیل از بین نرود. در مورد تبدیل انواع کوچکتر به انواع بزرگتر(مثلا تبدیل sbyte به int) نیازی به استفاده از عمل Casting نیست چرا که امکان از بین رفتن اطلاعات وجود ندارد. در ضمن باید به یک نکته مهم توجه نمایید و آن تبدیل انواع علامتدار(Signed) و بدون علامت(Unsigned) به یکدیگر است. در این حالت خطر بسیار مهمی داده‌های شما را تهدید می‌نماید. بحث در مورد مسائل پیچیده‌تر در مورد تبدیل انواع علامتدار و و بدون علامت به یکدیگر در اینجا نمی‌گنجد و سعی می‌کنم تا آنها را در مطالب بعدی و در جای لازم مورد بحث و بررسی قرار دهم.(در صورتیکه برخی از مطالب این قسمتها برای شما به خوبی قابل درک نیست، نگران نباشید چراکه در آینده در مثالهایی که خواهید دید تمامی این مطالب را در عمل نیز حس کرده و با آنها آشنا خواهید شد.)

 

عملگر بعدی که در این برنامه مورد استفاده قرار گرفته است، عملگر نقیض منطقی یا همان "!" است که امکان تغییر مقدار یک متغیر Boolean را از true به false و بالعکس را فراهم می‌آورد. در مثال بالا(مثال شماره 2) مقدار متغیر logNot پس از استفاده از عملگر "!" از false به true تغییر کرده است. با توجه به توضیحات اخیر خروجی زیر از برنامه مثال 2 مورد انتظار است :

Pre-Increment: 1

Pre-Decrement 0

Post-Decrement: 0

Post-Increment -1

Final Value of Unary: 0

Positive: 1

Negative: -1

Bitwise Not: -1

Logical Not: True

مثال 3 – عملگرهای دوتایی

using System;

class Binary

{

  public static void Main()

  {

    int x, y, result;

    float floatResult;

    x = 7;

    y = 5;

    result = x+y;

    Console.WriteLine("x+y: {0}", result);

    result = x-y;

    Console.WriteLine("x-y: {0}", result);

    result = x*y;

    Console.WriteLine("x*y: {0}", result);

    result = x/y;

    Console.WriteLine("x/y: {0}", result);

    floatResult = (float)x/(float)y;

    Console.WriteLine("x/y: {0}", floatResult);

    result = x%y;

    Console.WriteLine("x%y: {0}", result);

    result += x;

    Console.WriteLine("result+=x: {0}", result);

  }

}

خروجی این برنامه به فرم زیر است :

x+y: 12

x-y: 2

x*y: 35

x/y: 1

x/y: 1.4

x%y: 2

result+=x: 9

مثال 3 استفاده‌های متفاوتی از عملگرهای دوتایی را نشان می‌دهد.(منظور از عملگر دوتایی، عملگری است که دارای دو عملوند می‌باشد مانند عملگر جمع "+"). بسیاری از عملگرهای مورد استفاده در این مثال عملگرهای ریاضی هستند و نتیجه عمل آنها مشابه عملی است که از آنها در ریاضیات دیده‌اید. از نمونه این عملگرها می‌توان به عملگرهای جمع "+"، تفریق "-"، ضرب "*" و تقسیم "/" اشاره نمود.

 

متغیر floatResult از نوع اعشاری یا float تعریف شده است. در این مثال نیز صریحاً از عمل Casting جهت اسفاده از دو متغیر x و y که از نوع int هستند، برای انجام عملی که نتیجه‌اش از نوع float است، استفاده کرده‌ایم.

 

در این مثال از عملگر "%" نیز استفاده کرده‌ایم. این عملگر در عملیات تقسیم کاربرد دارد و باقیمانده تقسیم را برمی‌گرداند. یعنی دو عملوند خود را بر یکدیگر تقسیم می‌کند و باقیمانده این تقسیم را برمی‌گرداند.

 

در این مثال همچنین فرم جدیدی از عمل انتساب را بصورت result+=x مشاهده می‌نمایید. استفاده از عملگرهای انتسابی که خود ترکیبی از دو عملگر هستند، جهت سهولت در امر برنامه‌نویسی مورد استفاده قرار می‌گیرند. عبارت فوق معادل result = result+x می‌باشد. یعنی مقدار قبلی متغیر result با مقدار متغیر x جمع می‌شود و نتیجه در متغیر result قرار می‌گیرد.

 

یکی دیگر از انواعی که تا کنون با آن سر و کار داشته‌ایم نوع رشته‌ای (string) است. یک رشته، از قرار گرفتن تعدادی کاراکتر در کنار یکدیگر که داخل یک زوج کوتیشن " " قرار گرفته‌اند، ایجاد می‌گردد. بعنوان مثال "Hi This is a string type". در اعلان متغیرها نیز در صورت تعریف متغیری از نوع رشته‌ای، در صورت نیاز به تخصیص مقدار به آن، حتماً کاراکترهایی که می‌خواهیم بعنوان یک رشته به متغیرمان نسبت دهیم را باید داخل یک زوج کوتیشن " " قرار دهیم. به مثال زیر توجه نمایید.

string Name;

Name = "My name is Hadi";

همانطور که در این مثال مشاهده می‌نمایید، متغیری از نوع رشته‌ای تحت نام Name تعریف شده است و سپس در جایی از برنامه که نیاز به تخصیص مقدار برای این متغیر وجود دارد، عبارت مورد نظر را داخل دو کوتیشن قرار داده و به متغیر خود تخصیص داده‌ایم. رشته‌ها از پر کاربرد ترین انواع در زبان‌های برنامه‌سازی جهت ایجاد ارتباط با کاربر و دریافت اطلاعات از کاربر می‌باشند.(همانطور که در درس قبل اول نیز گفته شد، دستور Console.ReadLine() یک رشته را از ورودی دریافت می‌نماید.) در مثالهایی که در طی درسهای این سایت خواهید دید، نمونه‌های بسیاری از کاربرد انواع مختلف و نیز نوع رشته‌ای را خواهید دید.

درس اول : آغاز کار با C#

درس اول : آغاز کار با C#

 

در این درس با ارائه چند برنامه و مثال ساده به طرز کار زبان C# می‌پردازیم. اهداف این درس عبارتند از :

  • فهم ساختار پایه‌ای یک برنامه C#
  • آشنایی با Namespace
  • آشنایی با کلاس (Class)
  • آشنایی با عملکرد متد Main()
  • آشنایی با ورودی/خروجی یا I/O

 

لیست 1-1، یک برنامة ساده با عنوان Welcome در زبان C#

// Namespace اعلان

using  System;

 

// کلاس آغازین برنامه

class WelcomeCSS

  {

   // آغاز کار اجرای برنامه

   public static void Main()

    {

     // نوشتن متن در خروجی

     Console.WriteLine("Welcome to the C# hamedan!");

    }

  }

برنامة لیست 1-1 دارای 4 پارامتر اصلی است، اعلان Namespace، کلاس، متد Main() و یک دستور زبان C#.

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

 یک نوع کامپایلر که به کامپایلر Command Line معروف است و نوع دیگر کامپایلر Visual است. کامپایلر‌های Command Line

محیطی شبیه به محیط DOS دارند و با دادن یک سری دستورات به اجرا در می‌آیند. کامپایلرهای Visual محیطی همانند ویندوز دارند که با دارا بودن محیط گرافیکی و ابزارهای خاص، برنامه‌نویس را در امر برنامه‌سازی کمک می‌کنند. از نمونه‌های هر یک از کامپایلرها، می‌توان به Microsoft C# Command Line Compiler که یک کامپایلر Command Line و Microsoft Visual C# که یک کامپایلر Visual است، اشاره کرد. البته در حال حاضر بیشتر از کامپایلرهای ویژوال استفاده می‌شود.

من سعی می‌کنم در آینده به توضیح محیط Visual C# و Visual Studio.Net بپردازم. اما فعلاً برای اجرای برنامه‌ها می‌توانید از Visual Studio.Net استفاده کنید. پس از نصب آن، وارد محیط C# شده و در قسمت انتخاب برنامة جدید گزینة Console را جهت اجرای برنامه‌ها انتخاب نمایید.

برای این درس، فعلاً به توضیحات بیشتر دربارة محیط ویژوال نمی‌پردازم اما در آینده به توضیح کامل محیط Visual Studio.Net خواهم پرداخت.

برای اجرای کد بالا در صورتیکه از محیط ویژوال استفاده می‌کنید باید بر روی دکمة Run کلیک کنید و در صورتیکه کامپایلر Command Line دارید با دستور  زیر می‌توانید برنامه را اجرا کنید : csc Welcome.cs

پس از اجرای برنامه، کامپایلر برای شما یک فایل قابل اجرا(Executable) تحت نام Welcome.exe تولید می‌کند.

نکته : در صورتیکه از Visual Studio.Net(VS.Net) استفاده کنید، پس از اجرای برنامه، یک صفحه برای نمایش خروجی به سرعت باز شده و بسته می‌شود و شما قادر به دیدن خروخی نخواهید بود. برای اینکه بتوانید خروجی برنامه را ببینید، در انتهای برنامه دستور زیر را وارد نمایید :

Console.ReadLine();

 استفاده از این دستور باعث می‌شود تا برنامه منتظر دریافت یک ورودی از کاربر بماند، که در این حالت شما می‌توانید خروجی برنامه خود را دیده و سپس با زدن کلید Enter برنامه را خاتمه دهید.

 نکتة دیگری که در مورد زبان برنامه‌نویسی C# باید مورد توجه قرار دهید اینست که این زبان Case Sensitive است، بدین معنا که به حروف کوچک و بزرگ حساس است یعنی برای مثال ReadLine با readLine متفاوت است به طوریکه اولی جزو دستورات زبان C# و دومی به عنوان یک نام برای متغیر یا یک تابع که از طرف کاربر تعریف شده است در نظر گرفته می‌شود.

 اعلان Namespace به سیستم اعلان می‌نماید که شما از توابع کتابخانه‌ای  System  جهت اجرای برنامه‌ها خود استفاده می‌نمایید. دستوراتی مانند WriteLine و ReadLine جزو توابع کتابخانه‌ای System می‌باشند. اغلب دستورات و توابع مهم و کلیدی استفاده از کنسول ورودی/خروجی در این کتابخانه می‌باشد. در صورتیکه در ابتدای برنامه از using System استفاده نکنید، یابد در ابتدای هر یک از دستورات برنامه که مربوط این کتابخانه است، از کلمة System استفاده نمایید. بعنوان مثال در صورت عدم استفاده از using System باید از دستور System.Console.WriteLine() به جای Console.WriteLine() استفاده نمایید.

 تعریف کلاس،Class Welcome CSS، شامل تعریف داده‌ها(متغیرها) و متدها جهت اجرای برنامه است. یک کلاس، جزو معدود عناصر زبان C# است که بوسیلة آن می‌توان به ایجاد یک شی (Object) از قبیل واسط‌ ها (Interfaces) و ساختارها(Structures)، پرداخت. توضیحات بیشتر در این زمینه در درس‌های آینده ذکر می‌شوند. در این برنامه کلاس هیچ داده‌ و متغیری ندارد و تنها شامل یک متد است. این متد، رفتار(Behavior) این کلاس را مشخص می‌کند.

 متد درون این کلاس بیان می‌کند که این کلاس چه کاری را پس از اجرا شدن انجام خواهد داد. کلمة کلیدی Main() که نام متد این کلاس نیز می‌باشد جزو کلمات رزرو شده زبان C# است که مشخص می‌کند برنامه از کجا باید آغاز به کار نماید. وجود متد Main() در تمامی برنامه‌های اجرایی ضروری است. در صورتیکه یک برنامه حاوی متد Main() نباشد بعنوان توابع سیستمی همانند dll های ویندوز در نظر گرفته می‌شود.

قبل از کلمة Main() کلمه دیگری با عنوان static آورده شده است. این کلمه در اصطلاح Modifier می‌گویند. استفاده از static برای متد Main() بیان می‌دارد که این متد تنها در در همین کلاس قابل اجراست و هیچ نمونه‌ای (Instance) دیگری از روی آن قابل اجرا نمی‌باشد. استفاده از static برای متد Main() الزامی است زیرا در ابتدای آغاز برنامه هیچ نمونه‌ای از هیچ کلاس و شی‌ای موجود نمی‌باشد و تنها متد Main() است که اجرا می‌شود. (در صورتیکه با برخی اصطلاحات این متن از قبیل کلاس، شی، متد و نمونه آشنایی ندارید، این به دلیل آنست که این مفاهیم جزو مفاهیم اولیة برنامه‌نویسی شی‌گرا (OOP) هستند. سعی می‌کنم در درس‌های آینده به توضیح این مفاهیم نیز بپردازم، ولی فعلاً در همین حد کافی می‌باشد.)

 هر متد باید دارای یک مقدار بازگشتی باشد، یعنی باید مقداری را به سیستم بازگرداند، در این مثال نوع بازگشتی void تعزیف شده است که نشان دهنده آنست که این متد هیچ مقداری را باز نمی‌گرداند یا به عبارت بهتر خروجی ندارد. همچنین هر متد می‌تواند دارای پارامترهایی نیز باشد که لیست پارامترهای آن در داخل پرانتزهای جلوی آن قرار می‌گیرد. برای سادگی کار در این برنامه متد ما دارای هیچ پارامتری نیست ولی در ادامة همین درس به معرفی پارامترها نیز می‌پردازم.

 متد Main() رفتار و عمل خود را بوسیله Console.WriteLine(…) مشخص می‌نماید. Console کلاسی در System است و WriteLine() متدی در کلاس  Console. در زبان C# از اپراتور "." (نقطه dot) جهت جداسازی زیرروتین‌ها و زیرقسمتها استفاده می‌کنیم. همانطور که ملاحظه می‌کنید چون WriteLine() یک متد درون کلاس Console است به همین جهت از "." جهت جداسازی آن استفاده کرده‌ایم.

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

 تامی دستورات (Statements) با ";"، سمی کولون، پایان می‌یابند. کلاس‌ها و متد‌ها با } آغاز شده و با { خاتمه می‌یابند. تمامی دستورات بین { } یک بلوک را می‌سازند.

 بسیاری از برنامه‌ها از کاربر ورودی دریافت می‌کنند. انواع گوناگونی از این ورودی‌ها می‌توانند به عنوان پارامتری برای متد Main() در نظر گرفته شوند. لیست 2-1 برنامه‌ای را نشان می‌دهد نام کاربر را از ورودی دریافت کرده و آن را بر روی صفحه نمایش می‌دهد. این ورودی به صورت پارامتری برای متد Main() در نظر گرفته شده است.

 لیست 2-1 : برنامه‌ای که ورودی را از کاربر، بعنوان پارامتر Main()، دریافت می‌کند.

// Namespace اعلان

using System;

// کلاس آغازین برنامه

class NamedWelcome

  {

   // آغاز اجرا برنامه

   public static void Main(string[] args)

     {

      // نمایش بر روی صفحه

      Console.WriteLine("Hello, {0}!", args[0]);

      Console.WriteLine("Welcome to the C# hamedan!");

     }

  }

توجه داشته باشید که این برنامه، ورودی را به صورت Command-Line دریافت می‌کند و در هنگام اجرای برنامه باید ورودی را در Command-Line وارد نمایید. در صورتیکه ورودی را وارد ننمایید برنامه دچار مشکل شده و متوقف خواهد شد.

 همان طور که در لیست 2-1 مشاهده می‌نمایید، پارامتر متد Main() با عنوان args مشخص شده است. با استفاده از این نام در داخل متد می‌توان آن استفاده نمود. نوع این پارامتر از نوع آرایه‌ای از نوع رشته (string[]) در نظر گرفته شده است. انواع(types) و آرایه‌ها را در درس‌های بعدی بررسی می‌کنیم. فعلاً بدانید که آرایه رشته‌ای جهت نگهداری چندین کاراکتر مورد استفاده قرار می‌گیرد. [] مشخص کننده آرایه هستند که مانند یک لیست عمل می‌کند.

 همانطور که ملاحظه می‌کنید در این برنامه دو دستور Console.WriteLine(…) وجود دارد که اولین دستور مقداری با دستور دوم متفاوت است. همانطور که مشاهده می‌کنید داخل دستور Console.WriteLine(…) عبارتی به شکل {0} وجود دارد. این آرگومان، نشان می‌دهد که به جای آن چه مقداری باید نمایش داده شود که در این جا args[0] نشان داده می‌شود. عبارتی که داخل " " قرار دارد عیناً در خروجی نمایش داده می‌شود، به جای آرگومان {0}، مقداری که پس از " قرار دارد، قرار می‌گیرد. حال به آرگومان بعدی یعنی args[0] توجه کنید. مقدار صفر داخل [] نشان می‌دهد که کدام عنصر از آرایه مورد استفاده است. در C# اندیس آرایه از صفر شروع می‌شود به همین جهت برای دسترسی به اولین عنصر آرایه باید از اندیس صفر استفاده کنیم.(همانطور که قبلاً نیز کفتم آرایه‌ها را در درس‌های آینده توضیح خواهم داد، هدف از این درس تنها آشنایی با C# است.!)

 مجدداً به آرگومان {0} بازگردیم. این آرگومان نشان می دهد که یک مقدار باید در رشته خروجی قرار گیرد، این مقدار همان args[0]  است. اگر شما این برنامه را از طریق Command-Line اجرا نمایید خروجی شبیه به زیر خواهید گرفت :

>Hello!, hadi!

>Welcome to C# hamedan!

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

Console.WriteLine("Hello! ,{0} ,{1}, {2}",args[0],args[1],args[2]);

این خط از برنامه سه مقدار args[0],args[1],args[2] را در خروجی به ترتیب نمایش می‌دهد. ملاحظه می‌نمایید که چون 3 مقدار را می‌خواهیم نمایش دهیم، سه بار از آرگومان {n} استفاده کرده‌ایم و هر بار یک واحد به مقدار قبلی افزوده‌ایم. در آینده بیشتر با این مفاهیم آشنا می‌شویم.

 مطلبی که باید در مورد لیست 2-1 به آن توجه شود آنست که این برنامه تنها از طریق  Command-Lineقابل اجراست و در صورتیکه کاربر از این مطلب که برنامه باید دارای ورودی به صورت Command-Line باشد، بی اطلاع باشد و ورودی را در Command-Line وارد نکند، برنامه متوقف شده و اجرا نمی‌شود. پس برای رفع چنین مشکلی باید از روش بهتری جهت دریافت ورودی از کاربر استفاده کرد.

 لیست 3-1 : یک برنامه که قابلیت محاوره با کاربر را دارد.

// Namespace اعلان

using System;

 

// کلاس آغازین برنامه

class InteractiveWelcome

  {

   //آغاز اجرای برنامه

   public static void Main()

    {

     // متنی بر روی صفحه نمایش داده می‌شود

     Console.Write("What is your name?: ");

     //متنی نمایش داده شده و برنامه منتظر دریافت ورودی می‌ماند

     Console.Write("Hello, {0}! ", Console.ReadLine());

     Console.WriteLine("Welcome to the C# hamedan!");

    }

  }

همانطوریکه در این برنامه دیده می شود، متد Main() دارای پارامتر نیست. در عوض یک خط به متن برنامه لیست 2-1 اضافه شده است. در اولین خط از این برنامه، متنی با عنوان اینکه نام شما چیست؟ بر روی صفحه ظاهر می‌شود. سپس در خط بعدی پس از نوشتن کلمه Hello, ، برنامه منتظر دریافت ورودی از کاربر می‌شود. بدین معنی که این بار تا زمانیکه کاربر متنی را به عنوان نام خود وارد نکند اجرای برنامه به پیش نخواهد رفت و خط بعدی اجرا نمی‌شود. این برنامه روش ایجاد ارتباط از طریق برنامه با کاربر را نمایش می‌دهد. در این مثال کاربر دقیقاً متوجه می‌شود که چه زمانی باید اطلاعات را وارد نماید و این اطلاعات چه باید باشد در حالیکه در مثال قبل چنین نبود. همانگونه که می‌بینید در این برنامه آرگومان {0} مستقیماً از طریق دستور Console.ReadLine() دریافت می‌شود و بلافاصله در خروجی نمایش داده می‌شود. دستور ReadLine() نیز یکی از متدهای کلاس Console است که بوسیله آن رشته ورودی خوانده می‌شود.

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

What is your name?:

(سپس برنامه منتظر دریافت متنی از ورودی توسط کاربر می‌ماند)

(پس از اینکه کاربر رشته‌ای را وارد کرد و کلیدEnter را فشار داد، متن زیر نمایش داده می‌شود.)

Hello, hadi!

(سپس اجرای برنامه به دستور بعدی منتقل می‌شود)

Welcome to the C# hamedan!

 

خروجی کامل برنامه :

What is your name?:

Hello, اhadi! Welcome to the C# hamedan!

توجه کنید که ReadLine() به عنوان یک متد، مقداری را به سیستم بازمی‌گرداند. این مقدار در این برنامه به آرگومان {0} برگردانده می‌شود. این خط از برنامه را می‌توان طور دیگری هم نوشت :

string myName=Console.ReadLine();

Console.WriteLine("Hello, {0}!",myName);

 

در این حالت ما یک متغیر از نوع رشته با نام myName تعریف کرده‌ایم که مقدار ورودی در آن ذخیره می‌شود و سپس از این مقدار به عنوان مقداری‌ که {0} می‌پذیرد استفاده کرده‌ایم.

 در این درس آموختید که ساختار کلی یک برنامه C# چگونه است. هر برنامه C# از یک کلاس اصلی تشکیل می‌شود که این کلاس شامل داده‌ها و متغیرها و متدهایی می‌باشد. متد آغازین برنامه که برنامه با آن شروع به اجرا می‌کند، متد Main() است. با استفاده از توابع کتابخانه‌ای می‌نوان به کلاسها و متدهای C# دسترسی پیدا کرد. از جمله این توابع System بود که یکی از کلاسهای آن Console و چند متد این کلاس،  متدهای WriteLine() و ReadLine() بودند.

در اینجا اولین درس به پایان رسید. از همه دوستانی که این مطلب را می‌خوانند تقاضا دارم نظرات و پیشنهادات خود را برای ما ارسال کنند.

سر فصل های آموزش C#.Net

آموزش C#.Net

سر فصل های آموزش C#.Net

  1. مفاهیم اولیه زبان #C          :    فهم ساختار پایه‌ای یک برنامه در #C، آشنایی با Namespace، آشنایی با کلاس و ....
  2. متغیرها، عبارات و عملگرها  :  آشنایی با متغیرها، آشنایی با انواع پیش فرض زبان، آشنایی با عبارات، آشنایی با رشته‌ها، آشنایی با آرایه‌ها و ....
  3. دستورالعمل‌های کنترلی - شرطی : آشنایی با دستور if ، آشنایی با دستور switch و break ، آشنایی با دستور goto و ....
  4. دستورالعمل‌های کنترلی - حلقه‌ها : آشنایی کلی با حلقه‌ها - حلقه while - حلقه do while - حلقه for و foreach و ....
  5. متدها : ساختار یک متد، انواع متدها، ایجاد نمونه جدید از اشیاء، انواع پارامترهای متد، فراخوانی متد، آشنایی با کلمه کلیدی this و ....
  6. Namespaces : آشنایی با Namespace - هدایتگر using - هدایتگر alias - اعضای یک Namespace و ....
  7. کلاسها : درک کاملتر کلاسها، سازنده و تخریب کننده در کلاسها ، اعضای کلاس و ....
  8. ارث‌بری کلاسها : پیاده‌سازی کلاس پایه ، کلاسهای مشتق شده، مقدار دهی کلاس پایه، فراخوانی اعضای کلاس پایه، پنهان سازی اعضای کلاس
  9. چند ریختی Polymorphism : آشنایی با مفهوم چند ریختی، متد‌های مجازی، Override کردن متدها، استفاده از چندریختی در برنامه‌ها و ....
  10. ویژگیها (Properties) : موارد استفاده، پیاده‌سازی و ایجاد property، ایجاد property های فقط خواندنی و فقط نوشتنی و ....
  11. اندیکسر (Indexer) : پیاده‌سازی اندیکسر، سرریزی اندیکسر، اندیکسرهای چند پارامتری، نکات پیشرفته درباره اندیکسرها و ....
  12. ساختارها (Structures) : ساختار چیست؟، پیاده‌سازی و استفاده از یک ساختار، تفاوت ساختار و کلاس و ....
  13. واسطها و رابطها (Interfaces) : مفهوم کلی واسطها، تعریف یک واسط، استفاده از interface، پیاده‌سازی ارث‌بری در واسطها و ....
  14. رخداد (Event) و delegate : درک مفهوم delegate، رخداد چیست؟ پیاده‌سازی رخدادها و delegate ها و ....
  15. Exception Handling : درک مفهوم استثناء و چگونگی برخورد با آن، بررسی بلوکهای try/catch برای مقابله با استثناء و بلوک finally ....
  16. صفتها (Attribute) : صفتها چه هستند و چگونه از آنها استفاده می‌کنیم، پارامترهای صفتها و انواع آنها، ساخت صفتهای شخصی و .... 
  17.  انواع شمارشی (Enum) : انواع شمارشی چه هستند، چگونه تولید شده و چگونه مورد استفاده قرار می گیرند، موارد استفاده از آنها و ....