ساختار یک برنامه کنسول ساده در سی شارپ
در این مقاله، نگاه دقیق تری به برنامه ی کنسول ساده ای که در فصل 2 ایجاد کردیم، می اندازیم و ساختار آن را کمی بررسی می کنیم. این کدها به صورت زیر هستند(نام این برنامه ConsoleApplication1 است):
مثال شماره 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Output text to the screen.
Console.WriteLine("The first app in Beginning C# Programming!");
Console.ReadKey();
}
}
}
شما بلافاصله می توانید ببینید که تمام عناصر قواعد نوشتاری(سینتکس) که در بخش قبلی توضیح دادیم، در اینجا نیز وجود دارند؛ یعنی سمی کالن ها، آکولادها و کامنت ها و تورفتگی کدها.
مهمترین بخش از کدها، به صورت زیر هستند:
static void Main(string[] args)
{
// Output text to the screen.
Console.WriteLine("The first app in Beginning C# Programming!");
Console.ReadKey();
}
این همان کدی است که وقتی برنامه کنسول خود را اجرا می کنیم، اجرا می شود. خب، برای اینکه دقیق تر گفته باشیم، بلوک کدهایی که در داخل آکولادها قرار دارند، اجرا می شوند. خطی که حاوی کامنت است، کاری انجام نمی دهد؛ همان طور که قبلاً هم گفته شد؛ و از آن برای توضیح دادن کدها استفاده می شود. دو خط کد دیگر، یک متن را در پنجره کنسول بعنوان خروجی ایجاد می کنند و به ترتیب منتظر پاسخ می مانند، با اینکه نیازی نیست فعلاً شما در مورد مکانیزم دقیق عملکرد آنها نگران باشید.
توجه کنید که چگونه به این کدها که به طور خلاصه در فصل قبل نشان داده شده بوند، دست یافتیم؛ ما می توانیم این کار را با استفاده از کلمات کلیدی region# و endregion# انجام دهیم، این دستورات، نقطه شروع و پایان یک ناحیه از کدها را مشخص می کنند که می تواند گسترده یا جمع شود. بعنوان مثال، می توانیم کد تولید شده را برای برنامه ConsoleApplication1 به صورت زیر اصلاح کنیم:
#region Using directives
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
#endregion
این کار به ما امکان می دهد تا این کدها را در داخل یک خط، جمع کنیم و یا آن را دوباره گسترش دهیم. بعداً در مورد جزئیات این کار توضیح خواهیم داد. دستور using که در بالا اضافه شده و فضای نام(namespace) به کار رفته پس از آن، بعداً در انتهای این فصل توضیح داده خواهند شد.
نکته: هر کلمه کلیدی که با یک علامت # شروع شده باشد، یک دستور پیش پردازنده(preprocessor) است و یک کلمه کلیدی سی شارپ محسوب نمی شود. به غیر از دو کلمه کلیدی region# و endregion# ، اینها می تواند بسیار پیچیده باشند و کاربرد بسیار خاصی دارند. خودتان می توانید در این موضوع بیشتر تحقیق کنید. برای انجام این کار، به این لینک مراجعه کنید.
فعلاً در مورد دیگر کدها در مثال بالا نگران نباشید، زیرا هدف این چند فصل این است که سینتکس پایه ی سی شارپ را توضیح دهند. بنابراین در مورد چگونگی اجرای این برنامه در چاپ با دستور Console.WriteLine() نگران نباشید. بعداً به وضوح در مورد این کد بحث خواهیم کرد.
متغیرها در سی شارپ
همان طور اخیرا ذکر شد، متغیرها با ذخیره سازی داده ها مرتبط هستند. به طور کلی، می توانیم به متغیر ها در حافظه کامپیوتر، به چشم یک جعبه(یا ظرف) که در درون آن چیزی قرار دارد، نگاه کنیم. ما می توانیم در درون یک جعبه، چیزهایی را قرار دهیم و یا آن را از جعبه بیرون بیاوریم؛ و یا اینکه می توانیم فقط به داخل جعبه نگاه کنیم تا اگر چیزی در داخل آن باشد، متوجه شویم. متغیرها اینگونه هستند. ما می توانیم داده هایی را در آنها قرار دهیم یا آن را خالی کنیم یا (در صورت نیاز) فقط به آن (مقدار) نگاه کنیم.
با اینکه تمام داده های درون یک کامپیوتر با یکدیگر مشابه هستند(همه از 0 ها و 1 ها تشکیل شده اند)، اما متغیرها شکل های متفاوتی دارند؛ که به آنها نوع داده(type) گفته می شود. اگر دوباره به مثال جعبه ها برگردیم، می دانیم که جعبه ها شکل و اندازه های متفاوتی دارند، بنابراین برخی از اشیاء تنها در جعبه های خاصی قرار می گیرند.
علت این امر، این است که نوع داده های مختلف، ممکن است به متدهای متفاوتی برای دستکاری نیاز داشته باشند، و با محدود کردن متغیرها به نوع های(types) مختلف، می توانیم از مخلوط شدن آنها اجتناب کنیم. بعنوان مثال، منطقی نیست که 0 ها و 1 هایی که یک تصویر را تشکیل می دهند، بعنوان یک فایل صوتی به کار ببریم.
برای استفاده از متغیرها، باید ابتدا آنها را تعریف کنیم. این یعنی اینکه ما باید آنها را برابر با یک نام قرار دهیم و یک نوع داده(type) نیز برایش مشخص کنیم. پس از اینکه متغیرها را تعریف کردیم، می توانیم از آنها بعنوان واحدهای ذخیره سازی، در همان نوعی که تعریف شده اند استفاده کنیم. سینتکس یا قاعده ی نوشتاری سی شارپ برای متغیرها، تنها با نوع و نام متغیر مشخص می شود:
نام + نوع;
اگر سعی کنید از یک متغیر که از قبل تعریف نشده است استفاده کنید، کدهای شما کامپایل نخواهد شد، اما در این مورد، کامپایلر مشکل را گزارش می دهد؛ بنابراین، این یک خطای خطرناک نیست. اگر سعی کنیم از یک متغیر، بدون انتساب دادن آن به یک مقدار، استفاده کنیم، یک خطا ایجاد می شود، اما کامپیوتر، این را هم دوباره، تشخیص می دهد.
نوع داده های ساده در سی شارپ
نوع داده های ساده، به نوع هایی از قبیل اعداد و بولین هایی(true یا false) گفته می شود که سنگ بنای اصلی برنامه ها را تشکیل می دهند.نوع داده های ساده، برخلاف نوع داده های پیچیده، نمی توانند فرزند یا خصوصیت(attribute) داشته باشند. اکثر نوع داده های ساده ی در دسترس، عددی هستند؛ که در نگاه اول، کمی عجیب به نظر می رسند- اما آیا برای ذخیره یک عدد، تنها به یک نوع داده، نیاز داریم؟
علت اینکه برای اعداد، نوع داده های فراوانی وجود دارد، به خاطر مکانیک ذخیره سازی اعداد به صورت 0 ها و 1ها در حافظه یک کامپیوتر است. برای اعداد صحیح، ما از تعدادی بیت (یعنی رقم های 0 یا 1) استفاده می کنیم و عدد خود را در فرمت باینری مشخص می کنیم. یک متغیر که N بیت را ذخیره می کند، به ما امکان می دهد تا هر عددی را بین 0 و (2N − 1) در آن مشخص کنیم. هر عددی که بیشتر از این مقدار باشد، بزرگ محسوب می شود و در این متغیر جا نمی شود. بعنوان مثال، فرض کنید یک متغیر داریم که می تواند دو بیت را ذخیره کند. نگاشت بین اعداد صحیح و بیت های مشخص کننده ی اعداد صحیح، به صورت زیر خواهد بود:
0 = 00
1 = 01
2 = 10
3 = 11
اگر بخواهیم اعداد بیشتری را ذخیره کنیم، به بیت های بیشتری نیاز داریم(سه بیت، به ما امکان می دهد تا اعدادی بین 0 تا 7 را ذخیره کنیم). دو بیت در بالا به ما امکان می دهد تا اعداد از 0 تا 3 را مشخص کنیم. نتیجه ی اجتناب ناپذیر این سیستم این است که ما برای اینکه بتوانیم هر عدد قابل تصور را ذخیره کنیم، به بینهایت بیت نیاز داریم؛ که در (حافظه) کامپیوتر ما جا نمی شود.
حتی اگر به تعداد کافی، بیت برای هر عدد وجود داشته باشد، استفاده از تمام این بیت ها، برای یک متغیر که بعنوان مثال، فقط باید اعداد بین 0 تا 10 را ذخیره کند، موثر نیست(زیرا فضای ذخیره سازی هدر داده می شود). چهار بیت، در اینجا کار ما را راه می اندازد و به ما امکان می دهد تا مقادیر بسیار بیشتری را در این محدوده از فضای حافظه ذخیره کنیم.
به جای آن، می توانیم از یک عدد که نوع آن مختلف باشد، برای ذخیره اعداد با برد متفاوت استفاده کنیم؛ این نوع ها، از مقادیر مختلفی از حافظه (تا 64 بیت) استفاده می کنند. این نوع داده ها، در جدول 3.1 نشان داده شده اند.
نکته: هریک از این نوع داده ها، از یکی از نوع داده های استاندارد که در فریم ورک دات نت تعریف شده اند، استفاده می کند. همان طور که در فصل 1 توضیح داده شده است، این استفاده از نوع داده های استانداد، باعث قابلیت همکاری در زبان(language interoperability) می شوند. نام هایی که ما برای این نوع داده ها در سی شارپ استفاده می کنیم، نام های متعاری برای نوع داده ها در این فریم ورک هستند. جدول 3.1 نام این نوع داده ها را همان طور که به آنها در کتابخانه فریم ورک دات نت اشاره می شود، لیست کرده است.
(جدول 3.1)

کاراکتر u که در جدول بالا، قبل از برخی نام ها قرار دارد مخفف کلمه unsigned به معنی بدون علامت می باشد و نشان می دهد که ما نمی توانیم اعداد منفی را در متغیرهایی که از این نوع داده استفاده می کنند، استفاده کنیم. همان طور که در ستون سمت راست جدول بالا، نشان داده شده است.
البته ممکن است ما به مقادیر ممیز شناور نیز نیاز پیدا کنیم، یعنی اعدادی که صحیح نیستند. ما می توانیم از نوع داده های زیر برای اعداد ممیز شناور استفاده کنیم:
- float
- double
- decimal
دو مورد اول، اعداد ممیز شناور به شکل \(6m \times 2^{e}\) را ذخیره می کنند. به طوری که مقادیر مجاز برای m و e برای هر نوع، متفاوت است. مورد سوم یعنی decimal از فرم جایگزین \(6m \times 10^{e}\) استفاده می کند. این سه نوعِ داده، در جدول 3.2 نشان داده شده اند و مقادیر مجاز برای m و e و حد آنها در اعداد حقیقی مشخص شده اند.
(جدول 3.2: نوع های اعداد ممیز شناور)

علاوه بر نوع داده های عددی، سه نوع داده ساده دیگر نیز د دسترس هستند(جدول 3.3 را مشاهده کنید).
(جدول 3.3 : نوع داده های متن و بولین)

توجه کنید که برای تعداد کاراکترهای تشکیل دهنده ی یک رشته(string) حدِ بالا وجود ندارد؛ زیرا رشته می تواند از مقادیر مختلف حافظه استفاده کند. نوعِ داده ی بولین bool یکی از متداول ترین نوعِ داده در سی شارپ است که استفاده از آن رایج است و در واقع نوع های مشابه این، به همین اندازه در دیگر زبان های برنامه نویسی استفاده می شوند. اگر یک متغیر داشته باشیم که بتواند یا true باشد یا false ، وقتی صحبت از منطق در یک برنامه می شود، پیامدهای مهمی دارد.
بعنوان یک مثال ساده، فرض کنید چه تعداد سوال را می توانیم با true یا false (به صورت بله یا خیر) ایجاد کنیم. انجام مقایسه بین مقادیر متغیرها یا اعتبار سنجی ورودی ها، تنها دو کاربرد برنامه نویسی برای متغیرهای بولین است که به زودی می توانید آن را آزمایش کنید.
اکنون که این نوع داده ها را مشاهده کرده اید، قصد داریم به یک مثال که کاربرد آنها را نشان می دهد بپردازیم. در مثال خودتان امتحان کنید زیر، از برخی کدها استفاده می کنیم که در آن دو متغیر تعریف می کنیم و مقادیری را به آنها انتساب می دهیم، و سپس این مقادیر را در خروجی نمایش می دهیم.
خودتان امتحان کنید:
1. یک برنامه کنسول جدید به نام Ch03Ex01 ایجاد کنید و آن را در آدرس C:\BeginningCSharp7\Chapter03 ذخیره کنید.
2. قطعه کد زیر را در Program.cs اضافه کنید:
static void Main(string[] args)
{
int myInteger;
string myString;
myInteger = 17;
myString = "\"myInteger\" is";
Console.WriteLine($"{myString} {myInteger}");
Console.ReadKey();
}
3. کد را اجرا کنید. نتیجه در تصویر 3.1 نشان داده شده است.
(تصویر 3.1)

این کد چگونه کار می کند
این کدها وظایف زیر را انجام می دهند:
1. دو متغیر را تعریف می کند.
2. به این دو متغیر، مقادیری را انتساب می دهد.
3. مقدار این دو متغیر را در کنسول، بعنوان خروجی نشان می دهد.
تعریف متغیرها در این برنامه به صورت زیر است:
int myInteger;
string myString;
در خط اول از کد بالا، یک متغیر از نوع int تعریف می شود و نام آن را myInteger قرار داده ایم و در خط دوم، یک متغیر از نوع string به نام myString ایجاد کرده ایم.
نکته: نام گذاری متغیرها حد و حدودی دارد؛ ما نمی توانیم هر دنباله ای از کاراکترها را برای نام متغیر انتخاب کنیم. بعداً در بخش نام گذاری متغیرها، در این موضوع صحبت خواهیم کرد.
در دو خط بعدی از کدها، مقادیر را به صورت زیر انتساب می دهیم:
myInteger = 17;
myString = "\"myInteger\" is";
در اینجا، ما دو مقدار ثابت (که در کدها به آنها مقادیر لیترال گفته می شود) را با استفاده از عملگر انتساب(یعنی = ) به متغیرها انتساب می دهیم( در بخش عبارت ها، در این فصل اطلاعات بیشتری در مورد عملگرها ارائه خواهیم داد). در کد بالا، ما عدد صحیح(integer) 17 را به متغیر myInteger انتساب می دهیم و رشته ی زیر را (به همراه علامات نقل قول) به متغیر myString انتساب می دهیم:
"myInteger" is
وقتی که ما مقادیر لیترال رشته ای را به این صورت انتساب می دهیم، ضروری است که از علامات دابل کوتیشن برای محصور کردن رشته استفاده کنیم. اما وقتی چنین کاری را انجام دهیم، قرار دادن برخی کاراکترها در داخل این رشته ممکن است مشکل ایجاد کند؛ مثل قرار دادن کارکترهای دابل کوتیشن. برای حل این مشکل، باید از برخی کاراکترها برای گریز از این مشکل استفاده کنیم تا کاراکتری که می خواهیم در داخل علامات دابل کوتیشن اضافه شود. در مثال زیر، ما از کاراکتر گریز بک اسلش(\) برای اینکه از علامت دابل کوتیشن در داخل یک جفت دابل کوتیشنِ یک رشته استفاده کنیم، استفاده کرده ایم:
myString = "\"myInteger\" is";
اگر ما از این کاراکترهای گریز استفاده نکنیم و سعی کنیم کد زیر را مورد استفاده قرار دهیم، با یک خطای کامپایلر مواجه خواهیم شد:
myString = ""myInteger" is";
توجه کنید که انتساب دادن لیترال های رشته ای، یک موقعیت دیگر است که ما باید مراقب باشیم که در خط، شکستگی وجود نداشته باشد. زیرا کامپایلر سی شارپ لیترال های رشته ای که در بیش از یک خط گسترش یافته باشند را رد می کند. اگر بخواهیم در خط، یک شکستگی ایجاد کنیم، می توانیم از یک کاراکتر گریز، به نام newline در رشته خود به صورت n\ استفاده کنیم. بعنوان مثال، به انتساب زیر توجه کنید:
myString = "This string has a\nline break.";
این رشته در دو خط در کنسول نمایش می یابد؛ به صورت زیر:
This string has a
line break.
تمام عبارت های گریز، از یک بک اسلش و به دنبال آن یک مجموعه از کاراکترهای کوچک ایجاد شده اند(لیست آنها بعداً نشان داده خواهد شد). به دلیل اینکه این نماد (یعنی بک اسلش) برای این کار (گریز) انتخاب شده است، برای خود بک اسلش نیز یک کاراکتر گریز ایجاد شده است که از دو بک اسلش (\\) ایجاد شده است. دوباره به کدها برمی گردیم؛ یک روش new line دیگر وجود دارد که باید نگاهی به آن بیندازیم:
Console.WriteLine($"{myString} {myInteger}");
این یک ویژگی جدید به نام درون یابی رشته ای(String Interpolation) است و شبیه به متد نوشتن متن در کنسول است که ما در مثال اول مشاهده کردیم، اما اکنون ما متغیرهای خود را مشخص می کنیم. هنوز زود است که در این خط کد عمیق شویم. اما همین کافی است که بگوییم: این تکنیکی است که از آن در بخش اول از این کتاب، برای نشان دادن متن در خروجی پنجره کنسول استفاده می شود.
از این متد، برای خروجی دادن متن در کنسول استفاده می شود؛ و از آن در مثال های آینده استفاده خواهیم کرد. در نهایت، این کد شامل خطی است که در مثال های قبل از آن برای برای صبر کردن برای ورودی مقدار کاربر، قبل از پایان کار استفاده می شود.
Console.ReadKey();
دوباره، می گوییم، در مورد این کدها فعلا بحث نمی کنیم، اما بعداً آنها را توضیح خواهیم داد. فعلاً فقط بدانید که این کد اجرای کدها را متوقف می کند، تا زمانی که یک دکمه را فشار دهید.
کتاب آموزش سی شارپ, آموزش برنامه نویسی, آموزش سی شارپ
- بازدید: 522
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.