حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

آموزش کامل سی شارپ به زبان ساده + 40 ساعت فیلم آموزش C# رایگان

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

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
سرفصل های این مطلب
  1. معرفی آموزش سی شارپ و سرفصل ها
    1. بخش مقدماتی
    2. بخش پیشرفته
    3. بخش برنامه نویسی بانک های اطلاعاتی در زبان سی شارپ
  2. ابزارهای مورد نیاز دوره
    1. ویندوز 7، 8 یا 8.1 یا ویندوز 10 کدام بهتر است؟
    2. معرفی Visual Studio  | ویژوال استودیو چیست؟
  3. آشنایی با ساختار .NET Framework
    1. تاریخچه .NET Framework
    2. مروری بر ساختار کلی دات نت و سرویس های آن
    3. آشنایی با نقش .NET Framework
  4. آشنایی با CLR و JIT و مدیریت حافظه
    1. اجرای کدها در دات نت و سرویس JIT و اجرای مدیریت شده کد ها
    2. مدیریت حافظه و سرویس GC
  5. آشنایی با محیط Visual Studio
  6. ساختار برنامه ها و کامپایلر
  7. دستورات کنسول و متغیرها
    1. دستورات اولیه محیط Console
    2. دستور Console.Write
    3. دستور Console.WriteLine
    4. دستور Console.ReadKey
    5. متغیرها و شیوه تعریف و استفاده از آنها
    6. دستورات زبان سی شارپ
    7. نوشتن یادداشت یا Comment برای کدها
    8. یادداشت تک خطی
    9. یادداشت های چند خطی
  8. نوع های داده اولیه
    1. نوع داده رشته ای
    2. نوع های داده عددی
    3. نوع داده کاراکتر
    4. نوع داده منطقی یا Boolean
    5. نوع داده شئ یا object
    6. استفاده از کلمه کلیدی var
    7. کلمه کلیدی const
  9. آشنایی با عملگرها
    1. عملگرهای محاسباتی
    2. عملگرهای رابطه ای
    3. عملگرهای منطقی
    4. عملگرهای بیتی
    5. عملگرهای انتساب
    6. حق تقدم عملگرها
  10. دستور if
    1. مقدمه ای بر دستورات کنترلی
    2. دستور if
    3. دستور if else
    4. مثال عملی 1
    5. دستور if - else if
    6. مثال عملی 2
  11. دستور switch
  12. حلقه ها (دستور for)
    1. حلقه های تو در تو (Nested Loops)
    2. دستور break
    3. دستور continue
    4. چند مثال دیگر از دستور for
  13. حلقه ها (دستور while و do-while)
    1. حلقه های نامحدود
    2. حلقه do-while
  14. آرایه ها و دستور foreach
    1. خاصیت Length
    2. آرایه های چند بعدی
    3. آرایه های نامنظم یا Jagged Arrays
    4. دستور foreach
  15. آشنایی با متدها یک
    1. شیوه تعریف متدها
    2. نحوه استفاده پارامتر ها در متدها
    3. مقادیر پیش فرض برای پارامترها
    4. مقدار دهی پارامتر ها با استفاده از نام
    5. مقادیر بازگشتی از متدها
  16. آشنایی با متدها دو
    1. کلمات کلیدی out و ref
    2. آرایه به عنوان ورودی و خروجی متد
    3. کلمه کلیدی params
    4. آشنایی با مفهوم Method Overloading
    5. متدهای بازگشتی یا Recursive Methods
  1. آموزش برنامه نویسی شبکه در سی شارپ
  2. آموزش برنامه نویسی شی گرا در سی شارپ
  3. آموزش برنامه نویسی موازی در سی شارپ
  4. آموزش LINQ در سی شارپ

آموزش رایگان سی شارپ | آموزش C# رایگان

معرفی آموزش سی شارپ و سرفصل ها

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

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

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

  1. محیط Visual Studio 2013 به همراه Update 2 که آخرین به روز رسانی این نسخه هست
  2. ویندوز 8.1

دوستان اگر از نسخه های پایین تر Visual Studio و .NET Framework استفاده می کنند، ممکن است که برخی از مطالب براشون قابل استفاده نباشد. نسخه SQL Server 2012 نیز قابل استفاده هست. همچنین کدهای تمامی دوره ها بر روی ویندوز 8 و 7 هم قابل استفاده هستند.اما همونطور که گفتم این دوره از سه بخش زیر تشکیل خواهد شد:

بخش مقدماتی

در این بخش دوستان با مقدمات .NET Framework و زبان سی شارپ آشنا خواهند شد که سرفصل های دوره مقدماتی به شرح زیر می باشد:

  1. آشنایی با معماری .NET Framework و مقدمه ای بر زبان سی شارپ
  2. آشنایی مقدماتی با محیط Visual Studio 2013
  3. آشنایی با ساختار برنامه های سی شارپ
  4. مبحث متغیرها، عبارات و نوع ها
  5. دستورات کنترلی حلقه ها و شرط ها
  6. آشنایی با متدها
  7. Namespace ها در سی شارپ
  8. مقدمه ای بر برنامه نویسی شئ گرا
  9. آشنایی با کلاس ها و شئ ها
  10. مباحث پیشرفته در مورد متدها و استفاده اون ها در کلاس ها
  11. ایندکسر ها
  12. مبحث وارثت و ارث بری کلاس ها
  13. مبحث Polymorphism
  14. آشنایی با مفهوم Abstraction در برنامه نویسی شئ گرا
  15. آشنایی با مفهوم Encapsulation و Access Modifier ها در زبان سی شارپ
  16. آشنایی با Interface و چگونگی استفاده صحیح از آنها
  17. Struct ها و فرق آن با کلاس ها
  18. Operator Overloading و Type Casting
  19. آشنایی با با مفاهیم Reference Type و Value Types
  20. مقدمه ای بر Delegate ها، Event ها و متدهای بدون نام (Anonymous Methods)
  21. آشنایی با Lambda Expressions
  22. کار با رشته ها در زبان C#
  23. آشنایی با مجموعه ها (Collections) و مبحث Generics
  24. Exception ها و مدیریت خطاها در برنامه های سی شارپ

بخش پیشرفته

در این بخش با اتمام بخش مقدماتی دوره آموزش سی شارپ، مباحث پیشرفته زبان برنامه نویسی سی شارپ خدمت دوستان ارائه خواهد شد که سرفصل ها به شرح زیر هستند:

  1. آشنایی با Attribute ها و مبحث Reflection و مقدمه ای بر مبحث Aspect Oriented Programming
  2. آشنایی با LINQ و کوئری گرفتن از شئ ها
  3. قابلیت های داینامیک زبان سی شارپ و DLR
  4. برنامه نویسی Asynchronous که شامل بخش های 1: آشنایی با Thread ها، 2: Task ها و 3: قابلیت async و await می باشد
  5. آشنایی با Process ها و AppDomain ها در برنامه های سی شارپ
  6. مدیریت حافظه و اشاره گر ها (Pointers)
  7. مبحث امنیت در .NET Framework که دوستان با مباحث Authentication، Authorization و Encryption و Hashing نیز در این بخش آشنا خواهند شد.
  8. کار با فایل ها و Registery
  9. نحوه استفاده از فایل های COM در سی شارپ (Interop)

بخش برنامه نویسی بانک های اطلاعاتی در زبان سی شارپ

با پایان بخش پیشرفته، مباحثی که در مورد نوشتن برنامه های Data-Centric هستند را شروع خواهیم کرد. در این بخش دوستان با موارد زیر آشنا خواهند شد:

  1. مقدمه ای بر برنامه نویسی بانک های اطلاعاتی در .NET Framework و زبان C#
  2. آشنایی با مفهوم بانک های اطلاعاتی رابطه ای (Relational Databases)
  3. مقدمه ای بر مفاهیم طراحی بانک های اطلاعاتی
  4. آشنایی اولیه با محیط SQL Server Management Studio و Visual Studio SQL Server Data Tools
  5. ایجاد بانک های اطلاعاتی، جداول و رابطه ها در SQL Server 2014
  6. ایجاد تغییر در داده های جداول (دستورات Insert - Update - Delete)
  7. کوئری گرفتن از جداول و آشنایی اولیه با دستور SELECT در SQL
  8. آشنایی با Stored Procedure ها و نحوه استفاده صحیح از آنها
  9. مقدمه ای بر ADO.NET
  10. استفاده از Connection ها و Command ها
  11. خواندن اطلاعات از جداول با Data Readers
  12. دسترسی Asynchronous به داده های بانک های اطلاعاتی در ADO.NET
  13. آشنایی با Data Adapters و Data Sets
  14. نحوه استفاده از Transaction ها در ADO.NET
  15. استفاده از Entity Framework جهت دسترسی به بانک های اطلاعاتی در برنامه های سی شارپ

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

ابزارهای مورد نیاز دوره

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

آموزش رایگان سی شارپ | آموزش C# رایگان

ویندوز 7، 8 یا 8.1 یا ویندوز 10 کدام بهتر است؟

دوستان جهت گذراندن این دوره نیاز به ویندوز نسخه 7 به بالا دارند، به این خاطر که برنامه های نوشته شده تحت دات نت نسخه 4.5.1 روی نسخه های پایین تر ویندوز اجرا نخواهند شد. همچنین اگر علاقه به نوشتن برنامه های ویندوز 8 و 8.1 یا همون RT دارید، Visual Studio که در بخش بعدی معرفی میشه رو روی نسخه های 8 یا 8.1 نصب کنید.
آموزش رایگان سی شارپ | آموزش C# رایگان

معرفی Visual Studio  | ویژوال استودیو چیست؟

ما برای نوشتن برنامه های سی شارپ، به محیطی نیاز داریم که بتونیم داخلش، پروژه ها و فایل هامون رو مدیریت کنیم، برنامه رو اجرا کنیم و به خطایابی برنامه بپردازیم. به این ابزارها Integrated Development Environment یا به اختصار IDE میگن. معروفترین و بهترین ابزار برای نوشتن برنامه های سی شارپ، محیط Visual Studio هست که در نسخه های مختلفی ارائه شده.
با نصب Visual Studio ، دات نت نسخه 4.5.1 و زبان سی شارپ بر روی سیستم شما نصب خواهند شد. Visual Studio در نسخه های مختلفی ارائه شده که برای این دوره من از نسخه Ultimate استفاده کردم. نسخه Express به صورت رایگان عرضه شده که دارای امکانات کمتری نسبت به نسخه Ultimate هست. Visual Studio رو میتونید از طریق لینک زیر دانلود کنید:

خوب دوستان این بخش آشنایی اولیه با ابزارها و برنامه های مورد نیاز برای شروع دوره بود. به امید خدا در بخش بعدی در مورد ساختار و معماری دات نت خدمت شما مطالبی رو ارائه خواهم داد. پس تا بخش بعدی همه شما عزیزان را به خدای بزرگ می سپارم.

آشنایی با ساختار .NET Framework

در ادامه سری آموزش سی شارپ، به بررسی ساختار .NET Framwork خواهیم پرداخت. مواردی که در این بخش مطرح می شوند، بیشتر جنبه تئوری دارند، اما یادگیری مباحث به ما کمک میکنه که درک درستری از محیطی که قصد داریم با اون کار کنیم داشته باشیم. به دلیل زیاد بودن مطالب این بخش، در دو یا سه بخش ارائه خواهند شد.در این بخش مطالبی که مطرح خواهند شد به شرح زیر هستند:

  1. تاریخچه .NET Framework
  2. مروری بر ساختار کلی دات نت و سرویس های آن
  3. آشنایی با ساختار CLR و کاربرد آن
  4. نحوه کار JIT در اجرای برنامه های دات نت
  5. اجرای مدیریت شده برنامه ها و مدیریت حافظه در دات نت
  6. برخی ابزارهای کاربردی در دات نت

تاریخچه .NET Framework

افرادی که قبل از عرضه .NET Framework کار برنامه نویسی انجام داده باشند، با مفهومی به نام COM آشنایی دارند. COM یا Component Object Model تکنولوژی بود که مایکروسافت برای نوشتن برنامه های تحت ویندوز ارائه داده بود. اگه با Visual Basic نسخه 6 به قبل برنامه نوشته باشید با این تکنولوژی آشنایی دارید.

COM این قابلیت رو به اجزای مختلف نرم افزار میداد که با همدیگه ارتباط داشته باشند. نوشتن کامپوننت های Re-Usable و لینک کردن بخش های مختلف نرم افزار به همدیگه از کاربرد های COM بود. زبان هایی مثل C++، Visual Basic قابلیت استفاده از COM رو فراهم می کردند. اما برنامه نویسانی که از COM استفاده می کردند مشکلاتی هم روبروشون قرار داشت.

برای مثال، مدیریت حافظه یکی از مسائلی بود که برنامه نویس ها باهاش درگیر بودند. همچنین مشکلات فایل های DLL و استفاده از این فایل ها در سیستم مقصد از دیگر مشکلات تکنولوژی COM بود که در ادامه سری مقالات به تفصیل در مورد مسائل COM و راه حل های .NET خواهیم پرداخت.

در سال 1990 مایکروسافت پروژه دات نت رو برای رفع مشکلات COM استارت زد و در سال 2002 به صورت رسمی .NET رو ارائه داد. در حقیقت .NET Framework لایه ای هست که بر روی روی COM قرار گرفته و دسترسی به سرویس های ویندوز و کامپوننت های اون و راحت تر کرده. تا این لحظه نسخه های زیر از دات نت ارائه شده:

  1. نسخه 1.0 در سال 2002
  2. نسخه 1.1 در سال 2003
  3. نسخه 2.0 در سال 2005
  4. نسخه 3.0 در سال 2006
  5. نسخه 3.5 در سال 2007
  6. نسخه 4.0 در سال 2010
  7. نسخه 4.5 در سال 2012
  8. نسخه 4.5.1 در سال 2013
  9. نسخه 4.5.2 در سال 2014

نسخه مورد استفاده در این سری، نسخه آخر یعنی 4.5.2 هست که به همراه Visual Studio 2013 ارائه شده.

مروری بر ساختار کلی دات نت و سرویس های آن

.NET Framework از دو بخش اصلی تشکیل شده، کتابخانه دات نت یا .NET Framework Class Library و Common Language Runtime یا CLR.کتابخانه دات نت مجموعه ای از کلاس های آماده از پیش نوشته شده است که در تمامی زبان های مبتنی بر .NET قابل استفاده هستند.

اما CLR وظیفه اجرا و مدیریت برنامه های تحت دات نت رو داره. تبدیل کدهای IL به کد ماشین، کنترل و مدیریت اجرای برنامه ها، مدیریت حافظه و کنترل و مدیریت امنیت در برنامه های دات نت از وظایف CLR هست. در حقیقت میشه گفت CLR قلب تپنده دات نت هست. برای درک بهتر ساختار دات نت به تصویر زیر توجه کنید:

وب سایت توسینسو

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

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

آشنایی با نقش .NET Framework

همانطور که در بالا اشاره شد، دات نت از دو بخش اصلی یعنی کتابخانه دات ت و CLR تشکیل شده است. CLR پایه و مبنای دات نت می باشد. وظایف CLR رو به اختصار در بالا مطرح کردیم که در این دوره به تفصیل به بررسی سرویس های آن خواهیم پرداخت.

اما کتابخانه دات نت، همانطور که اشاره شد، مجموعه ای از کدهای Reusable (کدهایی که یکبار نوشته شده و قابلیت استفاده مجدد را دارند) می باشند که در اختیار برنامه نویسان دات نت قرار گرفته اند. از این کدها می تواند در کلیه برنامه های دات نت، از برنامه های Console گرفته تا برنامه های ویندوز، وب، ارتباط با بانک های اطلاعاتی و سرویس های وب و ویندوز استفاده کرد.

اما یکی از اصطلاحات در دات نت CLS یا Common Language Specification هست. موسسه European Computer Manufacturers Assoscian یا ECMA، استانداردی رو تدوین کرده که CLS مبتنی بر این استاندارد پیاده سازی شده است. در حقیقت CLS استانداردی هست

که با رعایت این استاندارد، کلیه زبان های برنامه نویسی مبتنی بر دات نت، قابلیت ارتباط با یکدیگر را خواهند داشت. برای مثال زبان های VB.NET و C# دو زبان مبتنی بر دات نت هستند. زمانی که شما کدی را با زبان C# نوشته اید، با CTS این قابلیت به شما داده میشه که بتونید از کد نوشته شده در زبان C# در زبان VB.NET نیز استفاده کنید.

کدهایی که با استاندارد CLS تطابق داشته باشند، بعد از کامپایل به یک کد میانی به نام IL ترجمه می شوند، کد IL کدی شبیه به کد Assembly هست. بعد از ایجاد کد IL توسط کامپایلر، کد IL توسط CLR به کد ماشین ترجمه شده و اجرا می شود.

در حقیقت بعد از کامپایل کردن دو برنامه که یکی به زبان C# و دیگری به زبان VB.NET نوشته شده، کدی که ایجاد می شود کد IL هست.کدی میانی که توسط کامپایلرهای مبتنی بر دات نت ایجاد می شوند Microsoft Intermediate Language یا MSIL نام دارند که به برنامه ها قابلیت برقراری ارتباط با یکدیگر را می دهد.

استاندارد دیگری که توسط ECMA تدوین شده، استاندارد CLI یا Common Language Infrastructure هست. این استاندارد یک سری خصوصیات مشترک در بین کدهای میانی ایجاد شده توسط کامپایلرها رو تعریف میکند که برای اجرای کد IL به آنها نیاز است. برای مثال سیستم نوع داده مشترک (Common Type System) یا سرویس های از قبیل Type Safety و اجرای مدیریت شده کدها از خصوصیات تدوین شده هستند. لیست زیر خلاصه ای از استاندارد های ECMA تحت دات نت می باشد:

  1. CLS یا Common Language Specification
  2. CTS یا Common Type System
  3. TS یا Type Safety
  4. IL یا Intermediate Language

در این قسمت به اولیه .NET Framework و ساختار اون پرداختیم. در بخش بعدی به بررسی سرویس ها و خصوصیات CLR، نحوه اجرای کدها در دات نت و سرویس JIT، اجرای مدیریت شده کدها و مدیریت حافظه در دات نت خواهیم پرداخت.

آشنایی با CLR و JIT و مدیریت حافظه

همانطور که در بخش قبلی خدمت دوستان گفتیم، CLR قلب تپنده دات نت بوده و اکثر وظایف زمان اجرای برنامه های دات نت به عهده CLR می باشد. در حقیقت، برای اجرای برنامه های مبتنی بر دات نت، حتما" باید نسخه مربوطه .NET Framework بر روی سیستم مقصد نصب شده باشد. در این بخش قصد داریم تا برخی از سرویس های CLR را خدمت دوستان معرفی کرده و در مورد دو سرویس، یعنی JIT و GC به تفصیل صحبت کنیم. در تصویر زیر نمای کلی از سرویس های CLR را مشاهده می کنید:

سرویس های CLR
  1. Class Loader: این سرویس وظیفه بارگذاری کلاس ها در زمان اجرا در محیط CLR را به عهده دارد
  2. IL to Native: در قسمت قبل گفتیم که کدهای نوشته شده در زبان های مبتنی بر دات نت، بعد از کامپایل به یک زبان میانی به نام IL تبدیل می شوند، این سرویس وظیفه تبدیل کدهای IL به کد ماشین جهت اجرای برنامه را به عهده دارد. در این بخش به تفصیل به معرفی این سرویس می پردازیم.
  3. Code Manager: این سرویس وظیفه مدیریت کدها در زمان اجرا را به عهده دارد.
  4. Garbage Collector: با کمک این سرویس، CLR کار مدیریت حافظه را انجام می دهد، پاک سازی حافظه از اشیاء بلااستفاده از وظایف GC می باشد. در این بخش به تفصیل به معرفی این سرویس می پردازیم.
  5. Debug Engine: یکی از امکانات مورد نیاز برنامه نویسان، قابلیت خطا یابی برنامه ها می باشد که این سرویس، قابلیت خطایابی یا همان Debugging را به برنامه نویسان می دهد.
  6. Type Checker: یکی از ویژگی های دات نت، Type Safety می باشد، بدین معنی که تمام Data Type ها یا نوع های داده باید مشخص باشند. برای مثال شما در دات نت نمی توانید در یک متغیر از نوع عددی، رشته ای را ذخیره کنید یا باالعکس، این سرویس وظیفه کنترل نوع های داده را به عهده دارد!
  7. Security Engine: یکی دیگر از سرویس های CLR می باشد که وظیفه امنیت اجرای کدها در محیط دات نت را به عهده دارد. در مورد این سرویس و امنیت در دات نت به تفصیل در فصل های آتی صحبت خواهیم کرد.
  8. Exception Manager: هنگامی که در برنامه های مبتنی بر دات نت، خطایی اتفاق می افتد، CLR یک استثنا یا Exception برای آن خطا ایجاد می کند، وظیفه کنترل و مدیریت استثناها به عهده این سرویس می باشد.
  9. COM Marshaler: یکی از مزایای دات نت، قابلیت ارتباط با اجزای COM که در بخش قبلی در مورد آن صحبت کردیم می باشد، این سرویس وظیفه انتقال اطلاعات بین برنامه های دات نت و اجزای COM را به عهده دارد.
  10. Thread Support: یکی از ویژگی های برنامه های امروزی، قابلیت Multi-Threading جهت همزمانی انجام وظایف و عملیات ها می باشد که باعث بالارفتن کارایی برنامه می شود، این سرویس وظیفه مدیریت اجرای کدها به صورت Multi-Thread را به عهده دارد.
  11. Base Class Library: امکان دسترسی به کتابخانه پایه دات نت را به برنامه ها می دهد. در مورد BCL در قسمت قبلی توضیح دادیم.

اجرای کدها در دات نت و سرویس JIT و اجرای مدیریت شده کد ها

روند اجرای کدها در دات نت، کمی پیچیده ولی در عین حال، بسیار کارامد است. زیرا طراحی این قسمت توسط شرکت مایکروسافت طوری انجام شده که اجرای کدها به بهینه ترین شکل ممکن انجام شود. همانطور که در قسمت قبلی گفتیم، سرویسی که وظیفه اجرای کدها در دات نت را دارد، کامپایلر JIT یا Just-In-Time می باشد. در زیر به صورت قدم به قدم به تشریح روند کامپایل و اجرای کدها، از زمان کامپایل توسط کامپایلر زبان برنامه نویسی تا زمان اجرای کد توسط JIT می پردازیم:

  1. در قدم اول شما کد مورد نظر خود را با زبان برنامه نویسی مورد نظرتان مانند سی شارپ می نویسید.
  2. در ادامه، با کمک کامپایلر زبان مورد نظر، کدی که شما نوشتید به زبان IL ترجمه شده و داخل یک فایل به نام Assembly قرار داده می شوند. Assembly ها فایل هایی هستند که بعد از کامپایل کدها توسط کامپایلر ایجاد می شوند. Assembly ها شامل کد IL برنامه، Metadata ها که اطلاعاتی در مورد کد نوشته شده توسط شما در اختیار CLR قرار می دهد و Assembly Manifest که اطلاعات اولیه در مورد اسمبلی مانند نسخه و ... می باشند. (در مورد Metadata ها Manifest در بخش Reflection به تفضیل صحبت خواهیم کرد)
  3. بعد از ایجاد Assembly توسط کامپایلر، با اجرای برنامه، CLR وارد صحنه می شود. بدین صورت که ابتدا توسط سرویس Class Loader که در بخش قبلی در مورد آن توضیح دادیم، اطلاعت اولیه مورد نیاز جهت اجرای کد مانند کد IL و Metadata را داخل حافظه بارگذاری شده، و سپس کد بارگذاری شده توسط Class Loader توسط JIT به کد ماشین تبدیل شده و اجرا می شود.

نکته 1: هر اسمبلی دات نت برای اجرا نیاز به یک نقطه شروع یا Entiry Point دارد که Class Loader در ابتدا این بخش، یعنی Entry Point را در حافظه بارگذاری کرده و JIT آن را اجرا می کند.

نکته 2: برنامه های نوشته شده توسط دات نت، می توانند شامل چندین هزار خط و بخش مجزا باشند، از مزیت های JIT این است که برای اجرای برنامه ها، کل کدها را یکجا به کد ماشین تبدیل نمی کند، بلکه تنها بخش مورد نیاز برای اجرا توسط Class Loader در حافظه بارگذاری شده و توسط JIT اجرا می شود. با این کار سرعت باگذاری اولیه برنامه های دات نت بسیار بالا می رود.

اما MCE یا Managed Code Execution دقیقا" به چه معناست؟ همانطور که گفتیم، CLR پروسه ای برای اجرای کدها دارد که به شرح زیر می باشد:

  1. بارگذاری کد IL و Meta Data های مربوطه
  2. تبدیل کد IL به کد Native و اجرای آن
  3. کنترل و مدیریت حافظه در زمان اجرای برنامه
  4. اعمال Type Safety
  5. کنترل امنیت در اجرای برنامه ها
  6. مدیریت Exception ها

پروسه ایی در بالا برای اجرای کدها در دات نت ذکر شد به MCE یا همون Managed Code Execution شناخته میشه. البته مطالب در مورد این موضوع بسیار است که به دلیل تخصصی بودن مطالب، در بخش پیشرفته آموزش سی شارپ به تفصیل به موضوعات مربوط به CLR و اجرای کدها خواهیم پرداخت.

مدیریت حافظه و سرویس GC

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

اما در دات نت، مسئله مدیریت و استفاده بهینه از حافظه بوسیله سرویس GC یا Garbage Collector به صورت کامل حل شده است. در حقیقت سرویس GC وظیفه مانیتور کردن حافظه در حین اجرای برنامه و پاک سازی آن را به عهده دارد. به همین دلیل شما به عنوان برنامه نویس، هیچ گونه نگرانی در مورد پاک سازی حافظه را نخواهید داشت.

پروسه آزاد سازی حافظه در دات نت، کمی پیچیده است، اما به طور کلی، در مدیریت حافظه توسط CLR، دو وظیفه کلی وجود دارد. تخصیص حافظه و آزاد سازی حافظه که این وظایف به صورت خودکار توسط CLR انجام می شوند.در ادامه آموزش بخشی را به سرویس GC اختصاص خواهیم داد که در آن بخش به طور کامل با پروسه های تخصیص و آزاد سازی حافظه، Finalizer ها و Generation ها در GC آشنا خواهیم شد.

با پایان بخش چهام آموزش سی شارپ، مفاهیم ابتدایی دات نت نیز به پایان می رسد. به امید خدا از بخش بعدی، کار اصلی ما، یعنی شروع نوشتن کدها به زبان سی شارپ آغاز خواهد شد. در بخش بعدی با محیط Visual Studio آشنا شده و اولین برنامه خود را به زبان سی شارپ خواهیم نوشت.

آشنایی با محیط Visual Studio

در ادامه مباحث آموزش سی شارپ قصد داریم تا به بررسی اولیه محیط Visual Studio پرداخته و با بعضی از قسمت های این محیط که برای ایجاد برنامه های ما لازم هستند آشنا شویم. Visual Studio محیطی می باشد که روند نوشتن و خطایابی برنامه ها را برای برنامه نویسان ساده می کند. به این محیط IDE نیز می گویند. IDE مخفف کلمات Integrated Development Environment می باشد که مجموعی ای از ابزارها را در اختیار برنامه نویس قرار می دهد تا عملیات توسعه نرم افزار ها برای آنها آسان تر شود. معمولا" ابزارهای رایج در IDE ها عبارتند از:

  1. ویرایشگر کد یا Source Code Editor
  2. ابزارهای خودکارسازی Build یا Build Automation Tools
  3. خطایاب یا همان Debugger

اگر شما با زبان جاوا و یا C++ کار کرده باشید با محیط های توسعه دیگر آشنایی دارید. برای مثال برای جاوا از IDE هایی مثل NetBeans و یا EClips و برای زبان C++ از محیط هایی مثل Code::Blocks می توان استفاده کرد. Visual Studio نیز یک IDE می باشد که در آن می توان به زبان هایی مثل ++C و Visual Basic و C# و ... برنامه نوشت.

از این قسمت آموزش سی شارپ هر جایی که به کلمه IDE برخوردید، منظور همان Visual Studio می باشد.اما در بخش معرفی ابزارهای مورد نیاز، لینک دانلود Visual Studio قرار داده شد که دوستان می توانند از طریق همان لینک VS را دانلود کنند. بعد از دانلود و نصب، و اجرای VS محیط زیر را مشاهده خواهید کرد:

وب سایت توسینسو

پنجره ظاهر شده، محیطی است که ما از این به بعد از آن برای نوشتن برنامه هایمان استفاده خواهیم کرد. برای شروع در یکی از درایو ها پوشه ای به نام C# 2013 Tutorials ایجاد کنید. کلیه پروژه هایی که در طول این دوره کار خواهیم کرد، در این پوشه قرار خواهند گرفت. بعد از ایجاد پوشه باید پروژه جدیدی ایجاد کنیم. این پروژه اولین برنامه ما به زبان C# خواهد بود. برای ایجاد پروژه از منوی File به ترتیب New و سپس Project را انتخاب کنید. با انتخاب این گزینه پنجره New Project ظاهر خواهد شد:

وب سایت توسینسو
وب سایت توسینسو

در این پنجره لیستی از انواع پروژه های موجود نمایش داده می شود که ما بر اساس نیاز اقدام به ایجاد پروژه خواهیم کرد. در پنجره New Project باید نوع پروژه، نام پروژه و مسیر ایجاد پروژه را مشخص کنیم. پروژه ای که ایجاد خواهیم کرد از نوع Console Application بوده و نام آن CSharp-Course03-01 می باشد. پنجره New Project باید مطابق تصویر زیر باشد. دقت کنید که پوشه C# 2013 Tutorials را من در درایو G ساختم، شما در هر درایوی که مایل بودید این پوشه را ایجاد کنید:

وب سایت توسینسو

بعد از کلیک کردن روی دکمه OK یک Solution برای ما ایجاد شده که این Solution حاوی پروژه ای است که ما قصد داریم بر روی آن کار کنیم. Solution چیست؟ زمانی که ما یک پروژه در Visual Studio ایجاد می کنیم، این پروژه تحت یک Solution ایجاد می شود. در حقیقت یک Solution فضایی است که می تواند شامل چندین پروژه باشد. فایل های Solution با پسوند sln ایجاد می شوند. اگر به پوشه G:\C# 2013 Tutorials\CSharp-Course03-01 مراجعه کنیم با ساختاری مشابه ساختار زیر روبرو خواهیم شد:

وب سایت توسینسو

اگر وارد پوشه CSharp-Course03-01 که داخل همین پوشه قرار دارد شویم، محتویات پروژه ایجاد شده را مشاهده خواهیم کرد:

وب سایت توسینسو

فایل های پروژه های C# با پسوند csproj ایجاد می شوند. همچنین فایل های با پسوند cs فایل هایی هستند که حاوی کدهای نوشته شده ما به زبان C# هستند. پس تا اینجا با سه نوع از فایل های ایجاد شده توسط Visual Studio آشنا شدیم:

  1. فایل های sln که همان Solution های Visual Studio هستند
  2. فایل های csproj که فایل های پروژه های C# هستند
  3. فایل های cs که کدهای نوشته شده به زبان C# هستند

اما قبل از شروع کد نویسی، بهتر است با پنجره Solution Explorer آشنا شویم. این پنجره که به طور معمول در سمت راست Visual Studio قرار دارد، لیستی از پروژ های Solution جاری و فایل ها موجود در پروژه ها را به ما نمایش می دهد که تصویر آن را در شکل زیر مشاهده می کنید:

وب سایت توسینسو

همانطور که مشاهده می کنید در این پنجره ساختاری از Solution و پروژه های موجود در این Solution نمایش داده می شوند. با دوبار کلیک کردن روی هر یک از فایل ها، محتویات آن در محیط Visual Studio به شما نمایش داده خواهد شد. برای مثال، اگر بر روی فایل Program.cs دوبار کلیک کنید، محتویات آن به صورت زیر به شما نمایش داده خواهد شد:

وب سایت توسینسو

اگر با یک بار کلیک بر روی فایل، محتویات آن نمایش داده شد، باید گزینه Preview Selected Items را در پنجره Solution Explorer از حالت انتخاب خارج کنید:

وب سایت توسینسو

همچنین در صورتی که پنجره Solution Explorer را مشاهده نمی کنید، از منوی View گزینه Solution Explorer را انتخاب کنید تا این پنجره نمایش داده شود. همچنین برای استفاده بهینه تر از فضای Visual Studio، بهتر است قابلیت Auto Hide این پنجره را فعال کنیم. با این کار پنجره Solution Explorer تنها زمانی نمایش داده خواهد شد که به آن نیاز داشته باشیم:

وب سایت توسینسو
وب سایت توسینسو

با کلیک کردن بر روی Solution Explorer پنجره آن نمایش داده شده و با کلیک کردن جایی خارج از آن، دوباره ناپدید می شود.زمان نوشتن اولین برنامه است، با دوبار کلیک کردن بر روی Program.cs آن را باز می کنیم تا محتویات آن نمایش داده شده و کد مورد نظر را بنویسیم:

وب سایت توسینسو

در اینجا قصد داریم برنامه ای بنویسیم که پیام Hello ITPro.ir به کاربر نمایش داده شده و بعد از زدن کلیدی توسط کاربر از برنامه خارج شود. همانطور که گفتیم برنامه ای که ایجاد می کنیم، از نوع Console Application است. خروجی های این نوع برنامه ها در پنجره Console که پنجره ای شبیه به پنجره Command Prompt ویندوز است نمایش داده می شوند. بیشتر برنامه های بخش اول آموزشی ما از نوع Console Application خواهد بود. کد فایل Program.cs را به صورت زیر تغییر دهید:

وب سایت توسینسو

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

1. کلیک بر روی دکمه Start که در نوار ابزار Visual Studio قرار دارد:

وب سایت توسینسو

2. انتخاب گزینه Start Debugging از منوی Debug

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

با زدن کلید F5 برنامه را اجرا می کنیم تا خروجی زیر بر روی صفحه نمایش داده شود:

وب سایت توسینسو

بعد از اجرای برنامه و مشاهده خروجی کلیدی را زده تا از برنامه خارج شویم و به محیط Visual Studio برگردیم. سه خط از کدی که نوشتیم را بررسی می کنیم:

  • خط 13: در این خط با کمک دستور WriteLine متن Hello ITPro.ir را بر روی خروجی نمایش می دهیم.
  • خط 14: در این خط با کمک دستور WriteLine متن Press any key to exit... در خروجی نمایش می دهیم تا کاربر بداند برای خروج باید کلیدی را فشار دهد.
  • خط 15: در این و رسیدن به دستور ReadKey برنامه منتظر می ماند تا کاربر کلیدی را فشار دهد، با فشار دادن یک کلید، برنامه به انتها رسیده و خارج می شود.

برنامه ای که نوشتیم بسیار ساده بوده و تنها خروجی را به کاربر نمایش می دهد، در بخش های بعدی برنامه هایی می نویسیم که ورودی از کاربر دریافت کرده و بر اساس ورودی خروجی نمایش دهد.در این بخش سعی کردیم با ایجاد یک پروژه و نوشتن یک برنامه ساده با موارد زیر آشنا شویم:

  1. محیط Visual Studio و آشنایی با مفهوم IDE
  2. نحوه ایجاد پروژه جدید در Visual Studio
  3. تفاوت میان Solution و Project
  4. پنجره Solution Explorer و کاربرد آن
  5. نوشتن یک برنامه ساده و اجرای آن در محیط Visual Studio

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

ساختار برنامه ها و کامپایلر

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Course03_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello ITPro.ir");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

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

        static void Main(string[] args)
        {
        }

قطعه کد بالا، یک متد است. در باره متدها در بخش های آینده بیشتر توضیح خواهیم داد، اما در حال حاضر به خاطر داشته باشید که کد بالا متدی را تعریف می کند که نام آن Main است. کار متد Main چیست؟ برنامه ای که ما می نویسیم، باید یک نقطه شروع داشته باشد.

متد Main نقطه شروع برنامه ما است. یعنی زمانی که ما برنامه ای که به زبان C# نوشته شده را اجرا می کنیم، .NET Framework در فایل اجرایی ما دنبال متدی به نام Main گشته و با پیدا کردن آن، کدهای داخل این متد را اجرا می کند. کدهایی که بین { و } نوشته می شوند که در برنامه قبلی، دو خطی که خروجی را نمایش می دهد و خطی که منتظر زدن کلیدی توسط کاربر می شود، محتویات متد Main هستند. با رسیدن به آخرین خط متد و اجرای آن، از متد Main خارج شده و برنامه به اتمام می رسد.

ما بقی قسمت های فایل، در بخش های بعدی مورد بررسی قرار خواهند گرفت. ما گفتیم که برای نوشتن برنامه های این دوره، از محیط Visual Studio استفاده خواهیم کرد. اما این امکان وجود دارد که بتوانیم برنامه هایمان را بدون محیط Visual Studio نوشته و اجرا کنیم.

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

1. در پوشه C# 2013 Tutorials یک پوشه جدید با نام CSharp-Course04-01 ایجاد کنید.

  • برای ایجاد پوشه جدید در File Explorer ویندوز می توانید از ترکیب کلید های Ctrl+Shif+N و یا راست کلیک موس و سپس انتخاب New > Folder استفاده کنید.

2. بعد از ایجاد پوشه CSharp-Course04-01، داخل آن یک فایل txt ایجاد کنید.

  • برای ایجاد فایل متنی، دکمه سمت راست، گزینه New > Text Document را انتخاب کنید.

3. بعد از ایجاد فایل متنی، نام آن را به Program.cs تغییر دهید.

  • برای تغییر نام، فایل را انتخاب کرده و کلید F2 را فشار دهید. دقت کنید که پسوند برخی فایل ها مانند فایل های متنی در ویندوز نمایش داده نمی شوند. در صورت عدم نمایش پسوند فایل و تغییر نام آن، نام فایل به Program.cs.txt تغییر می کنید. برای نمایش پسوند فایل ها، در File Explorer ویندوز 8.1 گزینه زیر را از تب View تیک بزنید:


با عرض سلام به همراهان همیشگی انجمن تخصصی فناوری اطلاعات ایران، با قسمت چهارم سری آموزشی زبان سی شارپ در خدمت شما عزیزان هستم.در قسمت قبلی، با نوشتن یک برنامه ساده با محیط Visual Studio و چگونگی اجرای برنامه های نوشته شده به زبان سی شارپ آشنا شدیم. در ادامه به بررسی ساختار برنامه های سی شارپ و نحوه کامپایل و اجرای برنامه ها خواهیم پرداخت.در قسمت قبل کدهایی را در فایل Program.cs نوشتیم. در این قسمت می خواهیم در مورد این فایل و محتویات آن بیشتر صحبت کنیم. اگر به خاطر داشته باشید محتویات فایل Program.cs به صورت زیر بود:

<c#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Course03_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

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

<c#>
        static void Main(string[] args)
        {
        }
<c#>

قطعه کد بالا، یک متد است. در باره متدها در بخش های آینده بیشتر توضیح خواهیم داد، اما در حال حاضر به خاطر داشته باشید که کد بالا متدی را تعریف می کند که نام آن Main است. کار متد Main چیست؟ برنامه ای که ما می نویسیم، باید یک نقطه شروع داشته باشد. متد Main نقطه شروع برنامه ما است. یعنی زمانی که ما برنامه ای که به زبان C# نوشته شده را اجرا می کنیم، .NET Framework در فایل اجرایی ما دنبال متدی به نام Main گشته و با پیدا کردن آن، کدهای داخل این متد را اجرا می کند. کدهایی که بین { و } نوشته می شوند که در برنامه قبلی، دو خطی که خروجی را نمایش می دهد و خطی که منتظر زدن کلیدی توسط کاربر می شود، محتویات متد Main هستند. با رسیدن به آخرین خط متد و اجرای آن، از متد Main خارج شده و برنامه به اتمام می رسد.

ما بقی قسمت های فایل، در بخش های بعدی مورد  بررسی قرار خواهند گرفت.

ما گفتیم که برای نوشتن برنامه های این دوره، از محیط Visual Studio استفاده خواهیم کرد. اما این امکان وجود دارد که بتوانیم برنامه هایمان را بدون محیط Visual Studio نوشته و اجرا کنیم. برای این کار به کامپایلر زبان C# نیاز داریم. کامپایلر زبان C# فایلی است به نام csc.exe که عملیات ترجمه کدهای نوشته به زبان IL و ایجاد فایل اجرایی را به عهده دارد. برای آشنایی با کامپایلر زبان C#، یک تمرین ساده را به صورت قدم به قدم با هم انجام می دهیم.

1. در پوشه C# 2013 Tutorials یک پوشه جدید با نام CSharp-Course04-01 ایجاد کنید.

*برای ایجاد پوشه جدید در File Explorer ویندوز می توانید از ترکیب کلید های Ctrl+Shif+N و یا راست کلیک موس و سپس انتخاب New > Folder استفاده کنید.*

2. بعد از ایجاد پوشه CSharp-Course04-01، داخل آن یک فایل txt ایجاد کنید.

*برای ایجاد فایل متنی، دکمه سمت راست، گزینه New > Text Document را انتخاب کنید.*

3. بعد از ایجاد فایل متنی، نام آن را به Program.cs تغییر دهید.

* برای تغییر نام، فایل را انتخاب کرده و کلید F2 را فشار دهید. دقت کنید که پسوند برخی فایل ها مانند فایل های متنی در ویندوز نمایش داده نمی شوند. در صورت عدم نمایش پسوند فایل و تغییر نام آن، نام فایل به Program.cs.txt تغییر می کنید. برای نمایش پسوند فایل ها، در File Explorer ویندوز 8.1 گزینه زیر را از تب View تیک بزنید:

||http://tosinso.com/files/get/cfe4806a-f1e0-4692-9f0a-397501ff1715||

4. بعد از تغییر نام فایل، فایل Program.cs را با برنامه Noetpad باز کرده و محتویات آن را مطابق کد زیر تغییر دهید:

<c#>
using System;

namespace CSharpCourse0401
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir!);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

5. حال، باید فایل نوشته شده بالا را با کامپایلر زبان C# ترجمه کرده و فایل خروجی را تولید کنیم. برای اینکار از دستور csc.exe استفاده می کنیم. فایل csc.exe در مسیر زیر قرار دارد:

<ltr>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
<ltr>

ابتدا Command Prompt را با می کنیم. برای باز کردن Command Prompt بر روی دکمه Start راست کلیک کرده و گزینه Command Prompt (Admin) را انتخاب می کنیم:

||http://tosinso.com/files/get/3b50fa4d-130b-48db-9283-16ff05fb3f7e||

همچنین می توانیم از قسمت Run (کلید های Windows+R) و دستور cmd پنجره Command Prompt را باز کنیم. یا می توانیم از قسمت File Explorer ویندوز با رفتن به پوشه ای که فایل Program.cs در آن قرار دارد و نگه داشتن کلید Shift و راست کلیک موس گزینه Open command window here را انتخاب کنیم تا پنجره Command Prompt در همان پوشه باز شود:

||http://tosinso.com/files/get/24d909b0-f850-4c2b-baad-026cea6f2301||

در صورتی که داخل پوشه CSharp-Course04-01 نبودیم، با دستورات زیر وارد این پوشه می شویم:

<text>
g:
cd C# 2013 Tutorials\CSharp-Course04-01
<text>

حال باید فایل Program.cs را کامپایل کنیم. برای اینکار دستور زیر را در پنجره Command Prompt می نویسیم:

<text>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs
<text>

||http://tosinso.com/files/get/f6305818-7ea5-42ec-a1fd-66909e341330||

بعد از اجرای دستور بالا، فایلی با نام Program.exe در کنار فایل Program.cs ایجاد می شود که با اجرای آن، خروجی مورد نظر در پنجره Console برای ما نمایش داده شده و با زدن کلیدی از برنامه خارج می شویم:

||http://tosinso.com/files/get/adc52331-6faf-4506-942e-2eb9d3e6ecef||

||http://tosinso.com/files/get/95092b47-f8f3-4361-bb41-f527aa2b54b3||

در قسمت بالا، بدون استفاده از محیط Visual Studio برنامه ای که در قسمت قبل نوشته بودیم را نوشته، کامپایل و اجرا کردیم. کاری که Visual Studio برای ما انجام می دهد، خودکار سازی روند کامپایل و اجرای برنامه هاست که کار را برای ما بسیار ساده می کند. هدف از تمرین بالا آشنایی اولیه با دستور csc.exe که کامپایلر C# است بود. در قسمت های بعدی با این دستور و تنظیمات مختلف آن بیشتر آشنا خواهیم شد. در این قسمت با ساختار فایل Program.cs، متد Main، نحوه اجرای برنامه ها و کامپایلر زبان C# (دستور csc.exe) آشنا شدیم. در قسمت بعدی آموزش با دستورات اولیه محیط Console، تعریف و استفاده از متغییر ها، عبارات و نوع ها و همچنین نوشتن یادداشت (Comment) در برنامه های سی شارپ آشنا خواهیم شد. *ITPRO باشید*

نویسنده : حسین احمدی
منبع : |جزیره برنامه نویسی وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است

4. بعد از تغییر نام فایل، فایل Program.cs را با برنامه Noetpad باز کرده و محتویات آن را مطابق کد زیر تغییر دهید:

using System;

namespace CSharpCourse0401
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello ITPro.ir!");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

5. حال، باید فایل نوشته شده بالا را با کامپایلر زبان C# ترجمه کرده و فایل خروجی را تولید کنیم. برای اینکار از دستور csc.exe استفاده می کنیم. فایل csc.exe در مسیر زیر قرار دارد:

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe

ابتدا Command Prompt را با می کنیم. برای باز کردن Command Prompt بر روی دکمه Start راست کلیک کرده و گزینه Command Prompt (Admin) را انتخاب می کنیم:


با عرض سلام به همراهان همیشگی انجمن تخصصی فناوری اطلاعات ایران، با قسمت چهارم سری آموزشی زبان سی شارپ در خدمت شما عزیزان هستم.در قسمت قبلی، با نوشتن یک برنامه ساده با محیط Visual Studio و چگونگی اجرای برنامه های نوشته شده به زبان سی شارپ آشنا شدیم. در ادامه به بررسی ساختار برنامه های سی شارپ و نحوه کامپایل و اجرای برنامه ها خواهیم پرداخت.در قسمت قبل کدهایی را در فایل Program.cs نوشتیم. در این قسمت می خواهیم در مورد این فایل و محتویات آن بیشتر صحبت کنیم. اگر به خاطر داشته باشید محتویات فایل Program.cs به صورت زیر بود:

<c#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Course03_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

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

<c#>
        static void Main(string[] args)
        {
        }
<c#>

قطعه کد بالا، یک متد است. در باره متدها در بخش های آینده بیشتر توضیح خواهیم داد، اما در حال حاضر به خاطر داشته باشید که کد بالا متدی را تعریف می کند که نام آن Main است. کار متد Main چیست؟ برنامه ای که ما می نویسیم، باید یک نقطه شروع داشته باشد. متد Main نقطه شروع برنامه ما است. یعنی زمانی که ما برنامه ای که به زبان C# نوشته شده را اجرا می کنیم، .NET Framework در فایل اجرایی ما دنبال متدی به نام Main گشته و با پیدا کردن آن، کدهای داخل این متد را اجرا می کند. کدهایی که بین { و } نوشته می شوند که در برنامه قبلی، دو خطی که خروجی را نمایش می دهد و خطی که منتظر زدن کلیدی توسط کاربر می شود، محتویات متد Main هستند. با رسیدن به آخرین خط متد و اجرای آن، از متد Main خارج شده و برنامه به اتمام می رسد.

ما بقی قسمت های فایل، در بخش های بعدی مورد  بررسی قرار خواهند گرفت.

ما گفتیم که برای نوشتن برنامه های این دوره، از محیط Visual Studio استفاده خواهیم کرد. اما این امکان وجود دارد که بتوانیم برنامه هایمان را بدون محیط Visual Studio نوشته و اجرا کنیم. برای این کار به کامپایلر زبان C# نیاز داریم. کامپایلر زبان C# فایلی است به نام csc.exe که عملیات ترجمه کدهای نوشته به زبان IL و ایجاد فایل اجرایی را به عهده دارد. برای آشنایی با کامپایلر زبان C#، یک تمرین ساده را به صورت قدم به قدم با هم انجام می دهیم.

1. در پوشه C# 2013 Tutorials یک پوشه جدید با نام CSharp-Course04-01 ایجاد کنید.

*برای ایجاد پوشه جدید در File Explorer ویندوز می توانید از ترکیب کلید های Ctrl+Shif+N و یا راست کلیک موس و سپس انتخاب New > Folder استفاده کنید.*

2. بعد از ایجاد پوشه CSharp-Course04-01، داخل آن یک فایل txt ایجاد کنید.

*برای ایجاد فایل متنی، دکمه سمت راست، گزینه New > Text Document را انتخاب کنید.*

3. بعد از ایجاد فایل متنی، نام آن را به Program.cs تغییر دهید.

* برای تغییر نام، فایل را انتخاب کرده و کلید F2 را فشار دهید. دقت کنید که پسوند برخی فایل ها مانند فایل های متنی در ویندوز نمایش داده نمی شوند. در صورت عدم نمایش پسوند فایل و تغییر نام آن، نام فایل به Program.cs.txt تغییر می کنید. برای نمایش پسوند فایل ها، در File Explorer ویندوز 8.1 گزینه زیر را از تب View تیک بزنید:

||http://tosinso.com/files/get/cfe4806a-f1e0-4692-9f0a-397501ff1715||

4. بعد از تغییر نام فایل، فایل Program.cs را با برنامه Noetpad باز کرده و محتویات آن را مطابق کد زیر تغییر دهید:

<c#>
using System;

namespace CSharpCourse0401
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir!);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

5. حال، باید فایل نوشته شده بالا را با کامپایلر زبان C# ترجمه کرده و فایل خروجی را تولید کنیم. برای اینکار از دستور csc.exe استفاده می کنیم. فایل csc.exe در مسیر زیر قرار دارد:

<ltr>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
<ltr>

ابتدا Command Prompt را با می کنیم. برای باز کردن Command Prompt بر روی دکمه Start راست کلیک کرده و گزینه Command Prompt (Admin) را انتخاب می کنیم:

||http://tosinso.com/files/get/3b50fa4d-130b-48db-9283-16ff05fb3f7e||

همچنین می توانیم از قسمت Run (کلید های Windows+R) و دستور cmd پنجره Command Prompt را باز کنیم. یا می توانیم از قسمت File Explorer ویندوز با رفتن به پوشه ای که فایل Program.cs در آن قرار دارد و نگه داشتن کلید Shift و راست کلیک موس گزینه Open command window here را انتخاب کنیم تا پنجره Command Prompt در همان پوشه باز شود:

||http://tosinso.com/files/get/24d909b0-f850-4c2b-baad-026cea6f2301||

در صورتی که داخل پوشه CSharp-Course04-01 نبودیم، با دستورات زیر وارد این پوشه می شویم:

<text>
g:
cd C# 2013 Tutorials\CSharp-Course04-01
<text>

حال باید فایل Program.cs را کامپایل کنیم. برای اینکار دستور زیر را در پنجره Command Prompt می نویسیم:

<text>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs
<text>

||http://tosinso.com/files/get/f6305818-7ea5-42ec-a1fd-66909e341330||

بعد از اجرای دستور بالا، فایلی با نام Program.exe در کنار فایل Program.cs ایجاد می شود که با اجرای آن، خروجی مورد نظر در پنجره Console برای ما نمایش داده شده و با زدن کلیدی از برنامه خارج می شویم:

||http://tosinso.com/files/get/adc52331-6faf-4506-942e-2eb9d3e6ecef||

||http://tosinso.com/files/get/95092b47-f8f3-4361-bb41-f527aa2b54b3||

در قسمت بالا، بدون استفاده از محیط Visual Studio برنامه ای که در قسمت قبل نوشته بودیم را نوشته، کامپایل و اجرا کردیم. کاری که Visual Studio برای ما انجام می دهد، خودکار سازی روند کامپایل و اجرای برنامه هاست که کار را برای ما بسیار ساده می کند. هدف از تمرین بالا آشنایی اولیه با دستور csc.exe که کامپایلر C# است بود. در قسمت های بعدی با این دستور و تنظیمات مختلف آن بیشتر آشنا خواهیم شد. در این قسمت با ساختار فایل Program.cs، متد Main، نحوه اجرای برنامه ها و کامپایلر زبان C# (دستور csc.exe) آشنا شدیم. در قسمت بعدی آموزش با دستورات اولیه محیط Console، تعریف و استفاده از متغییر ها، عبارات و نوع ها و همچنین نوشتن یادداشت (Comment) در برنامه های سی شارپ آشنا خواهیم شد. *ITPRO باشید*

نویسنده : حسین احمدی
منبع : |جزیره برنامه نویسی وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است

همچنین می توانیم از قسمت Run (کلید های Windows+R) و دستور cmd پنجره Command Prompt را باز کنیم. یا می توانیم از قسمت File Explorer ویندوز با رفتن به پوشه ای که فایل Program.cs در آن قرار دارد و نگه داشتن کلید Shift و راست کلیک موس گزینه Open command window here را انتخاب کنیم تا پنجره Command Prompt در همان پوشه باز شود:


با عرض سلام به همراهان همیشگی انجمن تخصصی فناوری اطلاعات ایران، با قسمت چهارم سری آموزشی زبان سی شارپ در خدمت شما عزیزان هستم.در قسمت قبلی، با نوشتن یک برنامه ساده با محیط Visual Studio و چگونگی اجرای برنامه های نوشته شده به زبان سی شارپ آشنا شدیم. در ادامه به بررسی ساختار برنامه های سی شارپ و نحوه کامپایل و اجرای برنامه ها خواهیم پرداخت.در قسمت قبل کدهایی را در فایل Program.cs نوشتیم. در این قسمت می خواهیم در مورد این فایل و محتویات آن بیشتر صحبت کنیم. اگر به خاطر داشته باشید محتویات فایل Program.cs به صورت زیر بود:

<c#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Course03_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

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

<c#>
        static void Main(string[] args)
        {
        }
<c#>

قطعه کد بالا، یک متد است. در باره متدها در بخش های آینده بیشتر توضیح خواهیم داد، اما در حال حاضر به خاطر داشته باشید که کد بالا متدی را تعریف می کند که نام آن Main است. کار متد Main چیست؟ برنامه ای که ما می نویسیم، باید یک نقطه شروع داشته باشد. متد Main نقطه شروع برنامه ما است. یعنی زمانی که ما برنامه ای که به زبان C# نوشته شده را اجرا می کنیم، .NET Framework در فایل اجرایی ما دنبال متدی به نام Main گشته و با پیدا کردن آن، کدهای داخل این متد را اجرا می کند. کدهایی که بین { و } نوشته می شوند که در برنامه قبلی، دو خطی که خروجی را نمایش می دهد و خطی که منتظر زدن کلیدی توسط کاربر می شود، محتویات متد Main هستند. با رسیدن به آخرین خط متد و اجرای آن، از متد Main خارج شده و برنامه به اتمام می رسد.

ما بقی قسمت های فایل، در بخش های بعدی مورد  بررسی قرار خواهند گرفت.

ما گفتیم که برای نوشتن برنامه های این دوره، از محیط Visual Studio استفاده خواهیم کرد. اما این امکان وجود دارد که بتوانیم برنامه هایمان را بدون محیط Visual Studio نوشته و اجرا کنیم. برای این کار به کامپایلر زبان C# نیاز داریم. کامپایلر زبان C# فایلی است به نام csc.exe که عملیات ترجمه کدهای نوشته به زبان IL و ایجاد فایل اجرایی را به عهده دارد. برای آشنایی با کامپایلر زبان C#، یک تمرین ساده را به صورت قدم به قدم با هم انجام می دهیم.

1. در پوشه C# 2013 Tutorials یک پوشه جدید با نام CSharp-Course04-01 ایجاد کنید.

*برای ایجاد پوشه جدید در File Explorer ویندوز می توانید از ترکیب کلید های Ctrl+Shif+N و یا راست کلیک موس و سپس انتخاب New > Folder استفاده کنید.*

2. بعد از ایجاد پوشه CSharp-Course04-01، داخل آن یک فایل txt ایجاد کنید.

*برای ایجاد فایل متنی، دکمه سمت راست، گزینه New > Text Document را انتخاب کنید.*

3. بعد از ایجاد فایل متنی، نام آن را به Program.cs تغییر دهید.

* برای تغییر نام، فایل را انتخاب کرده و کلید F2 را فشار دهید. دقت کنید که پسوند برخی فایل ها مانند فایل های متنی در ویندوز نمایش داده نمی شوند. در صورت عدم نمایش پسوند فایل و تغییر نام آن، نام فایل به Program.cs.txt تغییر می کنید. برای نمایش پسوند فایل ها، در File Explorer ویندوز 8.1 گزینه زیر را از تب View تیک بزنید:

||http://tosinso.com/files/get/cfe4806a-f1e0-4692-9f0a-397501ff1715||

4. بعد از تغییر نام فایل، فایل Program.cs را با برنامه Noetpad باز کرده و محتویات آن را مطابق کد زیر تغییر دهید:

<c#>
using System;

namespace CSharpCourse0401
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir!);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

5. حال، باید فایل نوشته شده بالا را با کامپایلر زبان C# ترجمه کرده و فایل خروجی را تولید کنیم. برای اینکار از دستور csc.exe استفاده می کنیم. فایل csc.exe در مسیر زیر قرار دارد:

<ltr>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
<ltr>

ابتدا Command Prompt را با می کنیم. برای باز کردن Command Prompt بر روی دکمه Start راست کلیک کرده و گزینه Command Prompt (Admin) را انتخاب می کنیم:

||http://tosinso.com/files/get/3b50fa4d-130b-48db-9283-16ff05fb3f7e||

همچنین می توانیم از قسمت Run (کلید های Windows+R) و دستور cmd پنجره Command Prompt را باز کنیم. یا می توانیم از قسمت File Explorer ویندوز با رفتن به پوشه ای که فایل Program.cs در آن قرار دارد و نگه داشتن کلید Shift و راست کلیک موس گزینه Open command window here را انتخاب کنیم تا پنجره Command Prompt در همان پوشه باز شود:

||http://tosinso.com/files/get/24d909b0-f850-4c2b-baad-026cea6f2301||

در صورتی که داخل پوشه CSharp-Course04-01 نبودیم، با دستورات زیر وارد این پوشه می شویم:

<text>
g:
cd C# 2013 Tutorials\CSharp-Course04-01
<text>

حال باید فایل Program.cs را کامپایل کنیم. برای اینکار دستور زیر را در پنجره Command Prompt می نویسیم:

<text>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs
<text>

||http://tosinso.com/files/get/f6305818-7ea5-42ec-a1fd-66909e341330||

بعد از اجرای دستور بالا، فایلی با نام Program.exe در کنار فایل Program.cs ایجاد می شود که با اجرای آن، خروجی مورد نظر در پنجره Console برای ما نمایش داده شده و با زدن کلیدی از برنامه خارج می شویم:

||http://tosinso.com/files/get/adc52331-6faf-4506-942e-2eb9d3e6ecef||

||http://tosinso.com/files/get/95092b47-f8f3-4361-bb41-f527aa2b54b3||

در قسمت بالا، بدون استفاده از محیط Visual Studio برنامه ای که در قسمت قبل نوشته بودیم را نوشته، کامپایل و اجرا کردیم. کاری که Visual Studio برای ما انجام می دهد، خودکار سازی روند کامپایل و اجرای برنامه هاست که کار را برای ما بسیار ساده می کند. هدف از تمرین بالا آشنایی اولیه با دستور csc.exe که کامپایلر C# است بود. در قسمت های بعدی با این دستور و تنظیمات مختلف آن بیشتر آشنا خواهیم شد. در این قسمت با ساختار فایل Program.cs، متد Main، نحوه اجرای برنامه ها و کامپایلر زبان C# (دستور csc.exe) آشنا شدیم. در قسمت بعدی آموزش با دستورات اولیه محیط Console، تعریف و استفاده از متغییر ها، عبارات و نوع ها و همچنین نوشتن یادداشت (Comment) در برنامه های سی شارپ آشنا خواهیم شد. *ITPRO باشید*

نویسنده : حسین احمدی
منبع : |جزیره برنامه نویسی وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است

در صورتی که داخل پوشه CSharp-Course04-01 نبودیم، با دستورات زیر وارد این پوشه می شویم:

g:
cd "C# 2013 Tutorials\CSharp-Course04-01"

حال باید فایل Program.cs را کامپایل کنیم. برای اینکار دستور زیر را در پنجره Command Prompt می نویسیم:

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs


با عرض سلام به همراهان همیشگی انجمن تخصصی فناوری اطلاعات ایران، با قسمت چهارم سری آموزشی زبان سی شارپ در خدمت شما عزیزان هستم.در قسمت قبلی، با نوشتن یک برنامه ساده با محیط Visual Studio و چگونگی اجرای برنامه های نوشته شده به زبان سی شارپ آشنا شدیم. در ادامه به بررسی ساختار برنامه های سی شارپ و نحوه کامپایل و اجرای برنامه ها خواهیم پرداخت.در قسمت قبل کدهایی را در فایل Program.cs نوشتیم. در این قسمت می خواهیم در مورد این فایل و محتویات آن بیشتر صحبت کنیم. اگر به خاطر داشته باشید محتویات فایل Program.cs به صورت زیر بود:

<c#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Course03_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

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

<c#>
        static void Main(string[] args)
        {
        }
<c#>

قطعه کد بالا، یک متد است. در باره متدها در بخش های آینده بیشتر توضیح خواهیم داد، اما در حال حاضر به خاطر داشته باشید که کد بالا متدی را تعریف می کند که نام آن Main است. کار متد Main چیست؟ برنامه ای که ما می نویسیم، باید یک نقطه شروع داشته باشد. متد Main نقطه شروع برنامه ما است. یعنی زمانی که ما برنامه ای که به زبان C# نوشته شده را اجرا می کنیم، .NET Framework در فایل اجرایی ما دنبال متدی به نام Main گشته و با پیدا کردن آن، کدهای داخل این متد را اجرا می کند. کدهایی که بین { و } نوشته می شوند که در برنامه قبلی، دو خطی که خروجی را نمایش می دهد و خطی که منتظر زدن کلیدی توسط کاربر می شود، محتویات متد Main هستند. با رسیدن به آخرین خط متد و اجرای آن، از متد Main خارج شده و برنامه به اتمام می رسد.

ما بقی قسمت های فایل، در بخش های بعدی مورد  بررسی قرار خواهند گرفت.

ما گفتیم که برای نوشتن برنامه های این دوره، از محیط Visual Studio استفاده خواهیم کرد. اما این امکان وجود دارد که بتوانیم برنامه هایمان را بدون محیط Visual Studio نوشته و اجرا کنیم. برای این کار به کامپایلر زبان C# نیاز داریم. کامپایلر زبان C# فایلی است به نام csc.exe که عملیات ترجمه کدهای نوشته به زبان IL و ایجاد فایل اجرایی را به عهده دارد. برای آشنایی با کامپایلر زبان C#، یک تمرین ساده را به صورت قدم به قدم با هم انجام می دهیم.

1. در پوشه C# 2013 Tutorials یک پوشه جدید با نام CSharp-Course04-01 ایجاد کنید.

*برای ایجاد پوشه جدید در File Explorer ویندوز می توانید از ترکیب کلید های Ctrl+Shif+N و یا راست کلیک موس و سپس انتخاب New > Folder استفاده کنید.*

2. بعد از ایجاد پوشه CSharp-Course04-01، داخل آن یک فایل txt ایجاد کنید.

*برای ایجاد فایل متنی، دکمه سمت راست، گزینه New > Text Document را انتخاب کنید.*

3. بعد از ایجاد فایل متنی، نام آن را به Program.cs تغییر دهید.

* برای تغییر نام، فایل را انتخاب کرده و کلید F2 را فشار دهید. دقت کنید که پسوند برخی فایل ها مانند فایل های متنی در ویندوز نمایش داده نمی شوند. در صورت عدم نمایش پسوند فایل و تغییر نام آن، نام فایل به Program.cs.txt تغییر می کنید. برای نمایش پسوند فایل ها، در File Explorer ویندوز 8.1 گزینه زیر را از تب View تیک بزنید:

||http://tosinso.com/files/get/cfe4806a-f1e0-4692-9f0a-397501ff1715||

4. بعد از تغییر نام فایل، فایل Program.cs را با برنامه Noetpad باز کرده و محتویات آن را مطابق کد زیر تغییر دهید:

<c#>
using System;

namespace CSharpCourse0401
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir!);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

5. حال، باید فایل نوشته شده بالا را با کامپایلر زبان C# ترجمه کرده و فایل خروجی را تولید کنیم. برای اینکار از دستور csc.exe استفاده می کنیم. فایل csc.exe در مسیر زیر قرار دارد:

<ltr>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
<ltr>

ابتدا Command Prompt را با می کنیم. برای باز کردن Command Prompt بر روی دکمه Start راست کلیک کرده و گزینه Command Prompt (Admin) را انتخاب می کنیم:

||http://tosinso.com/files/get/3b50fa4d-130b-48db-9283-16ff05fb3f7e||

همچنین می توانیم از قسمت Run (کلید های Windows+R) و دستور cmd پنجره Command Prompt را باز کنیم. یا می توانیم از قسمت File Explorer ویندوز با رفتن به پوشه ای که فایل Program.cs در آن قرار دارد و نگه داشتن کلید Shift و راست کلیک موس گزینه Open command window here را انتخاب کنیم تا پنجره Command Prompt در همان پوشه باز شود:

||http://tosinso.com/files/get/24d909b0-f850-4c2b-baad-026cea6f2301||

در صورتی که داخل پوشه CSharp-Course04-01 نبودیم، با دستورات زیر وارد این پوشه می شویم:

<text>
g:
cd C# 2013 Tutorials\CSharp-Course04-01
<text>

حال باید فایل Program.cs را کامپایل کنیم. برای اینکار دستور زیر را در پنجره Command Prompt می نویسیم:

<text>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs
<text>

||http://tosinso.com/files/get/f6305818-7ea5-42ec-a1fd-66909e341330||

بعد از اجرای دستور بالا، فایلی با نام Program.exe در کنار فایل Program.cs ایجاد می شود که با اجرای آن، خروجی مورد نظر در پنجره Console برای ما نمایش داده شده و با زدن کلیدی از برنامه خارج می شویم:

||http://tosinso.com/files/get/adc52331-6faf-4506-942e-2eb9d3e6ecef||

||http://tosinso.com/files/get/95092b47-f8f3-4361-bb41-f527aa2b54b3||

در قسمت بالا، بدون استفاده از محیط Visual Studio برنامه ای که در قسمت قبل نوشته بودیم را نوشته، کامپایل و اجرا کردیم. کاری که Visual Studio برای ما انجام می دهد، خودکار سازی روند کامپایل و اجرای برنامه هاست که کار را برای ما بسیار ساده می کند. هدف از تمرین بالا آشنایی اولیه با دستور csc.exe که کامپایلر C# است بود. در قسمت های بعدی با این دستور و تنظیمات مختلف آن بیشتر آشنا خواهیم شد. در این قسمت با ساختار فایل Program.cs، متد Main، نحوه اجرای برنامه ها و کامپایلر زبان C# (دستور csc.exe) آشنا شدیم. در قسمت بعدی آموزش با دستورات اولیه محیط Console، تعریف و استفاده از متغییر ها، عبارات و نوع ها و همچنین نوشتن یادداشت (Comment) در برنامه های سی شارپ آشنا خواهیم شد. *ITPRO باشید*

نویسنده : حسین احمدی
منبع : |جزیره برنامه نویسی وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است

بعد از اجرای دستور بالا، فایلی با نام Program.exe در کنار فایل Program.cs ایجاد می شود که با اجرای آن، خروجی مورد نظر در پنجره Console برای ما نمایش داده شده و با زدن کلیدی از برنامه خارج می شویم:


با عرض سلام به همراهان همیشگی انجمن تخصصی فناوری اطلاعات ایران، با قسمت چهارم سری آموزشی زبان سی شارپ در خدمت شما عزیزان هستم.در قسمت قبلی، با نوشتن یک برنامه ساده با محیط Visual Studio و چگونگی اجرای برنامه های نوشته شده به زبان سی شارپ آشنا شدیم. در ادامه به بررسی ساختار برنامه های سی شارپ و نحوه کامپایل و اجرای برنامه ها خواهیم پرداخت.در قسمت قبل کدهایی را در فایل Program.cs نوشتیم. در این قسمت می خواهیم در مورد این فایل و محتویات آن بیشتر صحبت کنیم. اگر به خاطر داشته باشید محتویات فایل Program.cs به صورت زیر بود:

<c#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Course03_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

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

<c#>
        static void Main(string[] args)
        {
        }
<c#>

قطعه کد بالا، یک متد است. در باره متدها در بخش های آینده بیشتر توضیح خواهیم داد، اما در حال حاضر به خاطر داشته باشید که کد بالا متدی را تعریف می کند که نام آن Main است. کار متد Main چیست؟ برنامه ای که ما می نویسیم، باید یک نقطه شروع داشته باشد. متد Main نقطه شروع برنامه ما است. یعنی زمانی که ما برنامه ای که به زبان C# نوشته شده را اجرا می کنیم، .NET Framework در فایل اجرایی ما دنبال متدی به نام Main گشته و با پیدا کردن آن، کدهای داخل این متد را اجرا می کند. کدهایی که بین { و } نوشته می شوند که در برنامه قبلی، دو خطی که خروجی را نمایش می دهد و خطی که منتظر زدن کلیدی توسط کاربر می شود، محتویات متد Main هستند. با رسیدن به آخرین خط متد و اجرای آن، از متد Main خارج شده و برنامه به اتمام می رسد.

ما بقی قسمت های فایل، در بخش های بعدی مورد  بررسی قرار خواهند گرفت.

ما گفتیم که برای نوشتن برنامه های این دوره، از محیط Visual Studio استفاده خواهیم کرد. اما این امکان وجود دارد که بتوانیم برنامه هایمان را بدون محیط Visual Studio نوشته و اجرا کنیم. برای این کار به کامپایلر زبان C# نیاز داریم. کامپایلر زبان C# فایلی است به نام csc.exe که عملیات ترجمه کدهای نوشته به زبان IL و ایجاد فایل اجرایی را به عهده دارد. برای آشنایی با کامپایلر زبان C#، یک تمرین ساده را به صورت قدم به قدم با هم انجام می دهیم.

1. در پوشه C# 2013 Tutorials یک پوشه جدید با نام CSharp-Course04-01 ایجاد کنید.

*برای ایجاد پوشه جدید در File Explorer ویندوز می توانید از ترکیب کلید های Ctrl+Shif+N و یا راست کلیک موس و سپس انتخاب New > Folder استفاده کنید.*

2. بعد از ایجاد پوشه CSharp-Course04-01، داخل آن یک فایل txt ایجاد کنید.

*برای ایجاد فایل متنی، دکمه سمت راست، گزینه New > Text Document را انتخاب کنید.*

3. بعد از ایجاد فایل متنی، نام آن را به Program.cs تغییر دهید.

* برای تغییر نام، فایل را انتخاب کرده و کلید F2 را فشار دهید. دقت کنید که پسوند برخی فایل ها مانند فایل های متنی در ویندوز نمایش داده نمی شوند. در صورت عدم نمایش پسوند فایل و تغییر نام آن، نام فایل به Program.cs.txt تغییر می کنید. برای نمایش پسوند فایل ها، در File Explorer ویندوز 8.1 گزینه زیر را از تب View تیک بزنید:

||http://tosinso.com/files/get/cfe4806a-f1e0-4692-9f0a-397501ff1715||

4. بعد از تغییر نام فایل، فایل Program.cs را با برنامه Noetpad باز کرده و محتویات آن را مطابق کد زیر تغییر دهید:

<c#>
using System;

namespace CSharpCourse0401
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir!);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

5. حال، باید فایل نوشته شده بالا را با کامپایلر زبان C# ترجمه کرده و فایل خروجی را تولید کنیم. برای اینکار از دستور csc.exe استفاده می کنیم. فایل csc.exe در مسیر زیر قرار دارد:

<ltr>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
<ltr>

ابتدا Command Prompt را با می کنیم. برای باز کردن Command Prompt بر روی دکمه Start راست کلیک کرده و گزینه Command Prompt (Admin) را انتخاب می کنیم:

||http://tosinso.com/files/get/3b50fa4d-130b-48db-9283-16ff05fb3f7e||

همچنین می توانیم از قسمت Run (کلید های Windows+R) و دستور cmd پنجره Command Prompt را باز کنیم. یا می توانیم از قسمت File Explorer ویندوز با رفتن به پوشه ای که فایل Program.cs در آن قرار دارد و نگه داشتن کلید Shift و راست کلیک موس گزینه Open command window here را انتخاب کنیم تا پنجره Command Prompt در همان پوشه باز شود:

||http://tosinso.com/files/get/24d909b0-f850-4c2b-baad-026cea6f2301||

در صورتی که داخل پوشه CSharp-Course04-01 نبودیم، با دستورات زیر وارد این پوشه می شویم:

<text>
g:
cd C# 2013 Tutorials\CSharp-Course04-01
<text>

حال باید فایل Program.cs را کامپایل کنیم. برای اینکار دستور زیر را در پنجره Command Prompt می نویسیم:

<text>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs
<text>

||http://tosinso.com/files/get/f6305818-7ea5-42ec-a1fd-66909e341330||

بعد از اجرای دستور بالا، فایلی با نام Program.exe در کنار فایل Program.cs ایجاد می شود که با اجرای آن، خروجی مورد نظر در پنجره Console برای ما نمایش داده شده و با زدن کلیدی از برنامه خارج می شویم:

||http://tosinso.com/files/get/adc52331-6faf-4506-942e-2eb9d3e6ecef||

||http://tosinso.com/files/get/95092b47-f8f3-4361-bb41-f527aa2b54b3||

در قسمت بالا، بدون استفاده از محیط Visual Studio برنامه ای که در قسمت قبل نوشته بودیم را نوشته، کامپایل و اجرا کردیم. کاری که Visual Studio برای ما انجام می دهد، خودکار سازی روند کامپایل و اجرای برنامه هاست که کار را برای ما بسیار ساده می کند. هدف از تمرین بالا آشنایی اولیه با دستور csc.exe که کامپایلر C# است بود. در قسمت های بعدی با این دستور و تنظیمات مختلف آن بیشتر آشنا خواهیم شد. در این قسمت با ساختار فایل Program.cs، متد Main، نحوه اجرای برنامه ها و کامپایلر زبان C# (دستور csc.exe) آشنا شدیم. در قسمت بعدی آموزش با دستورات اولیه محیط Console، تعریف و استفاده از متغییر ها، عبارات و نوع ها و همچنین نوشتن یادداشت (Comment) در برنامه های سی شارپ آشنا خواهیم شد. *ITPRO باشید*

نویسنده : حسین احمدی
منبع : |جزیره برنامه نویسی وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است


با عرض سلام به همراهان همیشگی انجمن تخصصی فناوری اطلاعات ایران، با قسمت چهارم سری آموزشی زبان سی شارپ در خدمت شما عزیزان هستم.در قسمت قبلی، با نوشتن یک برنامه ساده با محیط Visual Studio و چگونگی اجرای برنامه های نوشته شده به زبان سی شارپ آشنا شدیم. در ادامه به بررسی ساختار برنامه های سی شارپ و نحوه کامپایل و اجرای برنامه ها خواهیم پرداخت.در قسمت قبل کدهایی را در فایل Program.cs نوشتیم. در این قسمت می خواهیم در مورد این فایل و محتویات آن بیشتر صحبت کنیم. اگر به خاطر داشته باشید محتویات فایل Program.cs به صورت زیر بود:

<c#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp_Course03_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

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

<c#>
        static void Main(string[] args)
        {
        }
<c#>

قطعه کد بالا، یک متد است. در باره متدها در بخش های آینده بیشتر توضیح خواهیم داد، اما در حال حاضر به خاطر داشته باشید که کد بالا متدی را تعریف می کند که نام آن Main است. کار متد Main چیست؟ برنامه ای که ما می نویسیم، باید یک نقطه شروع داشته باشد. متد Main نقطه شروع برنامه ما است. یعنی زمانی که ما برنامه ای که به زبان C# نوشته شده را اجرا می کنیم، .NET Framework در فایل اجرایی ما دنبال متدی به نام Main گشته و با پیدا کردن آن، کدهای داخل این متد را اجرا می کند. کدهایی که بین { و } نوشته می شوند که در برنامه قبلی، دو خطی که خروجی را نمایش می دهد و خطی که منتظر زدن کلیدی توسط کاربر می شود، محتویات متد Main هستند. با رسیدن به آخرین خط متد و اجرای آن، از متد Main خارج شده و برنامه به اتمام می رسد.

ما بقی قسمت های فایل، در بخش های بعدی مورد  بررسی قرار خواهند گرفت.

ما گفتیم که برای نوشتن برنامه های این دوره، از محیط Visual Studio استفاده خواهیم کرد. اما این امکان وجود دارد که بتوانیم برنامه هایمان را بدون محیط Visual Studio نوشته و اجرا کنیم. برای این کار به کامپایلر زبان C# نیاز داریم. کامپایلر زبان C# فایلی است به نام csc.exe که عملیات ترجمه کدهای نوشته به زبان IL و ایجاد فایل اجرایی را به عهده دارد. برای آشنایی با کامپایلر زبان C#، یک تمرین ساده را به صورت قدم به قدم با هم انجام می دهیم.

1. در پوشه C# 2013 Tutorials یک پوشه جدید با نام CSharp-Course04-01 ایجاد کنید.

*برای ایجاد پوشه جدید در File Explorer ویندوز می توانید از ترکیب کلید های Ctrl+Shif+N و یا راست کلیک موس و سپس انتخاب New > Folder استفاده کنید.*

2. بعد از ایجاد پوشه CSharp-Course04-01، داخل آن یک فایل txt ایجاد کنید.

*برای ایجاد فایل متنی، دکمه سمت راست، گزینه New > Text Document را انتخاب کنید.*

3. بعد از ایجاد فایل متنی، نام آن را به Program.cs تغییر دهید.

* برای تغییر نام، فایل را انتخاب کرده و کلید F2 را فشار دهید. دقت کنید که پسوند برخی فایل ها مانند فایل های متنی در ویندوز نمایش داده نمی شوند. در صورت عدم نمایش پسوند فایل و تغییر نام آن، نام فایل به Program.cs.txt تغییر می کنید. برای نمایش پسوند فایل ها، در File Explorer ویندوز 8.1 گزینه زیر را از تب View تیک بزنید:

||http://tosinso.com/files/get/cfe4806a-f1e0-4692-9f0a-397501ff1715||

4. بعد از تغییر نام فایل، فایل Program.cs را با برنامه Noetpad باز کرده و محتویات آن را مطابق کد زیر تغییر دهید:

<c#>
using System;

namespace CSharpCourse0401
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(Hello ITPro.ir!);
            Console.WriteLine(Press any key to exit...);
            Console.ReadKey();
        }
    }
}
<c#>

5. حال، باید فایل نوشته شده بالا را با کامپایلر زبان C# ترجمه کرده و فایل خروجی را تولید کنیم. برای اینکار از دستور csc.exe استفاده می کنیم. فایل csc.exe در مسیر زیر قرار دارد:

<ltr>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
<ltr>

ابتدا Command Prompt را با می کنیم. برای باز کردن Command Prompt بر روی دکمه Start راست کلیک کرده و گزینه Command Prompt (Admin) را انتخاب می کنیم:

||http://tosinso.com/files/get/3b50fa4d-130b-48db-9283-16ff05fb3f7e||

همچنین می توانیم از قسمت Run (کلید های Windows+R) و دستور cmd پنجره Command Prompt را باز کنیم. یا می توانیم از قسمت File Explorer ویندوز با رفتن به پوشه ای که فایل Program.cs در آن قرار دارد و نگه داشتن کلید Shift و راست کلیک موس گزینه Open command window here را انتخاب کنیم تا پنجره Command Prompt در همان پوشه باز شود:

||http://tosinso.com/files/get/24d909b0-f850-4c2b-baad-026cea6f2301||

در صورتی که داخل پوشه CSharp-Course04-01 نبودیم، با دستورات زیر وارد این پوشه می شویم:

<text>
g:
cd C# 2013 Tutorials\CSharp-Course04-01
<text>

حال باید فایل Program.cs را کامپایل کنیم. برای اینکار دستور زیر را در پنجره Command Prompt می نویسیم:

<text>
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs
<text>

||http://tosinso.com/files/get/f6305818-7ea5-42ec-a1fd-66909e341330||

بعد از اجرای دستور بالا، فایلی با نام Program.exe در کنار فایل Program.cs ایجاد می شود که با اجرای آن، خروجی مورد نظر در پنجره Console برای ما نمایش داده شده و با زدن کلیدی از برنامه خارج می شویم:

||http://tosinso.com/files/get/adc52331-6faf-4506-942e-2eb9d3e6ecef||

||http://tosinso.com/files/get/95092b47-f8f3-4361-bb41-f527aa2b54b3||

در قسمت بالا، بدون استفاده از محیط Visual Studio برنامه ای که در قسمت قبل نوشته بودیم را نوشته، کامپایل و اجرا کردیم. کاری که Visual Studio برای ما انجام می دهد، خودکار سازی روند کامپایل و اجرای برنامه هاست که کار را برای ما بسیار ساده می کند. هدف از تمرین بالا آشنایی اولیه با دستور csc.exe که کامپایلر C# است بود. در قسمت های بعدی با این دستور و تنظیمات مختلف آن بیشتر آشنا خواهیم شد. در این قسمت با ساختار فایل Program.cs، متد Main، نحوه اجرای برنامه ها و کامپایلر زبان C# (دستور csc.exe) آشنا شدیم. در قسمت بعدی آموزش با دستورات اولیه محیط Console، تعریف و استفاده از متغییر ها، عبارات و نوع ها و همچنین نوشتن یادداشت (Comment) در برنامه های سی شارپ آشنا خواهیم شد. *ITPRO باشید*

نویسنده : حسین احمدی
منبع : |جزیره برنامه نویسی وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است

در قسمت بالا، بدون استفاده از محیط Visual Studio برنامه ای که در قسمت قبل نوشته بودیم را نوشته، کامپایل و اجرا کردیم. کاری که Visual Studio برای ما انجام می دهد، خودکار سازی روند کامپایل و اجرای برنامه هاست که کار را برای ما بسیار ساده می کند. هدف از تمرین بالا آشنایی اولیه با دستور csc.exe که کامپایلر C# است بود.

در قسمت های بعدی با این دستور و تنظیمات مختلف آن بیشتر آشنا خواهیم شد. در این قسمت با ساختار فایل Program.cs، متد Main، نحوه اجرای برنامه ها و کامپایلر زبان C# (دستور csc.exe) آشنا شدیم. در قسمت بعدی آموزش با دستورات اولیه محیط Console، تعریف و استفاده از متغییر ها، عبارات و نوع ها و همچنین نوشتن یادداشت (Comment) در برنامه های سی شارپ آشنا خواهیم شد

دستورات کنسول و متغیرها

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

  1. دستورات اولیه محیط Console
  2. متغیرها و شیوه تعریف و استفاده از آنها
  3. آشنایی با دستورات یا Statements
  4. شیوه نوشتن یادداشت (Comment) در کدها

دستورات اولیه محیط Console

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

  1. Console.Write
  2. Console.WriteLine
  3. Console.ReadKey

دستور Console.Write

این دستور یک پیغام را در صفحه کنسول به عنوان خروجی برای ما نمایش می دهد. ما می توانیم عبارت مورد نظر را به صورت رشته به این دستور به عنوان پارامتر ارسال کنیم تا در خروجی نمایش داده شود. برای مثال فرض کنید می خواهیم عبارت «Welcome» را در خروجی نمایش دهیم. برای اینکار دستور زیر را می نویسیم:

Console.Write("Welcome");

با دستور بالا عبارت Welcome بر روی پنجره Console نمایش داده خواهد شد. رشته ها بین علامت «"» قرار میگیرند. در صورتی که ما چندین دستور Console.Write را پشت سر هم بنویسیم، خروجی ها پست سر هم نمایش داده خواهند شد. برای مثال:

Console.Write("A");
Console.Write("B");
Console.Write("C");

خروجی کد بالا به صورت زیر خواهد بود:

ABC

دستور Console.WriteLine

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

Console.WriteLine("A");
Console.WriteLine("B");
Console.WriteLine("C");

خروجی دستورات بالا به صورت زیر است:

A
B
C

برای درک بهتر مثالی از استفاده ترکیبی دو دستور Write و WriteLine را بررسی می کنیم:

Console.Write("A");
Console.WriteLine("B");
Console.WriteLine("C");
Console.Write("D");
Console.Write("E");

خروجی کد بالا به صورت زیر خواهد بود:

AB
C
DE

دستور Console.ReadKey

فرض کنید کد زیر را در محیط کنسول نوشته ایم:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Welcome to my application!");
    }
}

با زدن کلید F5 و اجرای برنامه، پنجره کنسول لحظه ای ظاهر شده و مجدداً ناپدید می شود و برنامه به اتمام می رسد. برای مشاهده خروجی باید کاری کرد. راه حل این مشکل، استفاده از دستور Console.ReadKey می باشد. همانطور که گفتیم برنامه به صورت خط به خط اجرا می شود.

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

static void Main(string[] args)
{
    Console.WriteLine("Welcome to my application!");
    Console.ReadKey();
}

متغیرها و شیوه تعریف و استفاده از آنها

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

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

در حقیقت انبار فضای حافظه شما، جعبه ها متغیرهای شما و میوه ها محتویات متغیرهای شما هستند.متغیرها انواع مختلفی دارند، اما برای شروع و آشنایی با شیوه تعریف و استفاده متغیرها، با نوع رشته ای و نخوه تعریف متغیرهایی از این نوع آشنا خواهیم شد. شیوه تعریف متغیرها به صورت زیر است:

{data-type} {variable-name} = {variable-value};
  1. data-type: نوع متغیری که میخواهیم تعریف کنیم را مشخص می کند. متغیرها می توانند رشته ای، عددی یا ... باشند.
  2. variable-name: نام متغیر را مشخص می کند، شما نام متغیر را هر چیزی می توانید بگذارید، اما دقت کنید که نام متغیرها می توانند ترکیبی از حروف و عدد و کاراکتر «__» باشند، و نام متغیرها نمی توانند با عدد شروع شوند. برای مثال نام های number1 و first__name و a__12 برای نامگذاری صحیح بوده، اما نام های 2number و first-name صحیح نمی باشند و کامپایلر به شما پیغام خطا خواهد داد.
  3. variable-value: مقدار اولیه متغیر، مقدار اولیه ای که داخل متغیر قرار خواهد گرفت را مشخص می کند. نوشتن این قسمت احتیاری است، اما توجه کنید که متغیرها یا داخلشان مقداری ریخته می شود یا مقدار داخل آنها مورد استفاده قرار می گیرد. تنها متغیرهایی را می توان استفاده کرد که داخل آنها مقداری ریخته باشیم.

در این بخش و برای شروع با نوع رشته ای آشنا می شویم و متغیرها را بر این نوع تعریف می کنیم. نوع رشته ای با کلمه کلیدی string تعریف می شود. برای مثال فرض کنید می خواهیم متغیری با نام website و از نوع رشته ای تعریف کنیم و عبارت ITPro را داخل آن قرار دهیم. کد آن به صورت زیر خواهد بود:

string website = "ITPro";

دقت کنید که کلیه رشته باید بین علامت «"» قرار بگیرند. دستور بالا را می توان به صورت زیر نیز نوشت:

string website;
website = "ITPro";

دستور اول متغیر مورد نظر با نام website را تعریف کرده و خط دوم مقدار ITPro را به منسب می کند. کلا" عملیات انتساب مقادیر به متغیرها با علامت «=» انجام می شود. ابتدا نام متغیر، علامت «=» و سپس مقدار مورد نظر.مزیت استفاده از متغیرها این است که ما متغیری را تعریف می کنیم و در قسمت های مختلف کد از آن متغیر استفاده می کنیم. برای مثال:

string firstName = "Hossein";
Console.WriteLine(firstName);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
  1. خط اول متغیری با نام firstName تعریف کرده و مقدار Hossein را داخل آن قرار می دهد.
  2. در خط دوم بوسیله دستور Console.WriteLine، مقدار متغیر firstName را در خروجی نمایش می دهیم.
  3. خط سوم پیامی را به کاربر مبنی بر اینکه برای خروج کلیدی را فشار دهد نمایش داده می شود.
  4. در خط پایانی یا خط چهارم، برنامه منتظر می ماند تا کاربر کلیدی را فشار دهد.

در صورت نوشتن کد بالا در متد Main خروجی زیر را در پنجره کنسول مشاهده خواهید کرد:

Hossein
Press any key to exit...

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

دستورات زبان سی شارپ

دستورات، مجموعه ای از کلمه ها هستند که در کنار هم کاری را انجام می دهند. در طول مطلب آموزش سی شارپ، تا به حال شما چندین دستور سی شارپ رو دیدید. برای مثال، دستور تعریف متغیر یا دستور نمایش خروجی در صفحه کنسول. هر دستور در زبان سی شارپ باید با علامت ; به اتمام برسد. در صورت عدم قرار دادن این علامت در انتهای دستورات زبان سی شارپ، با پیغام خطا مواجه خواهید شد. به مجموعه ای از دستورات که در پشت هم نوشته شده و به صورت خط به خط اجرا می شوند روند کنترل (flow of control) یا روند اجرا (flow of execution) می گویند. مثال زیر چند دستور را نشان می دهد:

string name;
name = "Hossein"
Console.WriteLine(name);

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

نوشتن یادداشت یا Comment برای کدها

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

  1. یادداشت های تک خطی
  2. یادداشت های چند خطی

یادداشت تک خطی

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

// C# tutorial
// by Hossein Ahmadi
// ITPro.ir
string message = "Welcome!";
Console.WriteLine(message);

یادداشت های چند خطی

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

/*
C# tutorial
by Hossein Ahmadi
ITPro.ir
*/
string message = "Welcome!";
Console.WriteLine(message);

در حقیقت، هر متنی که بین **// و //** قرار بگیرد به عنوان یادداشت در نظر گرفته خواهد شد.

نوع های داده اولیه

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

این مقادیر می توانند به صورت رشته ای یا به صورت عددی باشند. در قسمت قبلی با نوع داده رشته ای یا string آشنا شدیم. در ادامه تک تک نوع های داده اولیه یا Primitive Data Types را در زبان C# بررسی خواهیم کرد.اما قبل از شروع ذکر یک نکته ضروری است.

زبان سی شارپ یک زبان Strongly-Typed است.برای این واژه معادل فارسی مناسب پیدا نکردم، اما مفهوم آن به این شرح است، هر متغیری که شما در زبان سی شارپ تعریف می کنید، حتماً باید نوع داده آن مشخص باشد. برای مثال، در زبان Visual Basic یک نوع داده به نام Variant وجود دارد که می توان در آن هر نوع مقداری را ذخیره کرد.

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

string website = "ITPro.ir";

که بخش اول نوع متغیر، بخش دوم نام و بخش انتهایی که بعد از مساوی نوشته می شود، مقدار متغیر می باشد. در قسمت اول یا نوع متغیر، ما نوع داده مورد نظر را مشخص می کنیم. در لیست زیر هر یک از متغیرهای موجود در زبان سی شارپ بررسی شده اند:

نوع داده رشته ای

نوع داده رشته ای برای ذخیره یک رشته یا متن مورد استفاده قرار می گیرد:

string firstName = "Hossein";
string lastName = "Ahmadi";
Console.WriteLine(firstName);
Console.WriteLine(lastName);

نوع های رشته را می توان با «+» به هم متصل کرد. این عملیات می تواند بر روی دو رشته، دو متغیر از نوع رشته یا یک متغیر از نوع رشته و یک رشته انجام شود:

string firstName = "Hossein";
string lastName = "Ahmadi";
string fullName = firstName+" "+lastName;
Console.WriteLine("Welcome dear " + fullName + ".");

خروجی کد بالا، متن زیر خواهد بود:

Welcome dear Hossein Ahmadi.

نوع های داده عددی

در زبان سی شارپ، چندین نوع داده عددی داریم که بر اساس نوع داده صحیح و اعشاری و بازه ذخیره سازی اعداد به شرح زیر می باشند:

  1. نوع داده byte: در این نوع داده می توان از بازه 0 تا 255 را ذخیره کرد.
  2. نوع داده sbyte: در این نوع داده می توان از بازه 128- تا 127 را ذخیره کرد.
  3. نوع داده short: در این نوع داده می توان از بازه 32،768- تا 32،767 را ذخیره کرد.
  4. نوع داده ushort: در این نوع داده می توان از بازه 0 تا 65،535 را ذخیره کرد.
  5. نوع داده int: در این نوع داده می توان از بازه 2،147،483،648- تا 2،147،483،647 را ذخیره کرد.
  6. نوع داده uint: در این نوع داده می توان از بازه 0 تا 4،294،967،295 را ذخیره کرد.
  7. نوع داده long: در این نوع داده می توان از بازه 9،223،372،036،854،775،808- تا 9،223،372،036،854،775،807 را ذخیره کرد.
  8. نوع داده ulong: در این نوع داده می توان از بازه 0 تا 18،446،744،073،709،551،615 را ذخیره کرد.
  9. نوع داده float: در این نوع داده می توان از بازه 3.402823e38- تا 3.402823e38 را ذخیره کرد.
  10. نوع داده double: در این نوع داده می توان از بازه 1.79769313486232e308- تا 1.79769313486232e308 را ذخیره کرد.
  11. نوع داده decimal: در این نوع داده می توان از بازه 79228162514264337593543950335- تا 79228162514264337593543950335 را ذخیره کرد.

نکته: علامت s در کنار byte یعنی نوع داده sbyte، مخفف signed یا دارای علامت منفی است که نشان دهنده بازه اعداد منفی می باشد.

نکته: علامت u در کنار نوع هایی مانند short و int و long، مخفف unsigned یا بدون علامت منفی است که این نوع های داده اعداد بزرگتر از صفر را قبول می کنند.

برای مثال:

int number1 = 23332345;
decimal number2 = 458.332m;
byte number3 = 231;

در صورتی که کنار عددی کاراکتر m قرار بگیرد مانند مثال بالا، مشخص می کند که این عدد از نوع decimal است، در بخش های بعدی دلیل استفاده از این کاراکتر را متوجه خواهیم شد.

  • نکته: همیشه نوع هایی که بازه شان کمتر از بازه نوع دیگر است، به طور مستقیم قابل تبدیل به هم هستند. برای مثال می توان متغیری از نوع int را داخل متغیری از نوع long ریخت، اما این برعکس این عمل امکان پذیر نیست. مثال:
int number1 = 55312;
long number2 = number1;

کد بالا بدون مشکل اجرا خواهد شد. اما کد زیر اجرا نخواهد شد:

long number1 = 223423;
int number2 = number1;

در صورت نیاز به این کار، باید از تبدیل نوع ها یا Type Casting استفاده کرد که در بخش های بعدی در مورد Type Casting توضیح خواهیم داد.

نوع داده کاراکتر

هر رشته، مجموعه ای از کارکترها می باشد. برای مثال رشته "ABC" از کاراکترهای A و B و C تشکیل شده است. برای ذخیره یک کاراکتر در زبان سی شارپ از نوع داده char استفاده می کنیم. رشته ها در بین «"» قرار می گیرند. اما یک کاراکتر در بین «'» قرار می گیرد. برای مثال:

char chr1 = 'A';
char chr2 = 'B';

کد بالا، دو متغیر از نوع کاراکتر تعریف کرده و یکی کاراکتر A و در دیگری کاراکتر B را قرار می دهد.

نوع داده منطقی یا Boolean

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

bool var1 = false;
bool var2 = true;

کد بالا، دو متغیر تعریف کرده و در اولی مقدار false و در دومی مقدار true را ذخیره می کند. در بخش بعدی در مورد عملگر های ریاضی و عملگر های مقایسه صحبت خواهیم کرد و در آن قسمت با نحوه استفاده از نوع منطقی یا Boolean بیشتر آشنا خواهید شد.

نوع داده شئ یا object

نوع داده شئ یا Object، نوع داده ایست که در آن هر نوع مقداری چه رشته ای، چه عددی و چه منطقی قابل ذخیره است:

object intObj = 123;
object decimalObj = 235.56m;
object stringObj = "ITPro.ir";

در بالا گفتیم که زبان سی شارپ یک زبان Strongly-Typed می باشد و مثالی از نوع داده Variant در Visual Basic زدیم، اما توجه کنید که شیوه عملکرد نوع داده object با نوع داده variant متفاوت است. در بخش برنامه نویسی شئ گرا و آشنایی با مبحث وراثت با نوع داده شئ و دلیل اینکه هر نوع داده ای را قبول می کند و عملیات های boxing و unboxing بیشتر آشنا می شویم.

استفاده از کلمه کلیدی var

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

var str = "ITPro.ir";
var num = 1223;
var decNum = 22563.333m;
var chr = 'A';

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

  1. متغیرهایی که با کلمه کلیدی var تعریف می شوند حتماً باید مقدار اولیه داشته باشند.
  2. بعد از تعریف متغیری با کلمه کلیدی var، نمی توان مقداری غیر از نوع اولیه آن ریخت. برای مثال:
var num = 1234;
num = "This is a text!";

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

کلمه کلیدی const

زمانی که شما متغیری را تعریف می کنید، در هر قسمت برنامه که به آن متغیر دسترسی دارید، می توانید مقدار آن را تغییر دهید. اما فرض کنید می خواهید این مقدار ثابت بوده و قابل تغییر نباشد. در اینجا باید از کلمه کلیدی const که مخفف constant یا ثابت می باشد استفاده کنید. زمانی که متغیری با این کلمه کلیدی مشخص می شود مقدار آن تنها زمان تعریف متغیر قابل تعیین خواهد بود و در سایر قسمت ها امکان تغییر مقدار متغیر را نخواهید داشت:

const int MY_CONSTANT = 12;

دستور بالا متغیری با مقدار ثابت 12 و با نام MY__CONSTANT تعریف می کند. زمان تعریف متغیرهای const سعی کنید از قاعده نام گذاری متغیرهای ثابت که تمام کاراکترهای آن Upper Case بوده و هر لغت بوسیله کاراکتر __ جدا می شوند استفاده کنید.

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

آشنایی با عملگرها

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

  1. عملگرهای محاسباتی
  2. عملگرهای رابطه ای
  3. عملگرهای منطقی
  4. عملگرهای بیتی
  5. عملگرهای انتساب

عملگرهای محاسباتی

این عملگرها برای اعمال محاسبات ریاضی مانند جمع، تفریق و ... استفاده می شوند. در زیر به بررسی هر یک از عملگرها می پردازیم:

1. عملگر +: برای جمع دو عدد استفاده می شود:

int n1 = 10;
int n2 = 15;
int result = n1 + n2; // will give 25

int result2 = 23+10; // will give 33

2. عملگر -: عملیات تفریق را انجام می دهد:

int result = 23 - 13; will give 10

3. عملگر **: عملیات ضرب را انجام می دهد:

int result = 2 * 5; // will give 10

4. عملگر //: عملیات تقسیم را انجام می دهد:

int result = 18 / 2; // will give 9

در صورتی که عملوند دوم تقسیم صفر باید با خطای DivideByZero روبرو خواهیم شد. زیرا تقسیم بر صفر مجاز نمی باشد.

5. عملگر %: باقیمانده تقسیم دو عدد را برای ما بر می گرداند:

int result = 9 % 2; // will give 1

6. عملگر ++: این عملگر به مقدار موجود یک عدد اضافه می کند:

int num = 12;
num++; // will give 13

کد بالا معادل کد زیر است:

int num = 12;
num = num + 1;

7. عملگر --: این عملگر از مقدار موجود یک عدد کم می کند:

int num = 12;
num--; // will give 11

کد بالا معادل کد زیر است:

int num = 12;
num = num - 1;

عملگرهای رابطه ای

در بخش های قبلی آموزش سی شارپ با نوع داده bool که مقدار true یا false را قبول می کرد آشنا شدیم. این عملگرها، برای مقایسه بین دو عبارت یا مقدار استفاده می شوند و نتیجه ای که بر می گردانند از نوع Boolean است. در این بخش فرض کنید دو متغیر تعریف کردیم با نام های num1 با مقدار 12 و num2 با مقدار 15. مثال های این بخش را بر روی این دو متغیر نشان خواهیم داد:

int num1 = 12;
int num2 = 15;

1. عملگر ==: این عملگر بررسی می کند که دو عبارت با هم برابر هستند یا خیر. در صورت برابر بودن مقدار true و در غیر اینصورت مقدار false بر می گرداند:

bool result1 = num1 == 12; // will give true
bool result2 = num2 == 18; // will give false

2. عملگر =!: این عملگر بررسی می کند که دو عبارت مخالف یکدیگر هستند یا خیر:

bool result1 = num1 != 12; // will give false
bool result2 = num2 != 10; // will give true

3. عملگر >: این عملگر در صورتی true بر میگرداند که عملوند سمت چپ کوچکتر از عملوند سمت راست باشد در غیر اینصورت مقدار false بر می گرداند:

bool result = num1 < num2; // will give true

3. عملگر =>: این عملگر در صورتی true بر میگرداند که عملوند سمت چپ کوچکتر یا مساوی عملوند سمت راست باشد در غیر اینصورت مقدار false بر می گرداند:

bool result1 = num1 <= num2; // will give true
bool result2 = num2 >= 18; // will give false

4. عملگر <: این عملگر در صورتی true بر میگرداند که عملوند سمت چپ بزرگتر از عملوند سمت چپ باشد:

bool result = num1 > num2; // will give false

5. عملگر =<: این عملگر در صورتی true بر میگرداند که عملوند سمت چپ بزرگتر یا مساوی از عملوند سمت راست باشد:

bool result1 = num1 >= num2; // will give false

عملگرهای منطقی

بعد از یادگیری عملگر های رابطه ای در مباحث آموزش سی شارپ، در مورد عملگرهای منطقی توضیح خواهیم داد. این نوع عملگرها بر روی نوع های boolean اعمال می شوند. یعنی عملوندهای مورد استفاده باید از نوع Boolean بوده یا مقدار Boolean بر گردانند.

1. عملگر &&: این عملگر یا AND در صورتی مقدار True بر می گرداند که هر دو عملوند مقدار true بر گردانند:

var result = num1 > 10 && num2 < 20; // will give true

دقت کنید که num1 بزرگتر از 10 می باشد، پس نتیجه true است، همچنین num2 کوچکتر از 20 است، پست نتیجه این بخش هم true است، و true && true مقدار true بر می گرداند. حالت های مختلف && را زیر مشاهده می کند:

true && true => true
true && false => false
false && true => false
false && false => false

2. عملگر ||: این عملگر یا OR در صورتی مقدار True بر می گرداند که یکی از عملوندها نتیجه true داشته باشد:

var result = num1 > 10 || num2 > 20; // will give true

دقت کنید که num1 بزرگتر از 10 می باشد، پس نتیجه true است، اما num2 بزرگتر از 20 نیست، پست نتیجه این false است، در نتیجه true

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

# عملگرهای محاسباتی
# عملگرهای رابطه ای
# عملگرهای منطقی
# عملگرهای بیتی
# عملگرهای انتساب

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

1. عملگر +: برای جمع دو عدد استفاده می شود:

<c#>
int n1 = 10;
int n2 = 15;
int result = n1 + n2; // will give 25

int result2 = 23+10; // will give 33
<c#>

*2. عملگر -*: عملیات تفریق را انجام می دهد:

<c#>
int result = 23 - 13; will give 10
<c#>

3. عملگر **: عملیات ضرب را انجام می دهد:

<c#>
int result = 2 * 5; // will give 10
<c#>

4. عملگر //: عملیات تقسیم را انجام می دهد:

<c#>
int result = 18 / 2; // will give 9
<c#>

در صورتی که عملوند دوم تقسیم صفر باید با خطای DivideByZero روبرو خواهیم شد. زیرا تقسیم بر صفر مجاز نمی باشد.

5. عملگر %: باقیمانده تقسیم دو عدد را برای ما بر می گرداند:

<c#>
int result = 9 % 2; // will give 1
<c#>

6. عملگر ++: این عملگر به مقدار موجود یک عدد اضافه می کند:

<c#>
int num = 12;
num++; // will give 13
<c#>

کد بالا معادل کد زیر است:

<c#>
int num = 12;
num = num + 1;
<c#>

7. عملگر --: این عملگر از مقدار موجود یک عدد کم می کند:

<c#>
int num = 12;
num--; // will give 11
<c#>

کد بالا معادل کد زیر است:

<c#>
int num = 12;
num = num - 1;
<c#>

!! عملگرهای رابطه ای
در قسمت قبلی با نوع داده bool که مقدار true یا false را قبول می کرد آشنا شدیم. این عملگرها، برای مقایسه بین دو عبارت یا مقدار استفاده می شوند و نتیجه ای که بر می گردانند از نوع Boolean است. در این بخش فرض کنید دو متغیر تعریف کردیم با نام های num1 با مقدار 12 و num2 با مقدار 15. مثال های این بخش را بر روی این دو متغیر نشان خواهیم داد:

<c#>
int num1 = 12;
int num2 = 15;
<c#>

1. عملگر ==: این عملگر بررسی می کند که دو عبارت با هم برابر هستند یا خیر. در صورت برابر بودن مقدار true و در غیر اینصورت مقدار false بر می گرداند:

<c#>
bool result1 = num1 == 12; // will give true
bool result2 = num2 == 18; // will give false
<c#>

2. عملگر =!: این عملگر بررسی می کند که دو عبارت مخالف یکدیگر هستند یا خیر:

<c#>
bool result1 = num1 != 12; // will give false
bool result2 = num2 != 10; // will give true
<c#>

3. عملگر >: این عملگر در صورتی true بر میگرداند که عملوند سمت چپ کوچکتر از عملوند سمت راست باشد در غیر اینصورت مقدار false بر می گرداند:

<c#>
bool result = num1 < num2; // will give true
<c#>

3. عملگر =>: این عملگر در صورتی true بر میگرداند که عملوند سمت چپ کوچکتر یا مساوی عملوند سمت راست باشد در غیر اینصورت مقدار false بر می گرداند:

<c#>
bool result1 = num1 <= num2; // will give true
bool result2 = num2 >= 18; // will give false
<c#>

4. عملگر <: این عملگر در صورتی true بر میگرداند که عملوند سمت چپ بزرگتر از عملوند سمت چپ باشد:

<c#>
bool result = num1 > num2; // will give false
<c#>

5. عملگر =<: این عملگر در صورتی true بر میگرداند که عملوند سمت چپ بزرگتر یا مساوی از عملوند سمت راست باشد:

<c#>
bool result1 = num1 >= num2; // will give false
<c#>

!! عملگرهای منطقی
در بخش قبلی در مورد عملگرهای رابطه ای توضیح دادیم که بر اساس عملگر انتخابی مقدار boolean بر می گرداندند. در این قسمت در مورد عملگرهای منطقی توضیح خواهیم داد. این نوع عملگرها بر روی نوع های boolean اعمال می شوند. یعنی عملوندهای مورد استفاده باید از نوع Boolean بوده یا مقدار Boolean بر گردانند.

1. عملگر &&: این عملگر یا AND در صورتی مقدار True بر می گرداند که هر دو عملوند مقدار true بر گردانند:

<c#>
var result = num1 > 10 && num2 < 20; // will give true
<c#>

دقت کنید که num1 بزرگتر از 10 می باشد، پس نتیجه true است، همچنین num2 کوچکتر از 20 است، پست نتیجه این بخش هم true است، و true && true مقدار true بر می گرداند. حالت های مختلف && را زیر مشاهده می کند:

<text>
true && true => true
true && false => false
false && true => false
false && false => false
<text>

2. عملگر ||: این عملگر یا OR در صورتی مقدار True بر می گرداند که یکی از عملوندها نتیجه true داشته باشد:

<c#>
var result = num1 > 10 || num2 > 20; // will give true
<c#>

دقت کنید که num1 بزرگتر از 10 می باشد، پس نتیجه true است، اما num2 بزرگتر از 20 نیست، پست نتیجه این false است، در نتیجه true || false مقدار true بر می گرداند. حالت های مختلف || را زیر مشاهده می کند:

<text>
true || true => true
true || false => true
false || true => true
false || false => false
<text>

3. عملگر !: این عملگر یا NOT، نتیجه یک عبارت Boolean را برعکس می کند، یعنی اگر یک عبارت نتیجه true برگرداند، این عملگر نتیجه را به false تبدیل می کند:

<c#>
var r1 = !(num1 > 10); // will give false
var r2 = !(num2 > 20); // will give true
<c#>

!! عملگرهای بیتی
این عملگرها، بر روی بیت ها اعمال می شوند. یعنی عملیات مربوط به عملگر به صورت بیت به بیت انجام می شود. در سیستم باینری، عبارات به صورت اعداد 0 و 1 نمایش داده می شوند. به هر یک از این اعداد یک بیت گفته می شود. دو عدد 2 و 6 را فرض کنید، عدد 2 معادل بانتری 010 و عدد 6 معادل باینری 110 می باشد. بر اساس بیت های معادل، یک نتیجه معادل خواهند داشت. در ادامه به بررسی انواع عملگرهای بیتی خواهیم پرداخت:

1. عملگر &: در قسمت عملگرهای رابطه ای در مورد عملگر && صحبت کردیم و گفتیم در صورتی که هر دو طرف عملگر true باشند، خروجی true خواهد بود. حال، برای عملگر & در صورتی که هر دو بیت 1 باشند، خروجی 1 خواهد بود. در غیر اینصورت خروجی 0 خواهد شد. نام این عملگر AND می باشد. مثال را مبتنی بر معادل باینری اعداد 2 و 6 که در بالا در مورد آنها صحبت کردیم، بررسی خواهیم کرد:

<text>
2 = 0 1 0
6 = 1 1 0
& = 0 1 0
<text>

همانطور که مشاهده می کنید، تنها بیت وسط یا دوم که هر دو بیت 1 هستند، 1 شده و در نتیجه خروجی ما، عدد 2 خواهد بود. کد سی شارپ:

<c#>
int num1 = 2;
int num2 = 6;
int result = num1 & num2; // will give 2
<c#>

2. عملگر |: نام دیگر این عملگر OR می باشد و خروجی آن، در صورتی که یکی از بیت ها معادل 1 باشد، 1 خواهد بود، در غیر اینصورت بیت نتیجه 0 خواهد شد:

<text>
2 = 0 1 0
6 = 1 1 0
| = 1 1 0
<text>

همانطور که مشاهده می کنید، نتیجه OR بیت های سوم و دوم که1 هستند، 1 شده و در نتیجه خروجی ما، عدد 6 خواهد بود. کد سی شارپ:

<c#>
int num1 = 2;
int num2 = 6;
int result = num1 | num2; // will give 6
<c#>

3. عملگر ^: نام دیگر این عملگر XOR می باشد و بیت خروجی در صورتی 1 خواهد بود که بیت های معادل با یکدیگر تفاوت داشته باشند:

<text>
2 = 0 1 0
6 = 1 1 0
^ = 1 0 0
<text>

کد سی شارپ:

<c#>
int num1 = 2;
int num2 = 6;
int result = num1 ^ num2; // will give 4
<c#>

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

# عملگر ~: کار مکمل یک در سیستم باینری را انجام می دهد.
# عملگر >>: عملیات شیفت به چپ را انجام می دهد.
# عملگر <<: عملیات شیفت به راست را انجام می دهد.

!! عملگرهای انتساب
در قسمت تعریف متغیرها، اشاره کردیم که با تعریف یک متغیر، می توان مقداری را داخل آن ذخیره کرد:

<c#>
var num = 12;
<c#>

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

1. عملگر =: عملیات انتساب ساده را انجام می دهد. یعنی مقدار سمت راست را داخل عملوند سمت چپی قرار می دهد که نمونه آن را در مثال بالا دیدیم.

2. عملگر =+: این عملگر، مقدار سمت را به مقدار موجود عملوند سمت چپ اضافه کرده و نتیجه را داخل عملوند سمت چپ میریزد:

<c#>
var num = 12;
num += 3; // will give 15 => num = num + 3
<c#>

*3. عملگر =-*: این عملگر، مقدار سمت را از مقدار موجود عملوند سمت چپ کم کرده و نتیجه را داخل عملوند سمت چپ میریزد:

<c#>
var num = 12;
num -= 3; // will give 9 => num = num - 3
<c#>

4. عملگر =**: این عملگر، مقدار سمت را در مقدار موجود عملوند سمت چپ ضرب کرده و نتیجه را داخل عملوند سمت چپ میریزد:

<c#>
var num = 12;
num *= 2; // will give 24 => num = num * 2
<c#>

*5. عملگر =//*: این عملگر، مقدار سمت را از مقدار موجود عملوند سمت چپ تقسیم کرده و نتیجه را داخل عملوند سمت چپ میریزد:

<c#>
var num = 12;
num /= 2; // will give 6 => num = num / 2
<c#>

6. عملگر =%: این عملگر، باقیمانده تقسیم عملوند سمت چپ بر مقدار سمت راست را در عملوند سمت چپ میریزد:

<c#>
var num = 9;
num %= 2 ==> will give 1 => num = num % 2;
<c#>

سایر عملگرهای انتسابی به شرح زیر می باشند:

# عملگر =>>: شیفت به چپ و انتساب
# عملگر =<<: شیفت به راست و انتساب
# عملگر =&: انجام عملیات AND بیتی و انتساب
# عملگر =|: انجام عملیات OR بیتی و انتساب
# عملگر =^: انجام عملیات XOR بیتی و انتساب

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

<c#>
var result = 2 + 2 * 0;
<c#>

جوب شما به نتیجه عبارت بالا چیست؟ شاید 0، شایدم 2! اما نتیجه صحیح کدام است؟ عدد 2 نتیجه عبارت بالا می باشد. زیر حق تقدم عملیات ضرب بالاتر از عملیات جمع است، پس ابتدا عملیات ضرب انجام شده و نتیجه با عدد دو جمع می شود. اما فرض کنید عبارت بالا را به صورت زیر تغییر دادیم:

<c#>
var result = (2 + 2) * 0;
<c#>

با تغییر بالا، نتیجه عبارت 0 خواهد بود. زیرا حق تقدم عبارت داخل پرانتز، بیشتر از ضرب می باشد، پس ابتدا عدد 2 با عدد 2 جمع شده و سپس نتیجه در 0 ضرب می شود.

در زیر حق تقدم ها را مشاهده می کنید. حق تقدم ها از درجه زیاد به کم نوشته شده اند. همچنین توجه کنید در هر سطر حق تقدم ها از چپ به راست می باشند:

<text>
() , []
! , ~ , ++ , --
* , / , %
+ , -
<< , >>
< , <= , > , >=
== , !=
& , ^ , | , && , ||
<text>

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

نویسنده : حسین احمدی
منبع : |جزیره برنامه نویسی وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است
را زیر مشاهده می کند:
true || true => true
true || false => true
false || true => true
false || false => false

3. عملگر !: این عملگر یا NOT، نتیجه یک عبارت Boolean را برعکس می کند، یعنی اگر یک عبارت نتیجه true برگرداند، این عملگر نتیجه را به false تبدیل می کند:

var r1 = !(num1 > 10); // will give false
var r2 = !(num2 > 20); // will give true

عملگرهای بیتی

این عملگرها، بر روی بیت ها اعمال می شوند. یعنی عملیات مربوط به عملگر به صورت بیت به بیت انجام می شود. در سیستم باینری، عبارات به صورت اعداد 0 و 1 نمایش داده می شوند. به هر یک از این اعداد یک بیت گفته می شود. دو عدد 2 و 6 را فرض کنید، عدد 2 معادل بانتری 010 و عدد 6 معادل باینری 110 می باشد. بر اساس بیت های معادل، یک نتیجه معادل خواهند داشت. در ادامه به بررسی انواع عملگرهای بیتی خواهیم پرداخت. برای آشنایی با عملگرهای بیتی مطلب زیر را مطالعه کنید:

آموزش برنامه نویسی به زبان ساده و کاربردی

1. عملگر &: در قسمت عملگرهای رابطه ای در مورد عملگر && صحبت کردیم و گفتیم در صورتی که هر دو طرف عملگر true باشند، خروجی true خواهد بود. حال، برای عملگر & در صورتی که هر دو بیت 1 باشند، خروجی 1 خواهد بود. در غیر اینصورت خروجی 0 خواهد شد. نام این عملگر AND می باشد. مثال را مبتنی بر معادل باینری اعداد 2 و 6 که در بالا در مورد آنها صحبت کردیم، بررسی خواهیم کرد:

2 = 0 1 0
6 = 1 1 0
& = 0 1 0

همانطور که مشاهده می کنید، تنها بیت وسط یا دوم که هر دو بیت 1 هستند، 1 شده و در نتیجه خروجی ما، عدد 2 خواهد بود. کد سی شارپ:

int num1 = 2;
int num2 = 6;
int result = num1 & num2; // will give 2

2. عملگر |: نام دیگر این عملگر OR می باشد و خروجی آن، در صورتی که یکی از بیت ها معادل 1 باشد، 1 خواهد بود، در غیر اینصورت بیت نتیجه 0 خواهد شد:

2 = 0 1 0
6 = 1 1 0
| = 1 1 0

همانطور که مشاهده می کنید، نتیجه OR بیت های سوم و دوم که1 هستند، 1 شده و در نتیجه خروجی ما، عدد 6 خواهد بود. کد سی شارپ:

int num1 = 2;
int num2 = 6;
int result = num1 | num2; // will give 6

3. عملگر ^: نام دیگر این عملگر XOR می باشد و بیت خروجی در صورتی 1 خواهد بود که بیت های معادل با یکدیگر تفاوت داشته باشند:

2 = 0 1 0
6 = 1 1 0
^ = 1 0 0

کد سی شارپ:

int num1 = 2;
int num2 = 6;
int result = num1 ^ num2; // will give 4

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

  1. عملگر ~: کار مکمل یک در سیستم باینری را انجام می دهد.
  2. عملگر >>: عملیات شیفت به چپ را انجام می دهد.
  3. عملگر <<: عملیات شیفت به راست را انجام می دهد.

عملگرهای انتساب

در قسمت تعریف متغیرها، اشاره کردیم که با تعریف یک متغیر، می توان مقداری را داخل آن ذخیره کرد:

var num = 12;

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

1. عملگر =: عملیات انتساب ساده را انجام می دهد. یعنی مقدار سمت راست را داخل عملوند سمت چپی قرار می دهد که نمونه آن را در مثال بالا دیدیم.

2. عملگر =+: این عملگر، مقدار سمت را به مقدار موجود عملوند سمت چپ اضافه کرده و نتیجه را داخل عملوند سمت چپ میریزد:

var num = 12;
num += 3; // will give 15 => num = num + 3

3. عملگر =-: این عملگر، مقدار سمت را از مقدار موجود عملوند سمت چپ کم کرده و نتیجه را داخل عملوند سمت چپ میریزد:

var num = 12;
num -= 3; // will give 9 => num = num - 3

4. عملگر =**: این عملگر، مقدار سمت را در مقدار موجود عملوند سمت چپ ضرب کرده و نتیجه را داخل عملوند سمت چپ میریزد:

var num = 12;
num *= 2; // will give 24 => num = num * 2

5. عملگر =//: این عملگر، مقدار سمت را از مقدار موجود عملوند سمت چپ تقسیم کرده و نتیجه را داخل عملوند سمت چپ میریزد:

var num = 12;
num /= 2; // will give 6 => num = num / 2

6. عملگر =%: این عملگر، باقیمانده تقسیم عملوند سمت چپ بر مقدار سمت راست را در عملوند سمت چپ میریزد:

var num = 9;
num %= 2 ==> will give 1 => num = num % 2;

سایر عملگرهای انتسابی به شرح زیر می باشند:

  1. عملگر =>>: شیفت به چپ و انتساب
  2. عملگر =<<: شیفت به راست و انتساب
  3. عملگر =&: انجام عملیات AND بیتی و انتساب
  4. عملگر =|: انجام عملیات OR بیتی و انتساب
  5. عملگر =^: انجام عملیات XOR بیتی و انتساب

حق تقدم عملگرها

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

var result = 2 + 2 * 0;

جوب شما به نتیجه عبارت بالا چیست؟ شاید 0، شایدم 2! اما نتیجه صحیح کدام است؟ عدد 2 نتیجه عبارت بالا می باشد. زیر حق تقدم عملیات ضرب بالاتر از عملیات جمع است، پس ابتدا عملیات ضرب انجام شده و نتیجه با عدد دو جمع می شود. اما فرض کنید عبارت بالا را به صورت زیر تغییر دادیم:

var result = (2 + 2) * 0;

با تغییر بالا، نتیجه عبارت 0 خواهد بود. زیرا حق تقدم عبارت داخل پرانتز، بیشتر از ضرب می باشد، پس ابتدا عدد 2 با عدد 2 جمع شده و سپس نتیجه در 0 ضرب می شود. در زیر حق تقدم ها را مشاهده می کنید. حق تقدم ها از درجه زیاد به کم نوشته شده اند. همچنین توجه کنید در هر سطر حق تقدم ها از چپ به راست می باشند:

() , []
! , ~ , ++ , --
* , / , %
+ , -
<< , >>
< , <= , > , >=
== , !=
& , ^ , | , && , ||

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

دستور if

در ادامه مباحث مقدماتی سری آموزشی، قصد داریم با دستورات کنترلی، شرط ها و حلقه ها آشنا شویم. به دلیل حجم زیاد مطالب، قسمت هشتم به چهار بخش زیر تقسیم خواهد شد:

  1. بخش اول: آشنایی با دستور if
  2. بخش دوم: آشنایی با دستور switch
  3. بخش سوم: آشنایی با دستور for
  4. بخش چهارم: آشنایی با حلقه های while و do - while

مقدمه ای بر دستورات کنترلی

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

برای این کار باید از شرط ها و دستورات کنترلی استفاده کنیم. در قسمت بررسی متغیرها و انواع داده، نوع داده Boolean را بررسی کردیم که بر اساس یک شرط مقدار True یا False را برمی گرداند. (True به معنی صحیح و False به معنی غلط می باشد). ما در دستورات کنترلی نیز از شرط ها استفاده میکنیم. در بخش اول از قسمت هشتم سری آموزشی زبا سی شارپ با دستور if آشنا می شویم.

دستور if

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

if(condition)
{
    // statements
}

در قالب دستوری بالا، در قسمت condition شرط مورد نظر خود را می نویسیم. در قسمت statements هم دستوراتی که در صورت درست بودن شرط اجرا خواهند شد را می نویسیم. برای مثال فرض کنید متغیری داریم با نام A که عدد داخل آن 18 می باشد. حالا می خواهیم در صورتی که مقدار A برابر 20 بود پیغامی را به کاربر نمایش دهد:

if(A == 20)
{
    Console.WriteLine("Your Message!");
}

دقت کنید، بدنه دستور if با { و } (به این علامت ها Brace نیز گفته می شود) مشخص می شود. به این بدنه Scope یا فضای دستور if نیز گفته می شود. در صورتی که تعداد دستورات بدنه if تنها یک دستور بود، می توان از نوشتن Brace ها صرفنظر کرد:

if(A == 20)
    Console.WriteLine("Your Message!");

*نکته: در صورتی که Brace ها نوشته نشوند، امکان تعریف متغیر در دستور داخل if وجود ندارد و برای تعریف متغیر باید حتماً Brace ها نوشته شوند:

// invalid
if(A == 20)
    string myVar = "Test";

// valid
if(A == 20)
{
    string myVar = "Test";
}

دستور if else

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

if(condition)
{
    // if body
}
else
{
    // else body
}

قسمت اول که همان بخش if است که در قسمت قبلی با آن آشنا شدیم. کدی که در قسمت else می نویسیم در صورت برقرار نبودن شرط اجرا خواهد شد. در مثال قبلی گفتیم اگر مقدار A از 20 بزرگتر بود یک پیام در خروجی چاپ شود. حال می خواهیم در صورتی که شرط برقرار نبود پیام دیگری برای کاربر چاپ شود:

if(A == 20)
{
    Console.WriteLine("Your Message!");
}
else
{
    Console.WriteLine("Another Message!");
}

بر بخش else نیز می توان در وجود تنها یک دستور، از نوشتن Brace ها صرفنظر کرد.

مثال عملی 1

در این مثال قصد داریم برنامه ای بنویسیم که از کاربر یک کلمه عبور و یک نام کاربری را دریافت کرده و در صورت صحیح بودن اطلاعات وارد شده، پیغام مناسبی را به کاربر نمایش دهد. در صورت صحیح نبودن نام کاربری و کلمه عبور نیز پیغام دیگری نمایش داده خواهد شد. پروژه جدیدی از نوع Console Application با نام CSharp-Course08-01 ایجاد کنید. گفتیم کدهای ما باید داخل متد Main نوشته شود.

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

string username;
string password;

2. بعد از تعریف متغیرها، باید از کاربر نام کاربری و کلمه عبور را بگیریم. برای اینکار از متد Console.ReadLine استفاده می کنیم. با این دستور، برنامه منتظر ورود یک مقدار از کاربر شده و بعد از زدن کلید Enter، ورودی را برای ما بر میگرداند. خروجی این دستور از نوع string یا رشته می باشد.

اما قبل از دریافت ورودی، باید یک پیام مناسب برای گرفتن اطلاعات از کاربر به او نمایش دهیم. برای نمایش اطلاعات از متد Console.Write استفاده می کنیم. در Console، ما دو دستور برای نمایش خروجی داریم، یکی Write و دیگری WriteLine. دستور اول تنها یک پیام را به کاربر نمایش می دهد، اما دستور دوم بعد از نمایش پیام، مکان نما یا Cursor را به خط بعد منتقل می کند. دستورات زیر را در ادامه دستورات قبلی می نویسیم:

Console.Write("Enter username:");
username = Console.ReadLine();
Console.Write("Enter password:");
password = Console.ReadLine();

به خط های دوم و چهارم دقت کنید، ما با Console.ReadLine مقدار را از کاربر دریافت کرده و مستقیماً داخل متغیرهای مربوطه ذخیره می کنیم.

3. در ادامه باید نام کاربری و کلمه عبور بررسی شوند و بر اساس اطلاعات وارد شده، پیغام مناسب به کاربر نمایش داده شود. برای انکار از دستور if استفاده می کنیم:

if(username == "IT" && password == "Pro")
{
    Console.WriteLine("Welcome to ITPro world!");
}
else
{
    Console.WriteLine("Oops! username or passord is invalid!");
}

به شرط داخل if دقت کنید، ما اینجا از عملگر && یا AND استفاده کردیم، به این خاطر که هم نام کاربری و هم کلمه عبور باید برابر با مقدارهای مد نظر ما باشند. برای مثال اگر از || یا OR استفاده می کردیم، کاربر با درست وارد کردن یکی از مقادیر نام کاربری یا کلمه عبور امکان دسترسی به سیستم را داشت، اما با && باید هر دو را صحیح وارد کند.

4. در انتها متد Console.ReadKey را می نویسیم تا برنامه قبل از خارج شدن، منتظر دریافت کلیدی از کاربر شود. در حال حاضر دستورات متد Main به شکل زیر خواهند بود:

string username;
string password;
Console.Write("Enter username:");
username = Console.ReadLine();
Console.Write("Enter password:");
password = Console.ReadLine();
if (username == "IT" && password == "Pro")
{
    Console.WriteLine("Welcome to ITPro world!");
}
else
{
    Console.WriteLine("Oops! username or passord is invalid!");
}
Console.ReadKey();

با زدن کلید F5 برنامه را اجرا کرده و خروجی را مشاهده می کنیم.

دستور if - else if

بوسیله دستور else if ما قابلیت تعیین چند شرط متوالی را خواهیم داشت. اگر بخواهیم این دستور را به زبان عامیانه ترجمه کنیم میگوییم:

  1. اگر شرط 1 برقرار بود => دستورات اول
  2. در غیر اینصورت اگر شرط 2 برقرار بود => دستورات دوم
  3. در غیر اینصورت اگر شرط n برفرار بود => دستورات n ام
  4. در غیر این صورت => سایر دستورات

ساختار کلی این دستور به صورت زیر است:

if(condition1)
{
    // if body
}
else if(condition2)
{
    // if body
}
else if(conditionN)
{
    // if body
}
else
{
    // if body
}

توجه کنید که تنها یکی از قسمت های دستور if اجرا خواهد شد، یعنی اگر یکی از condition ها برقرار شود، سایر قسمت بررسی نمی شود.

مثال عملی 2

در این مثال عملی، قصد داریم تا یک برنامه ماشین حساب ساده بنویسیم. این برنامه ساده، از کاربر 2 عدد و یک عملگر را دریافت کرده و بر اساس عملگر وارد شده، محاسبه را انجام داده و به کاربر خروجی را نمایش می دهد. برای اینکار یک پروژه از نوع Console با نام CSharp-Course08-02 ایجاد کنید.

1. در ابتدا باید از کاربر سه مقدار را دریافت می کنیم. دو عدد و یک عملگر. برای اینکار نیاز به سه متغیر داریم. دو متغیر اول از نوع int که عددها را داخل آن ذخیره می کنیم و متغیر نوع سوم از نوع string که عملگر را داخل آن ذخیره می کنیم:

int firstNumber;
int secondNumber;
string @operator;

*به متغیر سوم دقت کنید، در ابتدای نام آن از علامت @ استفاده کرده ایم! دلیل اینکار، موجود بودن نام operator در لیست کلمات کلیدی زبان سی شارپ است. اگر شما قصد دارید متغییری تعریف کنید که نام آن در لیست کلمات کلیدی سی شارپ وجود دارد ابتدای نام آن باید از علامت @ استفاده کنید. کلمات کلیدی مانند int یا long یا if و ...

2. بعد از تعریف متغیرها، باید ورودی ها را از کاربر دریافت کنیم. نکته ای که باید در اینجا به آن توجه کرد، دو متغیر اول ما هستند. این متغیرها از نوع int تعریف شدند، در صورتی که متد Console.ReadLine مقداری از نوع رشته به ما بر میگرداند. در اینجا ما باید رشته را به عدد تبدیل کنیم. برای این تبدیل می توایم از متد int.Parse استفاده کیم. این متد یک ورودی از نوع رشته گرفته و آن را تبدیل به عدد می کند. مثال:

int num1 = int.Parse("12");

متد Parse برای سایر نوع های عددی نیز وجود دارید:

long longNumber = long.Parse("32223545212");
decimal decimalNumber = decimal.Parse("223.12");

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

Console.Write("Enter first number: ");
firstNumber = int.Parse(Console.ReadLine());
Console.Write("Enter second number: ");
secondNumber = int.Parse(Console.ReadLine());
Console.Write("Enter math operator (+,-,*,/): ");
@operator = Console.ReadLine();

دقت کنید که هنگام استفاده از متغیر operator نیز باید از علامت @ استفاده کرد.به خط دوم دقت کنید. ترتیب اجرای دستورات، ابتدا دستورات سمت چپ اجرا شده و سپس عملیات انتساب انجام می شود.

در قسمت سمت چپ نیز، ابتدا دستور ReadLine اجرا شده، سپس خروجی ReadLine به متد Parse ارسال می شود، متد Parse عملیات تبدیل را انجام داده و عددی را بر می گرداند و سپس این عدد داخل متغیر firstNumber ذخیره می شود.

3. در مرحله بعد، می خواهیم قبل از نمایش خروجی پیغامی مناسب برای کاربر نمایش داده شود. برای مثال "2 + 2 = 4"، دستور زیر را در ادامه وارد کنید:

Console.Write("Result for " + firstNumber + " " + @operator + " " + secondNumber + " = ");

حالا، باید با دستورات if، شرط های مختلف را بررسی کنیم. بوسیله ساختار if، بر اساس عملگر وارد شده، محاسبه را انجام داده و نتیجه را در خروجی نمایش می دهیم:

if (@operator == "+")
{
    Console.WriteLine(firstNumber + secondNumber);
}
else if (@operator == "-")
{
    Console.WriteLine(firstNumber - secondNumber);
}
else if (@operator == "*")
{
    Console.WriteLine(firstNumber*secondNumber);
}
else if (@operator == "/")
{
    Console.WriteLine(firstNumber/secondNumber);
}
else
{
    Console.WriteLine("Invalid operator!");
}

به else انتهایی دقت کنید، این else در صورتی اجرا خواهد شد که عملگر وارد شده، هیچ از یک مقادیر جمع، تفریق، ضرب یا تقسیم نباشد که پیغام عملگر اشتباه را به کاربر نمایش می دهد. کد نهایی ما باید به صورت زیر باشد:

int firstNumber;
int secondNumber;
string @operator;
Console.Write("Enter first number: ");
firstNumber = int.Parse(Console.ReadLine());
Console.Write("Enter second number: ");
secondNumber = int.Parse(Console.ReadLine());
Console.Write("Enter math operator (+,-,*,/): ");
@operator = Console.ReadLine();

Console.Write("Result for " + firstNumber + " " + @operator + " " + secondNumber + " = ");
if (@operator == "+")
{
    Console.WriteLine(firstNumber + secondNumber);
}
else if (@operator == "-")
{
    Console.WriteLine(firstNumber - secondNumber);
}
else if (@operator == "*")
{
    Console.WriteLine(firstNumber*secondNumber);
}
else if (@operator == "/")
{
    Console.WriteLine(firstNumber/secondNumber);
}
else
{
    Console.WriteLine("Invalid operator!");
}
Console.ReadKey();

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


نمونه اجرای برنامه

تا اینجا، با ساختار دستور if و کاربردهای آن آشنا شدیم، در بخش بعدی با ساختار دستور switch آشنا خواهیم شد.

دستور switch

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

var name = Console.ReadLine();
if(name == "Hossein")
{
    Console.WriteLine("Hello Hossein!");
}
else if(name == "ITPro")
{
    Console.WriteLine("Welcome to ITPro.IR");
}
else if(name == "Information Technology")
{
    Console.WriteLine("Just ITPro.ir");
}

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

switch({variable})
{
    case {value1}:
        statements
        break;
    case {value2}:
        statements
        break
        .
        .
        .
    case {value-n}:
        statements
        break;
    default:
        statements
        break;
}

بخش بالا، ساختار کلی دستور switch را نشان می دهد. در ادامه به بررسی بخش های مختلف دستور بالا خواهیم پرداخت:

  1. ساختار switch با دستور switch شروع شده و مقابل آن در داخل پردانتز نام متغیری که قصد داریم مقادیر آن را چک کنیم قرار می گیرد. یعنی به جای {variable} نام متغیر مورد نظر را می نویسیم.
  2. دستورات مخصوص عبارت switch بین علامت های brace باز و بسته قرار میگیرند.
  3. بوسیله دستور case به ترتیب شرایط مختلف را مشخص می کنیم. به جای {value} در مقابل دستور case مقدار مورد نظر را می نویسیم.
  4. بعد از نوشتن دستور مربوط به هر case باید انتهای case را با دستور break مشخص کنیم. در غیر اینصورت با پیغام خطا مواجه خواهیم شد.
  5. در بخش default، دستوراتی که در صورت برقرار نبودن هیچ کدام از شرط های case باید اجرا شود را می نویسیم. نوشتن بخش default دلخواه است و می توانیم از نوشتن آن صرفنظر کنیم.

در ادامه، دستور if که در ابتدای این مقاله نوشتیم را به دستور switch تبدیل می کنیم. همانطور که مشاهده میکنید، در تمامی شرط های if از متغیر name استفاده شده است. پس ما می توانیم دستور if را به دستور switch تبدیل کنیم. به مثال زیر دقت کنید:

var name = Console.ReadLine();

switch (name)
{
    case "Hossein":
        Console.WriteLine("Hello Hossein!");
        break;
    case "ITPro":
        Console.WriteLine("Welcome to ITPro.ir");
        break;
    case "Information Technology":
        Console.WriteLine("Just ITPro.ir");
        break;
}

دستورات بالا، دقیقاً معادل عبارت if ابتدای آموزش هستند. اما بخش default! فرض کنید دستورات if به صورت زیر بودند:

if(name == "Hossein")
{
    Console.WriteLine("Hello Hossein!");
}
else if(name == "ITPro")
{
    Console.WriteLine("Welcome to ITPro.IR");
}
else if(name == "Information Technology")
{
    Console.WriteLine("Just ITPro.ir");
}
else
{
    Console.WriteLine("Input is not valid!");
}

قسمت else آخر، دقیقاً کار default را برای ما انجام می دهد:

switch (name)
{
    case "Hossein":
        Console.WriteLine("Hello Hossein!");
        break;
    case "ITPro":
        Console.WriteLine("Welcome to ITPro.ir");
        break;
    case "Information Technology":
        Console.WriteLine("Just ITPro.ir");
        break;
    default:
        Console.WriteLine("Input is not valid!");
        break;
}

زمانی که ما تصمیم داریم از دستور switch استفاده کنیم، می توانیم برای یک بدنه case چند مقدار مختلف را مشخص کنیم. برای مثال، دستور if زیر را در نظر بگیرید:

if(name == "ITPro" || name == "www.tosinso.com" || name == "tosinso.com")
{
    Console.WriteLine("Welcome to ITPro.IR");
}

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

switch(name)
{
    case "ITPro":
    case "www.tosinso.com":
    case "tosinso.com":
        Console.WriteLine("Welcome to ITPro.IR");
        break;
}

همانطور که مشاهده می کنید، چند دستور case پشت سر هم نوشته شده است، به این معنا که در صورت برابر بودن مقدار name با هریک از مقادیر دستور case، وارد بخش مربوطه شود.

  • نکته: زمانی که داخل قسمت case، از دستور return استفاده می کنیم، نیازی به نوشتن دستور break نیست:
switch(name)
{
    case "ITPro":
    case "www.tosinso.com":
    case "tosinso.com":
        return "Welcome to ITPro.IR";
}
  • نکته: زمانی که قصد تعریف یک متغیر داخل قسمت case را داریم و همان متغیر در case دیگری، در همان دستور switch نیز تعریف می شود، باید بدنه case را با علامت های brace باز و بسته مشخص کنیم:
switch(name)
{
    case "Value1":
    {
        var number = 12;
        break;
    }
    case "Value2":
    {
        var number = 34;
        break;
    }
}

در این قسمت یا ساختار کلی دستور switch آشنا شدیم و با دو بخش اول قسمت هشتم، دستورات کنترلی if و switch را بررسی کردیم. در بخش های بعدی به بررسی حلقه ها و دستور if خواهیم پرداخت.

حلقه ها (دستور for)

در دو بخش قبلی به بررسی دستوران کنترلی پرداختیم. در بخش سوم از قسمت هشتم سری آموزشی، به بررسی حلقه ها و دستور for خواهیم پرداخت.اما حلقه ها چه کاربردهایی دارند؟ خیلی از اوقات، نیاز داریم قطعه ای از کد چندین بار تکرار شود. برای مثال، فرض کنید میخواهیم اعداد 1 تا 100 را چاپ کنیم. راه حل چیست؟ صد بار پشت سر هم دستور Console.WriteLine را بنویسیم؟؟؟!!! صد در صد اینطور نیست. در اینجور مواقع باید از حلقه ها استفاده کنیم.

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

for({init};{condition};{increment})
{
    // loop body
}

خوب، بهتره که به کاربرد و مفهوم هر یک از بخش های دستور بالا بپردازیم:

  1. init: در این بخش باید متغیری که شمارنده بر اساس آن عمل خواهد کرد را تعریف کنیم. هر حلقه for نیاز به یک متغیر شمارنده دارد که در هر تکرار، مقدار آن یک واحد اضافه می شود. این متغیر در بخش init تعریف می شود. این متغیر باید مقدار اولیه نیز داشته باشد.
  2. condition: بعد از تعریف متغیر شمارنده، باید شرطی برای اتمام حلقه مشخص کنیم، برای مثال، می خواهیم شرط ما 10 بار تکرار شود. در این قسمت تعیین می کنیم که حلقه ما در چه حالتی به اتمام می رسد. این قسمت باید مقدار بازگشتی از نوع bool داشته باشد.
  3. increment: در این بخش مقداری که با هر بار تکرار به شمارنده ما اضافه می شود یا کم می شود را مشخص می کنیم.
  4. loop body: بدنه حلقه for یا دستوراتی که می خواهیم با هر بار تکرار حلقه for اجرا شوند را در این قسمت می نویسیم. دقت کنید که بدنه حلقه for با Brace باز و بسته مشخص می شود. در اینجا مانند دستور if، در صورتی که تعداد دستورات حلقه for تنها یک دستور بود می توان از نوشتن Brace ها خودداری کرد.

در ادامه با یک مثال ساده، با کاربرد واقعی دستور for آشنا می شویم. فرض کنید تصمیم داریم اعداد یک تا 10 را در خروجی چاپ کنیم. برای اینکار کافیست یک حلقه for تعریف کرده و داخل آن مقدار مورد نظر را در خروجی چاپ کنیم:

for(int counter = 1; counter <= 10; counter++)
    Console.WriteLine(counter);

همانطور که مشاهده می کنید، داخل دستور if سه بخش داریم که با علامت ; از هم جدا شده اند. در قسمت اول متغیری به نام counter تعریف کرده و مقدار پیش فرض 1 را به آن اختصاص دادیم. در قسمت دوم شرط for را نوشتیم که حلقه تا زمانی اجرا شود که مقدار counter کوچکتر یا مساوی عدد 10 می باشد.

در انتها هم گفتیم که با هر بار تکرار، یک واحد به متغیر counter اضافه شود. در داخل بدنه for نیز با دستور WriteLine مقدار متغیر counter را که با هر بار تکرار یک واحد به آن اضافه می شود را در خروجی چاپ می کنیم.در مثال دوم تصمیم داریم اعداد 10 تا 1 را به صورت معکوس چاپ کنیم:

for(int counter = 10; counter >= 1; counter--)
    Console.WriteLine(counter);

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

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

for(int counter = 1; counter <= 100; counter++)
{
    if(counter % 2 == 0)
        Console.WriteLine(counter);
}

در قسمت های قبلی در مورد عملگر % گفتیم که باقی مانده تقسیم دو عدد را برای ما بر میگرداند.در روش بعدی، می توانیم حلقه را جوری بنویسیم که مقدار counter در هر بار تکرار 2 واحد اضافه شود:

for(int counter = 2; counter <= 100; counter = counter + 2)
    Console.WriteLine(counter);

کد بالا نیز کلیه اعداد زوج بین 1 تا 100 را برای ما در خروجی نمایش خواهد داد. در هنگام استفاده از حلقه for ما می توانیم عملیات تعریف متغیر شمارنده را خارج از حلقه و قبل از شروع آن تعریف کنیم:

var counter = 1;
for(; counter <= 10; counter++)
    Console.WriteLine(counter);

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

حلقه های تو در تو (Nested Loops)

زمانی که ما چند حلقه for را داخل هم بنویسیم، به این حلقه ها، حلقه های تو در تو گفته می شود. برای مثال، فرض کنید که قصد داریم جدول ضرب 9 در 9 را در خروجی چاپ کنیم. برای اینکار ما نیاز به حلقه های تو در تو خواهیم داشت. نمونه کد زیر یک جدول ضرب 9 در 9 را برای ما در خروجی چاپ می کند:

for (int i = 1; i <= 9; i++)
{
    for (int j = 1; j <= 9; j++)
    {
        Console.Write((i*j) + "\t");
    }
    Console.WriteLine();
}

حلقه اول، 9 بار، و با هر بار اجرای حلقه اول، حلقه دوم 9 بار اجرا خواهد شد و خروجی ضرب متغیرهای i و j در خروجی چاپ خواهد شد.

دستور break

بوسیله دستور break می توانیم در شرایطی که مد نظر داریم از حلقه خارج شویم. برای مثال، در حلقه زیر، زمانی که شمارنده به عدد 50 برسد، حلقه for متوقف شده و از حلقه خارج می شویم:

for(int counter = 2; counter <= 100; counter++)
{
    if(counter == 50)
        break;
    Console.WriteLine(counter);
}
Console.WriteLine("End of program!");

دستور continue

به کمک این دستور می توانیم روند اجرای حلقه را متوقف کرده و به ابتدای حلقه برگردیم. فقط به این نکته توجه داشته باشید که این دستور باعث reset شدن حلقه نمی شود و حلقه، تکرار بعدی را اجرا می کند. برای مثال، اگر ما در تکرار 50 امین تکرار، دستور continue را اجرا کنیم، 51 امین تکرار اجرا خواهد شد و روند اجرا به ابتدای حلقه باز خواهد گشت. برای مثال، برنامه ای که اعداد زوج بین 1 تا 100 را در خروجی چاپ می کرد را به صورت زیر نیز می توانیم بنویسیم:

for(int counter = 1; counter <= 100; counter++)
{
    if(counter % 2 != 0)
        continue;
    Console.WriteLine(counter);
}

در کد بالا گفتیم که اگر باقیمانده تقسیم متغیر شمارنده بر عدد 2، مخالف صفر بود، تکرار بعدی اجرا شود، در غیر اینصورت دستور WriteLine اجرا خواهد شد.

چند مثال دیگر از دستور for

1. دریافت دو عدد از کاربر و محاسبه عدد اول به توان عدد دوم و چاپ آن در خروجی:

Console.Write("Enter first number: ");
var firstNumber = int.Parse(Console.ReadLine());
Console.Write("Enter second number: ");
var secondNumber = int.Parse(Console.ReadLine());

var pow = 1;
for (var counter = 1; counter <= secondNumber; counter++)
{
    pow = pow*firstNumber;
}

Console.WriteLine(firstNumber + " ^ " + secondNumber + " = " + pow);
Console.ReadKey();

در کد بالا، ابتدا دو عدد را از کاربر دریافت کرده و عدد های وارد شده را به عدد تبدیل می کنیم و در دو متغیر firstNumber و secondNumber ذخیره می کنیم. سپس برای خروجی متغیری با نام pow تعریف می کنیم و مقدار اولیه آن را برابر 1 قرار می دهیم.دلیل اینکه مقدار آن را یک قرار دادیم، دستور داخل حلقه for می باشد،

در صورتی که مقدار اولیه را صفر قرار می دادیم، نتیجه ضرب عدد اول در صفر، صفر می شد و نهایتاً خروجی ما عددی جز عدد صفر نخواهد بود. سپس حلقه ای تشکیل داده که به تعداد عدد دوم تکرار می شود و در داخل بدنه عدد اول را در pow ضرب کرده و نتیجه را در pow ذخیره می کنیم. پس از تمام حلقه، در خروجی با پیغام مناسب مقدار pow را چاپ می کنیم.

2. محاسبه میانگین جمع اعداد 1 تا 100:

var sum = 0;
for (int counter = 1; counter <= 100; counter++)
{
    sum = sum + counter;
}

Console.WriteLine("Average: " + (sum/100));

در این بخش با دستور if و کاربرد آن آشنا شدیم. در قسمت بعدی به بررسی حلقه های while و do-while خواهیم پرداخت تا مبحث دستورات کنترلی و حلقه ها به پایان برسد.

حلقه ها (دستور while و do-while)

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

while({condition})
{
    // loop syntaxes
}

برای دستور while در بخش condition ما باید شرطی که بر اساس آن حلقه به اتمام خواهد رسید را مشخص کنیم. دقت کنید که دستورات داخل بدنه while تا زمانی اجرا خواهند شد که شرط while برابر true باشد. برای آشنایی بیشتر از قسمت قبل مثال چاپ اعداد 1 تا 10 را که با for نوشته بودیم مجدداً مرور می کنیم:

for(int counter = 1; counter <= 10; counter++)
    Console.WriteLine(counter);

در ادامه قصد داریم حلقه for بالا را با دستور while باز نویسی کنیم:

var counter = 1;
while (counter <= 10)
{
    Console.WriteLine(counter);
    counter++;
}

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

دستور آخر بدنه while است، بوسیله دستور آخر با هر بار اجرای حلقه ما یک واحد به متغیر counter اضافه می کنیم. در صورتی که این خط نوشته نشود، حلقه ما به صورت بی نهایت اجر خواهد شد و دائماً عدد 1 را در خروجی نمایش می دهد، زیرا مقدار counter اضافه نشده و شرط حلقه while برای همیشه مقدار true بر می گرداند.ما می توانیم هنگام نوشتن حلقه while، عملیات اضافه کردن یا کم کردن مقدار counter را داخل خود شرط حلقه انجام دهیم:

var counter = 1;
while (counter++ <= 10)
{
    Console.WriteLine(counter);
}

دقت کنید که عملگر ++ بعد از نام متغیر نوشته شده، به این دلیل که ابتدا باید شرط بررسی شده و سپس مقدار counter افزایش پیدا کند، اگر ++ را قبل از نام متغیر می نوشتیم، ابتدا یک واحد به counter اضافه شده و سپس شرط ما چک می شد، یعنی در خروجی ما اعداد 2 تا 10 را مشاهده می کردیم.دستورات break و continue که در بخش قبلی بررسی کردیم نیز در حلقه while کاربرد دارند، دستور break باعث خروج از حلقه و دستور continue نیز باعث رفتن به تکرار بعدی حلقه خواهد شد.

حلقه های نامحدود

حلقه های نامحدود، حلقه هایی هستند که تعداد اجرای آن ها بی نهایت می باشد. برای مثال، سیستم عامل زمانی که راه اندازی می شود، یک حلقه نامحدود شکل گرفته و منتظر دستوری از جانب شما می شود. تنها زمانی این حلقه به پایان می رسد که شما سیستم عامل را Shut Down کنید.

حلقه های نامحدود در برنامه نویسی نیز به همین صورت عمل می کنند. یعنی شما یک حلقه نامحدود تشکیل داده و در داخل حلقه بر اساس شرایط خاص، با دستور break به حلقه پایان می دهید. ساختار کلی نوشتن حلقه های نامحدود با دستور while به صورت زیر می باشد:

while (true)
{
    // syntaxes
}

زمانی که ما به جای شرط عبارت true را می نویسیم، به دلیل اینکه شرط دائماً true خواهد بود حلقه ما هیچ گاه پایان نخواهد یافت. با یک مثال ساده موضوع را بررسی می کنیم. فرض کنید می خواهیم برنامه ای بنویسیم که از کاربر یک نام کاربری و کلمه عبور را پرسیده و در صورت صحیح بودن نام کاربری و کلمه عبور از برنامه خارج شود. در صورت اشتباه وارد کردن نام کاربری یا کلمه عبور مجدداً از کاربر نام کاربری و کلمه عبور را دریافت کند:

Console.WriteLine("Welcome to ITPRO.IR C# Training Course");
Console.WriteLine("******************************************");
while (true)
{
    Console.Write("Username: ");
    var username = Console.ReadLine();
    Console.Write("Password: ");
    var password = Console.ReadLine();

    if(username == "hossein" && password == "itpro")
        break;

    Console.WriteLine("Oops! Invalid username or password. Please try again...");
}

Console.WriteLine("Congrats! Thank you for choosing tosinso.com...");
Console.ReadKey();
  1. در خط اول و دوم یک پیغام خوش آمد گویی به کاربر چاپ می کنیم.
  2. در خط سوم حلقه نامحدود ما شکل میگیرد. (استفاده از عبارت true در شرط while)
  3. در داخل حلقه با چاپ پیغام های مناسب، نام کاربری و کلمه عبور را از کاربر دریافت می کنیم.
  4. سپس بوسیله دستور if چک می کنیم اگر نام کاربری برابر hossein و کلمه عبور برابر itpro بود حلقه با دستور break به اتمام برسد. در غیر اینصورت پیغام مناسبی به کاربر نمایش داده و مجدداً نام کاربری و کلمه عبور را از او دریافت می کنیم. این عملیات تا زمانی که کاربر نام کاربری و کلمه عبور صحیح را وارد نکند تکرار خواهد شد.
  5. در انتها، با خارج شدن از حلقه به کاربر یک پیام خوش آمد گویی یا یک پیام مناسب نمایش داده و با دستور ReadKey منتظر می شویم تا کاربر برای خروج کلیدی را فشار دهد.

حلقه do-while

ساختار حلقه do-while به صورت زیر است:

do
{
    // syntaxes
} while({condition});

در بخش condition شرط اتمام حلقه را می نویسیم. تفاوت حلقه while با حلقه do-while در این است که حلقه do-while حداقل یکبار اجرا خواهد شد، به این خاطر که شرط اتمام حلقه را در اتنهای حلقه می نویسیم، اما حلقه while در صورت برقرار نبودن شرط، اصلاً وارد حلقه نمی شویم.

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

آرایه ها و دستور foreach

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

string name = "ITPro";

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

{type}[] numbers = new {type}[{length}];

در قسمت type نوع داده ای که قصد داریم به عنوان آرایه ایجاد شود و در قسمت length باید تعداد خانه های آرایه را مشخص کنیم. برای مثال فرض کنید که قصد داریم یک آرایه 10 خانه ای از نوع int ایجاد کنیم:

int[] numbers = new int[10];

بوسیله کد بالا یک آرایه 10 خانه ای از نوع int برای ما ایجاد می شود. برای مثال دوم یک آرایه 20 خانه ای از نوع string ایجاد می کنیم:

string[] names = new string[20];

در مرحله بعد باید با نحوه دسترسی به خانه های آرایه آشنا شویم. در دو حالت ما نیاز به دسترسی به خانه های آرایه خواهیم داشت:

  1. قرار دادن مقدار داخل یکی از خانه های آرایه
  2. گرفتن مقدار یکی از خانه های آرایه

ابتدا نحوه قرار دادن مقدار را با هم بررسی می کنیم:

string[] names = new string[20];
names[10] = "ITPro.ir";

همانطور که مشاهده می کنید ابتدا نام متغیر، سپس داخل [] اندیس خانه ای از آرایه که قصد داریم مقدار داخل آن قرار بگیرد را می نویسیم. اما به یک نکته توجه کنید که اندیس آرایه ها از شماره 0 شروع می شود.

یعنی در کد بالا که عدد 10 را نوشتیم، اشاره به خانه نهم آرایه می کنید. برای مثال در یک آرایه 10 خانه ای، عدد 0 به خانه اول و عدد 9 به خانه دهم اشاره می کند.برای خواندن مقدار یکی از خانه های آرایه به صورت زیر عمل می کنیم:

string[] names = new string[10];
names[0] = "Reza";
names[1] = "Hossien";
names[2] = "Mohammad";
Console.WriteLine(names[1]); // output Hossein

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

int[] numbers = new[] { 2,6,3,1,7,9};

در کد بالا، آرایه ای از نوع int تعریف شده و مقادیر مشخص شده داخل {} در خانه های آرایه قرار میگیرد. در مثال قبلی آرایه تعریف شده حاوی 6 خانه خواهد بود (بر اساس تعداد اعداد داخل {}). می توان برای راحتی کار، از نوشتن []int صرفنظر کرد:

int[] numbers = { 2,6,3,1,7,9};

کد بالا، دقیقاً کار کد قبلی را انجام می دهد. زمانی که ما یک آرایه تعریف می کنیم، می توانیم بوسیله دستور for به خانه های آرایه دسترسی داشته باشیم. برای مثال، فرض کنید برنامه ای می خواهیم بنوسیم که 10 عدد را از کاربر دریافت کرده، سپس حاصل جمع این 10 عدد را در خروجی چاپ کند.

1. در ابتدا باید آرایه ای که اعداد داخل آن باید ذخیره شوند را تعریف کنیم:

int[] nums = new int[10];

2. در قدم بعدی باید 10 عدد را از کاربر دریافت کرده و در خانه های آرایه ذخیره کنیم. دقت کنید، 10 مرتبه عملیات دریافت اطلاعات از کاربر تکرار می شود، پس ما باید یک حلقه تشکیل داده و داخل آن حلقه اقدام به دریافت اعداد از کاربر نماییم:

for (int index = 0; index <= 9; index++)
{
    Console.Write("Enter number " + (index + 1) + " of 10: ");
    nums[index] = int.Parse(Console.ReadLine());
}

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

3. در مرحله بعد، باید تک تک خانه های آرایه را خوانده و حاصل جمع را در یک متغیر جانبی ذخیره کنیم:

int sum = 0;
for (int index = 0; index <= 9; index++)
{
    sum = sum + nums[index];
}
Console.WriteLine("Sum of entered numbers: " + sum);

می توان دستور داخل حلقه for را به صورت خلاصه تر نوشت:

int sum = 0;
for (int index = 0; index <= 9; index++)
{
    sum += nums[index];
}
Console.WriteLine("Sum of entered numbers: " + sum);

خاصیت Length

فرض کنید، ما طول آرایه ای که تعریف کردیم را نمی دانیم! در این مواقع می توان با خاصیت Length طول آرایه را بدست آورد. در مثال زیر نحوه بدست آوردن طول آرایه با خاصیت Length را بررسی می کنیم:

string[] names = {"ITPro.IR","Mohammad","Hossein","Farhad","Saeed","Sadegh","Mahmoud"};
Console.WriteLine(names.Length); // Output => 7

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

int sum = 0;
for (int index = 0; index < nums.Length; index++)
{
    sum += nums[index];
}
Console.WriteLine("Sum of entered numbers: " + sum);

ما قسمت شرط دستور for را جوری تغییر دادیم که حلقه تا زمانی که شمارنده کوچتر از طول آرایه باشد تکرار شود. دقت کنید که به جای => ما از > استفاده کردیم. زیرا Length طول آرایه را برمیگرداند و به دلیل شروع شدن خانه های آرایه از اندیس 0 حلقه باید یک عدد کمتر از طول خانه های آرایه تکرار شود.

آرایه های چند بعدی

در مثال های قبلی، آرایه هایی که ایجاد کردیم، متغییرهایی بودند که شامل چندین خانه بودند. به این آرایه ها آرایه های خطی نیز می گویند. اما فرض کنید قصد داریم جدول ضرب 9 در 9 را در یک آرایه ذخیره کنیم. برای این کار باید از آرایه های چند بعدی استفاده کنیم. برای مثال، دستور زیر یک آرایه 2 بعدی شامل 9 سطر و 9 ستون را تعریف می کند:

int[,] martix = new int[9,9];

برای ابعاد بیشتر باید تعداد اعداد داخل [] را بیشتر کنیم:

int[,,] martix = new int[9,9,9];

در مثال زیر، یک آرایه 9 در 9 تعریف کرده و جدول ضرب 9 در 9 را داخل آن ذخیره می کنیم و در نهایت خروجی را چاپ می کنیم:

int[,] matrix = new int[9,9];

for (int col = 0; col < 9; col++)
{
    for (int row = 0; row < 9; row++)
    {
        matrix[col, row] = (col + 1)*(row + 1);
    }
}

for (int col = 0; col < 9; col++)
{
    for (int row = 0; row < 9; row++)
    {
        Console.Write(matrix[col, row] + "\t");
    }
    Console.WriteLine();
}

آرایه های نامنظم یا Jagged Arrays

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

مثل 3 سطر و 2 ستون، اما فرض کنید می خواهیم هر سطر از آرایه تعداد خانه های متفاوتی داشته باشد. برای مثال، سطر اول 5 خانه، سطر دوم 6 خانه، سطر سوم 2 خانه و ... برای اینجور مواقع ما می توانیم از آرایه های نامنظم استفاده کنیم. شیوه تعریف آرایه های نامنظم به صورت زیر است:

int[][] jaggedArray = new int[3][];

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

jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];

می توان هر یک از خانه های آرایه را به صورت مستقیم مانند مثال زیر مقدار دهی نیز کرد:

jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };

در مثال بالا، یک آرایه 3 خانه ای که خانه اول دارای 5 خانه، خانه دوم دارای سه 3 و خانه سوم دارای 2 خانه می باشد را ایجاد کردیم. برای دسترسی به خانه های آرایه باید از دو اندیس استفاده کرد، اندیس اول برای آرایه اول و اندیس دوم برای آرایه دوم:

jaggedArray[0][1] = 77;
Console.WriteLine("{0}", jaggedArray[0][1]);

دستور foreach

در زبان سی شارپ، زمانی که ما یک آرایه تعریف می کنیم، در حقیقت یک مجموعه قابل شمارش (Enumerable) تعریف کرده ایم. در دات نت مجموعه های قابل شمارش زیادی وجود دارند که در بخش های بعدی با آنها بیشتر آشنا خواهیم شد. اما منظور از قابل شمارش چست؟ نوع های قابل شمارش، نوع هایی می باشند که ما می توانیم بوسیله دستور foreach به خانه های آنها دسترسی داشته باشیم. ساختار کلی دستور foreach به صورت زیر است:

foreach({type} {variable-name} in {collection})
{
    // loop syntaxes
}
  1. قسمت type باید نوع متغیری که مجموعه بر اساس آن تعریف شده را مشخص کنیم. برای مثال، اگر آرایه ای داریم که خانه های آن از نوع int است، باید به جای type نوع int را بنویسیم. به جای type می توان از کلمه کلیدی var که در بخش های قبلی با آن آشنا شدیم نیز استفاده کرد.
  2. قسمت variable-name باید نام متغیری که خانه های آرایه در آن قرار می گیرند را مشخص کنیم. این نام کاملاً دلخواه است.
  3. در قسمت collection نام مجموعه ای که قصد داریم به خانه های آن دسترسی داشته باشیم را می نویسیم.

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

string[] names = {"ITPro.IR","Mohammad","Hossein","Farhad","Saeed","Sadegh","Mahmoud"};

foreach (var name in names)
{
    Console.WriteLine(name);
}

بوسیله دستور بالا، کلیه آیتم های آرایه names در خروجی چاپ خواهد شد. دستور foeach بالا دقیقاً معادل دستور for زیر می باشد:

for (int index = 0; index < names.Length; index++)
{
    Console.WriteLine(names[index]);
}

دستور foreach هنگام کار با مجموعه ها به شدت مورد استفاده قرار می گیرد. اما توجه داشته باشید اگر در برنامه ای که قصد نوشتن آن را دارید، سرعت اجرای کدها از اهمیت زیادی برخوردار است، دستور for سرعت اجرای بیشتری نسبت به دستور foreach دارد.با اتمام بخش آرایه ها، در بخش بعدی در مورد متدها و کاربرد متدها در برنامه نویسی توضیح خواهیم داد.

آشنایی با متدها یک

در ادامه مباحث آموزشی زبان سی شارپ به مبحث متدها و شیوه استفاده از آنها خواهیم پرداخت. اما متدها چه استفاده ای در زبان سی شارپ دارند؟ زمانی که ما برنامه ای را می نویسیم با زیاد شدن حجم کد نوشته شده، میزان خوانایی و درک از کد نوشته شده کاهش میابد.

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

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

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

  1. شیوه تعریف متدها
  2. پارامترها و مقادیر بازگشتی
  3. آشنایی با عبارات ref و out
  4. آشنایی با مفهوم method overloading
  5. نوشتن توابع بازگشتی (Recursive Functions)

شیوه تعریف متدها

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

{modifier} [static] {return-type} {name}({parameters})
{
    // method body
}
  1. {modifier}: این بخش نمایانگر سطح دسترسی به متد می باشد. زمانی که ما کدی می نویسیم باید سطح دسترسی به آن قطعه کد را مشخص کنیم. برای مثال متد Main سطح دسترسی public دارد، یعنی از هر نقطه ای از برنامه می توان به آن دسترسی داشت. سطوح دسترسی به شیوه های مختلف تعریف می شوند که در قسمت های بعدی با آنها آشنا می شویم. در حال حاضر برای تمام متدها از کلمه کلیدی public یا عمومی استفاده می کنیم.
  2. [static]: در زبان سی شارپ، ما مفهومی داریم به نام کلاس ها که اشیاء از روی آنها ساخته می شوند، زمانی که ما متدی را با کلمه static مشخص می کنیم، می گوییم این متد خارج از نمونه های ساخته شده از آن کلاس قابل استفاده باشند. نوشتن کلمه کلیدی static برای متدها اختیاری می باشد. توجه داشته باشید. در حال حاضر ما تمامی متدهایی که می نویسیم زیر متد Main تعریف می شوند و باید از نوع static باشند، زیرا تنها متدهای static را می توان از داخل متد Main صدا زد.
  3. {return-type}: در این قسمت ما باید نوع بازگشتی متد را مشخص کنیم. متدها می توانند نوع بازگشتی داشته باشند یا نداشته باشند. برای مثال زمانی که ما متدی می نویسیم که نوع بازگشتی آن string است، جای {return-type} کلمه کلیدی string را می نویسیم. اگر متد نوع بازگشتی نداشته باشد از کلمه void برای مقدار بازگشتی استفاده می کنیم. مقدار مورد نظر داخل بدنه متد با کلمه کلیدی return برگردانده می شود. متدهایی که نوع بازگشتی دارند، باید داخل بدنه مقداری را برگردانند.
  4. {name}: در این قسمت نام متد را مشخص می کنیم، نام متد هر نامی می تواند باشد، اما قواعد نامگذاری متغیرها در قسمت متدها نیز صدق می کنند.
  5. {parameters}: در این قسمت ما پارامترهای ورودی متدها را مشخص می کنیم. یک متد می تواند شامل یک یا چندین پارامتر ورودی باشد یا اصلاً ورودی نداشته باشد.
  6. بدنه متد، مجموعه کدهایی است که با صدا زدن نام آن متد می خواهیم اجرا شوند، این کدها باید بین علامت های { و } قرار گیرند.

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

private static void Main(string[] args)
{
    DisplayMessage();
}

public static void DisplayMessage()
{
    Console.WriteLine("Welcome to C# Course...");
}

در نمونه کد بالا، متدی با نام DisplayMessage تعریف کردیم که داخل آن پیغامی بر روی صفحه کنسول نمایش داده می شود. در داخل متد Main هم متد DisplayMessage را فراخوانی کردیم. دقت کنید که برای فراخوانی متد باید پس از نام متد حتماً () را قرا دهیم.

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

نحوه استفاده پارامتر ها در متدها

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

private static void Main(string[] args)
{
    DisplayMessage("Hossein","Ahmadi");
}

public static void DisplayMessage(string firstName, string lastName)
{
    Console.WriteLine("Welcome dear " + firstName + " " + lastName);
}

در نمونه کد بالا، متدی تعریف کردیم با نام DisplayMessage که دو پارامتر از نوع string با نام های firstName و lastName به عنوان ورودی دریافت می کند. سپس داخل بدنه متد، پیغامی حاوی نام و نام خانوداگی که به عنوان پارامتر پاس داده شده است را در خروجی نمایش می دهیم.

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

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

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

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

private static void Main(string[] args)
{
    DisplayMessage("Hossein");
}

public static void DisplayMessage(string firstName, string lastName = "Ahmadi")
{
    Console.WriteLine("Welcome dear " + firstName + " " + lastName);
}

در مثال بالا، هنگام تعریف متد DisplayMessage برای پارامتر lastName مقدار پیش فرض Ahmadi را مشخص کردیم. با این کار می توانیم از نوشتن مقدار پارامتر lastName هنگام فراخوانی متد خودداری کنیم. در حقیقت نوشتن مقدار برای این پارامتر دلخواه بوده و در صورت نوشته نشدن مقدار پیش فرض جایگزین خواهد شد. دقت کنید که زمان مشخص کردن مقادیر پیش فرض، تنها انتهایی ترین پارامترها می توانند مقدار پیش فرض داشته باشند، در غیر اینصورت پیغام خطا دریافت خواهد کرد. به عنوان مثال:

public static void Test(int a, int b = 12, int c)
{
}

کد بالا صحیح نمی باشد، زیرا علاوه بر پارامتر b باید پارامتر c نیز مقدار اولیه داشته باشد تا پیغام خطا دریافت نکنیم.

مقدار دهی پارامتر ها با استفاده از نام

هنگامی که متدی با چندین پارامتر تعریف میکنیم، می توان مقدار دهی پارامترها را بر اساس نام پارامتر انجام داد. متد زیر را در نظر بگیرید:

public static void Test(int a, int b, int c, int d)
{
}

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

Test(b: 12, d: 1, a: 18, c: 9);

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

مقادیر بازگشتی از متدها

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

public static int Sum(int n1, int n2)
{
    var result = n1 + n2;
    return result;
}

به تعریف بالا دقت کنید، به جای کلمه void از نوع int استفاده کردیم که نشان دهنده نوع بازگشتی متد ما می باشد. اما نکته دیگری نیز وجود دارد که باید به آن توجه کنیم. زمانی که متد ما مقدار بازگشتی دارد، باید جایی داخل بدنه متد، مقداری را با کلمه کلید return بازگردانیم.

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

Console.WriteLine(Sum(2,4));

کد بالا، در خروجی مقدار 6 که حاصل جمع 4 و 2 می باشد را چاپ خواهد کرد. برای آشنایی بیشتر با مقادیر بازگشتی، مثال دیگری را با هم بررسی می کنیم. در این مثال متدی خواهیم نوشت که حقوق و درصد مالیات را به عنوان ورودی دریافت کرده و مقدار مالیات را بر می گرداند:

public static decimal CalculateTax(decimal salary, byte tax)
{
    return (salary / 100) * tax;
}

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

Console.WriteLine(CalculateTax(2500000, 5));

تا این جای کار با مقدمات تعریف متدها، پارامترها و مقادیر بازگشتی متدها آشنا شدیم. در بخش دوم از قسمت دهم سری آموزش سی شارپ با کلمات کلیدی out و ref، مفهوم method overloading و توابع بازگشتی آشنا خواهیم شدیم.

آشنایی با متدها دو

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

  1. آشنایی با کلمات کلیدی ref و out
  2. استفاده از آرایه به عنوان ورودی و خروجی متد
  3. آشنایی با کلمه کلیدی params
  4. قابلیت method overloading و کاربرد آن
  5. نوشتن توابع بازگشتی

کلمات کلیدی out و ref

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

private static void Main(string[] args)
{
    var number = 8;
    Console.WriteLine(number);
    Do(number);
    Console.WriteLine(number);
}

public static void Do(int num)
{
    num = 12;
}

متغیری با نام number تعریف کردیم و مقدار آن را برابر 8 قرار دادیم. سپس این متغیر را در خروجی چاپ کرده و هنگام فراخوانی متد Do متغیر number را به آن ارسال کردیم. در داخل متد Do مقدار پارامتر را به 12 تغییر دادیم و مجدد مقدار number را در خروجی چاپ کردیم.

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

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

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

private static void Main(string[] args)
{
    var number = 8;
    Console.WriteLine(number);
    Do(ref number);
    Console.WriteLine(number);
}

public static void Do(ref int num)
{
    num = 12;
}

در صورتی که کد بالا را مجدد اجرا کنیم، ابتدا عدد 8 و پس از فراخوانی متد، عدد 12 در خروجی چاپ می شود، زیرا پارامتر num در متد Do را از نوع ref تعریف کردیم. دقت کنید که هنگام فراخوانی متد، باید قبل از نام متغیر کلمه کلیدی ref نوشته شود، در غیر این صورت برنامه کامپایل نشده و پیغام خطا دریافت خواهید کرد.

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

private static void Main(string[] args)
{
    Do(ref 18);
}

کلمه کلیدی دیگری که در پارامترها کاربرد دارد، کلمه کلیدی out می باشد. نحوه کارکرد out دقیقاً مانند ref می باشد، با این تفاوت که زمانی که یک پارامتر از نوع out تعریف می شود، حتماً باید داخل بدنه متد آن را مقدار دهی کرد، اما ref به این صورت نیست. کد زیر را در نظر بگیرید:

private static void Main(string[] args)
{
    int sum;
    int substact;
    Calc(12, 3, out sum, out substact);
    Console.WriteLine(sum);
    Console.WriteLine(substact);
}

public static void Calc(int num1, int num2, out int sum, out int substract)
{
    sum = num1 + num2;
    substract = num1 - num2;
}

در متد Calc، دو پارامتر sum و substract از نوع out تعریف شده اند، یعنی حتماً باید این دو پارامتر داخل بدنه متد مقدار دهی شوند. در صورتی که یکی از پارامترها مقدار دهی نشود، با پیغام خطا روبرو خواهید شد. یکی از مهمترین کاربردهای out زمانی است که می خواهید متدی بیش از یک خروجی داشته باشد.

آرایه به عنوان ورودی و خروجی متد

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

private static void Main(string[] args)
{
    var average = Average(new[] {2, 6, 8, 1, 2});
    Console.WriteLine(average);
}

public static int Average(int[] numbers)
{
    var sum = 0;
    foreach (var number in numbers)
        sum += number;
    return sum/numbers.Length;
}

در کد بالا، پارامتر ورودی Average از نوع آرایه تعریف شده و میانگین اعداد آرایه حساب شده و به عنوان خروجی باز گردانده خواهند شد. حال فرض کنید که می خواهیم تعداد 10 عدد از اعداد اول را حساب کرده و به عنوان خروجی برگردانیم. در این موقعیت می توانیم خروجی متد را از نوع آرایه در نظر بگیریم:

private static void Main(string[] args)
{
    foreach (var primeNumber in PrimeNumbers())
    {
        Console.WriteLine(primeNumber);
    }
}

public static int[] PrimeNumbers()
{
    var numbers = new int[10];
    var number = 1;
    var index = 0;
    while (index < 10)
    {
        if (IsPrime(number))
            numbers[index++] = number;
        number++;
    }
    return numbers;
}

public static bool IsPrime(int number)
{
    if (number <= 3)
        return true;
    for (int counter = 2; counter < number; counter++)
    {
        if (number%counter == 0)
            return false;
    }
    return true;
}

کمی در مورد کد بالا توضیح می دهیم، ابتدا از متد IsPrime شروع می کنیم. این متد بررسی می کند که عدد ارسال شده توسط پارامتر به این متد اول هست یا خیر (عدد اول عددی است که تنها بر خودش و یک بخش پذیر باشد). متد PrimeNumbers، تعداد 10 عدد از اعداد اول را حساب کرده و داخل یک آرایه 10 خانه ای قرار می دهد.

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

کلمه کلیدی params

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

بوسیله این کلمه کلیدی می توانید 1 تا n مقدار را برای آن پارامتر مشخص کنیم بدون اینکه در هنگام فراخوانی متد آرایه ای تعریف کنیم. در حقیقت مقادیر به صورت پشت سر هم و با علامت , از هم جدا می شوند. کد میانگین را تغییر داده و از کلمه کلیدی params استفاده می کنیم:

private static void Main(string[] args)
{
    var average = Average(2, 8, 9, 3, 1 , 3);
    Console.WriteLine(average);
}

public static int Average(params int[] numbers)
{
    var sum = 0;
    foreach (var number in numbers)
        sum += number;
    return sum / numbers.Length;
}

به این موضوع دقت داشته باشید که تنها آخرین پارامتر متد می تواند از نوع params باشد و تنها یک پارامتر، یعنی شما نمی توانید دو پارامتر برای متد را از نوع params تعریف کنید.

آشنایی با مفهوم Method Overloading

زمانی که شما متدی را تعریف می کنید، می توانید چندین متد همنام دیگر با آن متد داشته باشید، به شرط آنکه تعداد و نوع ورودی های آن ها با هم متفاوت باشند.در مثال زیر، یک متد و Signature آن نوشته شده اند:

public static int Multiply(int number1, int number2) // Signature => int Multiply(int, int)
{

}

برای آشنایی بیشتر فرض کنید، متدی نوشته ایم که نام و نام خانوداگی را به عنوان ورودی دریافت کرده و یک پیغام مناسب در خروجی چاپ می کند:

private static void Main(string[] args)
{
    DisplayMessage("Hossein", "Ahmadi");
}

public static void DisplayMessage(string firstName, string lastName)
{
    Console.WriteLine("Welcome dear " + firstName + " " + lastName + ".");
}

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

private static void Main(string[] args)
{
    DisplayMessage("Hossein", "Ahmadi", 29);
}

public static void DisplayMessage(string firstName, string lastName)
{
    Console.WriteLine("Welcome dear " + firstName + " " + lastName + ".");
}

public static void DisplayMessage(string firstName, string lastName, byte age)
{
    DisplayMessage(firstName, lastName);
    Console.WriteLine("You are " + age + " years old!");
}

در این حالت، ما می توانیم هر دو نسخه متد DisplayMessage را صدا بزنیم. یعنی هم بدون پارامتر Age و هم با پارامتر Age. زمانی که متدی دارای Overload باشد، Intellisense در Visual Studio زمان فراخوانی متد، لیستی از تمام Overload های آن متد را به ما نمایش می دهد:


p1

متد WriteLine که در کدها از آن استفاده می کنیم نیز دارای Overload های بسیاری است:


p2

متدهای بازگشتی یا Recursive Methods

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

n! = n * (n - 1) * (n - 2) * ... * 1

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

private static void Main(string[] args)
{
    Console.WriteLine(Fact(4));
}

public static int Fact(int num)
{
    if (num == 1)
        return num;
    return num*Fact(num - 1);
}

همانطور که مشاهده می کنید، داخل بدنه متد Fact، مجدد آن را فراخوانی کردیم. دقت کنید که زمان فراخوانی مجدد متد، از پارامتر num یک عدد کم کردیم و به عنوان پارامتر استفاده کردیم. همچنین داخل بدنه متد، باید شرطی وجود داشته باشد که از تکرار بی نهایت متد جلوگیری کند، در غیر اینصورت با خطای Stack Overflow مواجه خواهید شد.

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

برنامه نویسی شی گرا در سی شارپ | آموزش مفاهیم OOP

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

  • آیا یادگیری سی شارپ ساده است؟

    اگر با دوره آموزشی مناسب ، انرژی مناسب و هدفمند شروع به یادگیری زبان سی شارپ کنید ، قطعا یادگیری سی شارپ برای شما بسیار ساده است اما اگر قصد یادگیری بصورت معجزه در زمان کم و با آموزشهای بی هویت هستید ، قطعا سی شارپ سخت ترین زبان برنامه نویسی برای یادگیری شماست
  • آیا می توان بصورت خودخوان سی شارپ را یاد گرفت؟

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

حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ...

نظرات