دانلود رایگان کتاب آموزش ویژوال سی شارپ
گردآوری سید محمد هاشمیان
آموزش گام به گام سی شارپ C#
آموزش برای دانشجویان و مبتدیهایی است که میخواهند برنامهنویسی سی شارپ (C#) یاد بگیرند. برای این یادگیری باید کمی برنامهنویسی بدانید و با مفاهیم مربوط به برنامهنویسی شئگرا آشنا باشید.
۱.نگاهی به C#
C# یک زبان برنامهنویسی شی گرا، ساده و مدرن است که توسط شرکت Microsoft عرضه شده است. .NET Foundation این پروژهی متنباز (Open Source) را مدیریت میکند.
C# یک زبان برنامهنویسی شی گرا و کامل است که به برنامهنویسان این امکان را میدهد اپلیکیشنهایی کراسپلفترم (cross-platform) برای پلتفرمهای ویندوز، تحت وب و موبایل بنویسند. میتوانیم برنامههای C# را در سیستمعاملهای لینوکس، ویندوز، iOS و اندروید بنویسیم.
C# یک زبان برنامهنویسی مدرن است. می توانیم از آن برای نوشتن برنامههای نرمافزاری مدرن امروزی استفاده کنیم.
از C# میتوانیم برای توسعهی انواع مختلف اپلیکیشنها استفاده کنیم: برنامههای کلاینت ویندوز، کامپوننتها (component) و کتابخانهها (library)، سرویسها (service) و APIها، اپلیکیشنهای تحت وب، برنامههای موبایل، اپلیکیشنهای ابری و بازیهای ویدیوئی.
Microsoft از دو فریمورک توسعهی نرمافزار پشتیبانی میکند، فریمورک .NET و .NET Core. فریمورک .NET برای توسعهی اپلیکیشنهای ویندوز و تحت وب در سال ۲۰۰۱ منتشر شد.
اما با فراگیر شدن مفهوم متنباز، شرکت Microsoft نیز کامپایلرهای زبان و .NET را متنباز کرد و این .NET جدید .NET Core نامیده میشود.
در آینده تنها یک نسخه از .NET وجود خواهد داشت، که همان .NET خواهد بود. نسخهی بعدی .NET در سال ۲۰۲۰ و با نام .NET 5 منتشر خواهد شد.
۲. آمادگی برای شروع آموزش سی شارپ
قبل از اینکه اولین اپلیکیشن C# را شروع کنید، باید یک ویرایشگر متن (Editor) یا محیط یکپارچهی توسعهی نرمافزار (IDE) داشته باشید، که بتوانید در آن کدهایتان را بنویسید و کامپایل کنید.
بهترین IDE موجود برای برنامهنویسان C#، Visual Studio شرکت Microsoft است. نسخهی کنونی آن Visual Studio 2019 است.
Visual Studio 2019 به سه صورت مختلف عرضه میشود: Visual Studio 2019 Enterprise، Visual Studio 2019 Professional و Visual Studio 2019 Community
Visual Studio 2019 Community رایگان است. در این آموزش از Visual Studio 2017 Community استفاده خواهیم کرد.
همینطور میتوانید از Visual Studio Code هم استفاده کنید.
Visual Studio Code یک ویرایشگر کدِ رایگان، سبک و متن باز است که میتوانید از آن برای نوشتن و دیباگ کردن (Debug) کدهایتان استفاده کنید. VS Code از بیشتر زبانهای برنامهنویسی پشتیبانی میکند.
میتوانید Visual Studio 2017 Community را از اینجا دانلود کنید.
۳. تفاوت IDE، زبان و فریمورک
قبل از نوشتن اولین برنامه، میخواهیم تفاوتهای IDE، زبان برنامهنویسی و فریمورک را بررسی کنیم. نمیتوانیم C#، .NET و ویژوال استودیو (Visual Studio) را یکی درنظر بگیریم، چون با هم فرق دارند.
ویژوال استودیو (Visual Studio) یک IDE (محیط یکپارچهی توسعهی نرمافزار) است، C# و VB.NET زبانهای برنامهنویسی هستند و .NET یک فریمورک است.
فریمورک .NET مجموعهای عظیم از کامپوننتها و کتابخانههاست. اگر به آدرس زیر در سیستمتان بروید:
C:\Windows\Microsoft.NET\Framework
نسخههایی مختلف از فریمورک .NET را خواهید دید. اگر به هریک از پوشههای مربوط به نسخههای.NET بروید، فایلهای مختلفی را میبینید که با کلمهی “System” شروع میشوند و از نوع “Dll” هستند.
DLL مخفف کلمهی Dynamic Link Library است.
این فایلها دارای کدهایی با قابلیت استفادهی مجدد (reusable code ) هستند که کاری خاص را انجام میدهند.
مثلاً، فایل “System.Data.dll” به ذخیرهی داده در RDBMS کمک میکند یا فایل “System.Drawing.Dll” برای اهداف GUI (واسط کاربری گرافیکی) و نمایش است.
پس به زبانی ساده، فریمورک .NET مجموعهای بزرگ از کامپوننتهایی با قابلیت استفادهی مجدد است.
حالا برای نوشتن یک برنامه، باید منطق برنامه را بنویسیم و این کامپوننتها را فراخوانی کنیم.
برای این کار به زبان برنامهنویسی نیاز داریم. C# و VB.NET زبانهای برنامهنویسی هستند. این زبانها میتوانند این کامپوننتها را فراخوانی و از آنها استفاده کنند.
در اپلیکیشنهای حرفهای، سایز برنامه بسیار بزرگ است و برای مدیریت بهتر اتوماسیون موارد زیر لازم است:
- پیدا کردن و ارجاع به کامپوننت فریمورک .NET در کد C#
- کمک به پشتیبانی از کامپوننتهای .NET در زمان کدنویسی
- چک کردن سینتکس C# و کامپایل آن
- و ….
به طور خلاصه، ابزاری لازم داریم که در مدیریت کد C# و ارجاع کامپوننتهای فریمورک .NET در شرایط مختلف کمکمان کند. میتوانیم این ابزار را یک محیط یکپارچهی توسعهی نرمافزار بنامیم. (VS IDE (Visual Studio IDE تمامی این کارها را برایمان انجام میدهد.
به طور خلاصه، C# یک زبان برنامهنویسی است و از کامپوننتهای فریمورک .NET برای نوشتن یک اپلیکیشن استفاده میکند.
برای توسعهی یک نرمافزار، باید کارهایی را انجام دهیم، مثلاً کامپایل کردن برنامه، ارجاع به کامپوننتهای فریمورک .NET، چک کردن سینتکس و غیره، که VS IDE همهی این کارها را انجام میدهد. پس VS IDE یک ابزار است.
۴. اولین اپلیکیشن C#
بیایید اولین اپلیکیشنمان را در C# بنویسیم: برنامهی “Hello World”. این سادهترین برنامهای است که میتوانید در C# بنویسید.
این برنامه در خروجی کنسول مینویسید: “Hello, C# world!”
Visual Studio 2017 Community را باز کنید.
مسیر زیر را انتخاب کنید:
File > New > Project
مسیر زیر را انتخاب کنید:
Templates > Visual C# > .NET Core > Console App (.NET Core)
حالا با نوشتن نامی در Name TextBox، نامی برای پروژه انتخاب کنید.
برای ساخته شدن پروژه روی دکمهی ok کلیک کنید.
با این کار یک console app میسازید.
همانطور که میبینید، فایلهای کد با ساختاری مناسب مرتب شدهاند. اول Solution Explorer داریم و پروژهها (project) درون آن قرار دارند و یک project دارای فایلهای کد است. بنابراین یک پروژه، با استفاده از solutionها و projectها تنظیم میشود. یک project، واحدی منطقی، مستقل و دارای کد است. میتوانیم آنها را ماژول (modules) نیز بنامیم. مثلاً در یک نرمافزار میتوانیم ماژولهای مختلفی مثل accounting، invoicing و غیره داشته باشیم. پس میتوانیم در یک برنامه یک project برای accounting و یک project برای invoicing داشته باشیم و همهی اینها را در یک solution قرار دهیم.
حالا روی فایل Program.cs در Solution Explorer کلیک کنید و تمام محتوای این فایل را پاک کنید.
کد زیر را در آن بنویسید.
Build و run را بزنید. کلیدهای Ctrl+F5 را بزنید.
با این کار، برنامه با ساخت یک فایل HelloCSharp.exe در محلی که انتخاب کردید، کدهایتان را کامپایل و اجرا میکند. نتیجه “Hello, C# world!” است که در کنسول سیستم نمایش داده میشود.
همانطور که در شکل ۵ میبینید، HelloCSharp.exe در مسیر C:\Mahesh\Csharp\HelloCSharp\bin\Debug\folde ساخته شده است.
خروجی به شکل زیر است:
۵. درک بهتر فرایند کامپایل برنامه (کدهای IL و JIT)
برای اجرای کد نرمافزار در یک ماشین، باید فرایندی به نام کامپایل را انجام دهیم.
به زبانهای برنامهنویسیای که برای انسان قابل فهماند، زبان برنامهنویسی سطح بالا (higher level language) میگویند، مثل جاوا و C#.
برای اجرای کد این زبانها در سختافزار، باید آنها را به زبان ماشین (باینری) تبدیل کنیم.
به فرایند تبدیل یک زبان سطح بالا به یک زبان ماشین کامپایل کردن میگویند.
برای کامپایل کردن کد C#، روی Build کلیک کنید و سپس Build solution را انتخاب کنید.
این گزینه تمامی پروژههای موجود در solution را بیلد میکند. برای build کردن یک پروژهی خاص، گزینهی مورد نظر به آن را انتخاب کنید. احتمالاً متوجهی دو پوشهی “obj” و “bin” شدهاید. پوشهی “obj” دارای فایلهای باینری است که به هم لینک نشدهاند. پوشهی “bin” فایلهای باینری کامپایلشدهی نهایی را دارد.
پس حالا حتماً فکر میکنید که کد ماشین نهایی در پوشهی “bin” است. هم بله و هم خیر.
وقتی build را میزنیم، کامپایلر .NET کد برنامه را به یک زبان میانی تبدیل میکند که به آن کدIL میگوییم. کد IL یک کد نیمه کامپایل شده است.
برای دیدن این کد روی برنامه کلیک کنید و developer command prompt را باز کنید و دستور ILDASM را اجرا کنید.
شکل زیر برایتان باز خواهد شد. ILDASM (IL Disassembler) ابزاری ساده است که با نصب VS برایتان نصب میشود و میتوانید با آن کد IL را ببینید. روی File و سپس Open کلیک کنید. به پوشهی bin بروید و فایل exe را باز کنید. این همان کد IL است.
حالا سؤالی که مطرح میشود این است که چه کسی کامپایل نهایی را انجام میدهد و چه زمانی این اتفاق رخ میدهد؟ کامپایل نهایی در زمان اجرای برنامه صورت میگیرد و JIT (Just In Time Compiler) مسئول انجام آن است. پس با اجرای فایل EXE، JIT اجرا میشود و با توجه به نیاز، درلحظه کد را به زبان ماشین کامپایل میکند.
پس فرایند کامپایل به شکل زیر اتفاق میافتد:
- VS،کد C# را به کد IL کامپایل میکند. به عبارت دیگر، با زدن build، کد C# به کد IL کامپایل میشود و این کد در پوشهی debug قرار میگیرد.
- وقتی فایل EXE اجرا میشود، JIT شروع به کار میکند و براساس تقاضا کد C# را به کد ماشین بهینه کامپایل میکند.
حالا سؤالی که مطرح میشود این است که چرا باید ابتدا کد را به یک کد میانی کامپیال کنیم؟ به این دلیل که اگر اپلیکیشن بخواهد در زمان اجرا کامپیال کامل را انجام دهد، سرعت برنامه بسیار پایین میآید.
پس حالا میتوانیم عنوان کنیم که فقط سورسکد بر کامپایل تأثیر ندارد. نوع سیستمعامل و کانفیگریشن ماشین (۳۲ بیت یا ۶۴ بیت) نیز تأثیرگذارند. پس برنامه با توجه به محیط اجرایی به یک کد بهینه کامپایل میشود.
پس اگر برنامه نویس بر اساس سیستم خود کامپایل کامل را انجام دهد، فرایند کامپایل فقط برای سیستم برنامهنویس انجام شده است.
وقتی برنامه را در سیستمی دیگر اجرا میکنیم، این کد برای آن ماشین به صورت بهینه کامپایل نشده است.
پس منطقی است که عمل کامپایل را در زمان اجرا انجام دهیم. چون در زمان اجرا کانفیگریشن محیط را میدانیم و میتوانیم بر اساس آن کدی بهینه را کامپایل کنیم.
۶. انواع دادهای در C#
C# یک زبان strongly typed است. نوع دادهای در C# به دو دسته تقسیم میشود: انواع built-in و انواع custom.
انواع built-in (موجود در زبان):
bool, byte, sbyte, char, decimal, double, float, int, uint, long, ulong, object, short, ushort, string
کد زیر نشان میدهد که چگونه یک متغیر تعریف کنیم، مقداری به آن بدهیم (assign) و از آن استفاده کنیم.
۷. انواع مقداری (Value Type) و ارجاعی (Reference Type)
C# از انواع مقداری و ارجاعی پشتیبانی میکند.
یک متغیر نوع مقداری، مقدار واقعی داده را در فضای حافظهی تخصیص داده شده به خود دارد. انواع مقداری از System.ValueType ارثبری دارند. انواع مقداری دو نوع دارند: struct و enum.
یک نوع ارجاعی، به مکانی از حافظه که دادهی واقعی در آن ذخیره شده است، ارجاع میدهد. از انواع ارجاعی میتوان کلاس، آرایه، واسط، delegate و event را نام برد.به صورت پیشفرض، یک مقدار null به نوع ارجاعی داده میشود. وقتی یک نوع دارای مقدار null باشد، یعنی هیچ instance یا نمونهای برای آن نوع موجود نیست.
۸. Structs در C#
struct یکی از انواع مقداری است که از آن برای کنار هم نگهداشتن گروهی از متغیرهای مشابه استفاده میشود.
یک داده از نوع struct میتواند سازنده (constructor)، ثابت (constant)، فیلد (field)، متد، property، indexer، عملگر (operator) و دادههای تودرتو (nested) تعریف کند.
کد زیر یک نمونه از یک دادهی struct به نام Book است. این داده اطلاعات یک کتاب را، با چهار عضوی که دارد، نگه میدارد: Title، Author، Price و Year.برنامهی Main، شئای از Book که از نوع struct است، میسازد، به اعضای آن مقدار و آن مقادیر را نمایش میدهد.
۹. Enums در C#
در C# از Enum برای نمایش مجموعهای از ثابتها (constant) استفاده میشود. مثلاً برای نشان دادن یک روز هفته، میدانیم که یک هفته تنها ۷ روز دارد.
در زیر برخی از نمونههای رایج Enum را میبینید:
- WeekDay – Mon, Tue, Wed, Thu, Fri, Sat, Sun
- Months – Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
- Rectangle – Left, Top, Bottom, Right
- Point – X, Y
در کد زیر دو مثال از Enum میبینید
۱۰. کلاس (Class) در C#
کلاس، پایه و اساس یک زبان برنامهنویسی شئگرا مثل C# است. یک کلاس، یک واحد منطقیِ داده است. کلاسها اعضایی مانند property، فیلد، متد و event دارند.
کد زیر یک کلاس Person است که سه عضو private با نامهای name، age و sex دارد. همچنین این کلاس سه property به صورت public نیز دارد. در ادامه کمی دربارهی propertyهای public و private توضیح خواهیم داد.
در C# از کلمهی کلیدی new برای ساخت نمونهای (instance) از یک کلاس استفاده میشود. کد زیر به propertyهای Name، Age و Sex شئp مقدار میدهد.
کد زیر مقادیر اعضای شئ p را میخواند.
۱۱. Access Modifierهای کلاس
Access Modifierها سطح دسترسی را برای یک نوع و اعضای آن تعیین میکنند و شرایط نحوهی دسترسی به یک type و اعضای آن را در خود type، assembly جاری و دیگر assemblyها مشخص میکنند.
جدول زیر نوع دسترسی به یک عضوِ کلاس یا struct و scope آنها را مشخص میکند.
Access Modifier | Scope |
public | از assembly مشابه یا دیگر assemblyهایی که به آن ارجاع میکنند، میتوان به نوع یا اعضایش دسترسی داشت. |
private | فقط کد همان کلاس میتواند به نوع یا اعضایش دسترسی داشته باشد. |
protected | فقط کد همان کلاس، یا کلاس فرزند میتواند به نوع یا اعضایش دسترسی داشته باشد. |
internal | فقط از assembly مشابه میتوان به نوع یا اعضایش دسترسی داشت. |
protected internal | فقط از assembly که نوع یا اعضایش در آن تعریف شدهاند، یا کلاس فرزند در یک assembly دیگر میتوان به آنها دسترسی داشت. |
private protected | فقط کد همان کلاس یا کلاسهای فرزند در assembly مشابه میتوانند به نوع و اعضای آن دسترسی داشته باشند. |
۱۲. فیلد (Field) در C#
یک عضو فیلد، متغیر یک کلاس یا struct است. یک فیلد میتواند public، private، protected، internal یا protected internal باشد.
فیلدهای یک کلاس میتوانند دارای سطوح دسترسی مختلفی باشند. در کد زیر، فیلدهای name، age و sex فیلدهایی private هستند. یعنی فقط میتوان از داخل همین کلاس به آنها دسترسی داشت.
میتوانیم از هرجایی به فیلدهای public دسترسی داشته باشیم. میتوانیم به فیلدهای protected از داخل کلاس Person یا کلاسهای فرزند آن دسترسی داشته باشیم.
یک عضو فیلد همچنین میتواند read-only باشد. یعنی فقط میتوانیم در زمان تعریف یا داخل سازنده به آن مقدار دهیم.
اگر نوع فیلد static نباشد، میتوانید فقط از طریق یک instance از کلاس به فیلد دسترسی داشته باشید. کد زیر یک instance از کلاس Person میسازد و به فیلد Year مقدار میدهد.
یک فیلد همچنین میتوانید استاتیک باشد. یعنی میتوانیم بدون ساختن یک instance از کلاس به فیلد دسترسی داشته باشیم. برای ساخت یک فیلد استاتیک از کلمهی کلیدی static و برای ساخت یک فیلد readonly از کلمهی کلیدی readonly استفاده میکنیم.
میتوانیم از هر دو کلمهی کلیدی برای ساخت یک فیلد static و readonly استفاده کنیم. کد زیر یک فیلد استاتیک و readonly را تعریف میکند.
فیدها میتوانند متغیر یا ثابت باشند.
۱۳. سازنده (Constructor) در C#
سازندههای مسئول ساخت یک instance از یک کلاس یا struct هستند.
سازندههای متدی با همان نام کلاس یا struct هستند و باید برای ساخت نمونهای از از یک کلاس یا struct فراخوانی شوند. میتوانیم یک سازنده را با استفاده از عملگر new فراخوانی کنیم.
بیایید کلاس سادهی Person را با چهار عضو بررسی کنیم.
مثلا کد زیر با استفاده از عملگر new یک شئ Person میسازد و سازنده را فراخوانی میکند.
بعد از ساخته شدن شئ (در اینجا شئ p)، حالا میتوانیم از آن برای فراخوانی عضوهای ‘p’ استفاده کنیم. مثلا کد زیر، فیلد name را در p مقداردهی میکند.
از سازندهها برای مقداردهی اولیه به اعضای شئ جدید استفاده میشود. یک کلاس یا struct میتواند یک یا چند سازنده داشته باشد. یک سازنده return ندارد.
۱۴. property در C#
اعضای property یک کلاس اجازهی دسترسی به فیلدهای private را، به آنهایی که کلاس را فراخوانی میکنند، میدهند. اعضای property فیلدهای private را از طریق یک special method به نام accesor در دسترس دیگران قرار میدهند.
از get accessor برای برگرداندن مقدار یک property و از set accessor برای دادن یک مقدار به property استفاده میشود.
بیایید کد زیر را بررسی کنیم که کلاس Person را با سه فیلد private با نامهای name، age و sex تعریف میکند. برنامههای بیرونی میتوانند با استفاده از سه propery public به نامهای Name، Age و Sex به این فیلدهای private دسترسی داشته باشند.
کد زیر یک شئ از کلاس Person میسازد و propertyهایش را مقداردهی میکند. وقتی propertyها مقداردهی شدند، در واقع مقادیر آنها در شئ کپی میشوند. کد زیر مقادیر propertyها را میخواند و آنها را در کنسول نمایش میدهد.
۱۵. متد (Method) در C#
متد یک کلاس، بلوکی از کد است که کاری خاص انجام میدهد. امضای متد (method signature) با یک access modifier شروع میشود، که بعد از آن یک modifier دیگر، نوع مقدار بازگشتی (return type)، نام متد و پارامترهای متد را مینویسیم.
امضای یک متد معمولی به صورت زیر است. کد زیر یک متد public است که یک مقدار bool برمیگرداند و دو پارامتر دارد. بلوک کد یک متد با } شروع و با { تمام میشود.
خروجی متد میتواند یک نوع داده یا null باشد. متدها میتوانند آرگومان بگیرند و چندین مقدار را برگردانند.
بیایید یک متد SayHello به کلاس Person اضافه کنیم که پیغامی حاوی نام شخص (name) را در کنسول چاپ میکند. متد SayHello مقداربازگشتی ندارد. کلاس Person بعد از اضافه کردن متد به صورت زیر است.
حالا بیایید از متد Main این متد را فراخوانی کنیم. همانطور که فراخوانی propertyها و فیلدها را دیدید، یک متد را نیز به همان روش فراخوانی اعضای یک کلاس یا struct فراخوانی میکنیم.
کد زیر یک نمونه از کلاس Person میسازد، name را مقداردهی و متد SayHello را فراخوانی میکند.
در بیشتر مواقع، برنامهای که عمل فراخوانی را انجام میدهد، باید دادههایی را به کلاس بفرستد. از این دادهها میتوان برای پردازش، منطق تجاری (business logic) و تصمیمگیری استفاده کرد.
آخرین قسمت از امضای یک متد، لیستی از پارامترهای آن است که برنامهای که متد را فراخوانی میکند، آنها را به متد میدهد.
یک متد، نوع و نام پارامترها را تعریف میکند. پارامترهای مختلف با یک “،” از هم جدا میشوند.
در زیر متدی را میبینید که سه پارامتر میگیرد و مقداری را برمیگرداند.
حالا بیایید متد CalculateSalary را از متد Main فراخوانی کنیم.
۱۶. overload کردن یک متد در C#
C# به شما این امکان را میدهد که متدهایی با نام یکسان اما امضاهای مختلف تعریف کنید. به این کار overload متد گفته میشود. کلاسRateCalculator زیر، یک متدCalculateCost را با سه امضای مختلف تعریف میکند.
فراخوانی یک متد بستگی به تعداد و نوع آرگومانهایی دارد که هنگام فراخوانی استفاده میشود. کد زیر این سه متد overload شدهی مختلف را فراخوانی میکند.
۱۷. عبارت (Expression) در C#
یک عبارت، دنبالهای از عملگرها و عملوندهاست که نوعی محاسبه را انجام میدهند و نتیجه در یک شئ یا مقدارِ واحد قرار میگیرد. کد زیر دو عبارت را نشان میدهد.
عبارت اول یک رشته با مقدار “۱۲” را به یک integer تبدیل میکند و عبارت دوم دو عدد را با هم جمع میکند.
معمولاً، از عبارات در دستورات (Statement) استفاده میشود. مثلا کد زیر مثالی از یک دستور است. سمت راست دستور شامل یک عبارت است که دو عدد را با هم جمع میکند.
یک عبارت میتواند دارای مقادیر لیترال (literal) و فراخوانیهای متد باشد. کد زیر از جمع دو لیترال در عبارت استفاده میکند.
از عبارت میتوان در فراخوانی یک متد نیز استفاده کرد. فراخوانی متد به این صورت است: نام متد، () و پارامترهای متد درون () قرار میگیرند. کد زیر دو متد را فراخوانی میکند.
۱۸. عملگر (Operator) در C#
یک عملگر مسئول یک opertation (عمل) است. مثلاً، عملگرهای + و – به ترتیب جمع یا تفریق دو عملوند را نشان میدهد. این عملوندها میتوانند مقادیر، اشیاء یا لیترال باشند. یک عملوند همچنین میتواند یک عبارت یا چندین زیرعبارت (sub expression) باشد.
کد زیر مثالی از عملگرها و عملوندهاست.
کد زیر یک عبارت است. عملگر “+” روی دو عملوند، a و b، اعمال و نتیجه در متغیر total ذخیره میشود.
کد بالا همچنین متغیرهایی از نوع decimal و string نیز تعریف میکند. کد زیر یک مقدار decimal را به دو مقدار int اضافه میکند.
کد زیر دو مقدار رشته را با هم جمع میکند. حین انجام عمل یک فاصله (space) نیز اضافه شده است.
سه نوع عملگر داریم: عملگرهای یکانی (unary)، باینری (binary) و سهتایی (ternary).
۱۹. دستور (Statement) در C#
دستور بخشی از برنامه است که عملی را نشان میدهد، مثلاً تعریف متغیرها، مقداردهی به آنها، فراخوانی متدها، داشتن یک حلقهی دستور در مجموعهها یا یک بلوک کد که دارای {} است.
یک دستور میتواند یک خط کد باشد که با ؛ تمام میشود یا بلوک کدی باشد که در یک {} قرار میگیرد.
کد زیر دو دستور دارد:
کد زیر یک دستور if-else با چندین خط کد است.
۲۰. دستور if-else در C#
به دستور if-else دستور شرطی نیز میگویند. در زیر سینتکس (syntax) یک دستور if-else را میبینید.
اگر شرط (condition) درست باشد (true)، بخش if یا بلوک حاوی دستور آن اجرا میشود. اگر شرط نادرست باشد (false)، کنترل اجرای برنامه به بخش else یا بلوک حاوی دستور آن داده میشود. میتوانیم بخش ‘else’ این دستور را حذف کنیم و داشتن آن اختیاری است.
کد زیر از دستور if استفاده میکند، تا اگر مقدار متغیر a کمتر از ۰ بود، پیغام ‘a is negative’ را نشان دهد.
کد زیر از دستور if-else استفاده میکند تا اگر مقدار متغیر a کمتر از ۰ نبود، پیغام ‘a is 0 or positive’ را نشان دهد.
اگر دستور یک خط کد دارد، گذاشتن {} الزامی نیست.
میتوانید if-esleهای تودرتو داشته باشید.
همینطور میتوانید با استفاده از “||” (یا شرطی) و “&&” (و شرطی) چند شرط را با هم ترکیب کنید.
دستور if-else میتواند دستورات تودرتو دیگری داشته باشد. همچنین میتواند درون خود یک یا چند دستور if-else دیگر نیز داشته باشد.
۲۱. دستور switch در C#
دستور switch در C# یک دستور شرطی است که با یک یا چند بلوک case و یک بلوک default همراه میشود. بلوک case برای مقداری که با مقدار expression دستور switch یکی باشد، اجرا میشود.
اگر هیچیک از مقادیر caseها با مقدار expression دستور switch برابر نباشد، بلوک default اجرا میشود.
مقادیر expression در کد بالا میتواند هر عبارت غیر nullای باشد.
کد زیر یک دستور switch معمولی است. مقدار expression دستور switch (caseSwitch) یک عدد رندم بین ۱ تا ۹ است و بر اساس مقدار آن، یکی از بلوکهای case اجرا میشود. اگر مقدار expression دستور switch با هیچ یک از سه بلوک case یکی نباشد، بلوک default اجرا میشود.
۲۲. دستور for در C#
دستور for، حلقهی for نیز نامیده میشود و یک بلوک کد را اجرا میکند.
سینتکس حلقهی for:
for (initializer; condition; iterator)
statement
کد زیر سادهترین نمونه از حلقهی for است. در این کد، مقدار اولیهی متغیر counter، ۰ است. شرط میگوید تا زمانی که متغیر counter مقداری کمتر یا برابر با ۱۰۰ دارد، یکی به مقدار counter اضافه شود. مقدار counter در کنسول نمایش داده میشود.
متغیر initializer مقدار اول شروع حلقه را تعیین میکند و iterator این مقدار را کم یا زیاد میکند. کد زیر حلقهای را نشان میدهد که از مقدار ۱۰ شروع میشود و با گامهای ۱۰تایی تا مقدار کمتر از ۱۰۰ پیش میرود.
بخش دستوری (statement) حلقه دارای یک بلوک کد است که اگر شرط درست باشد، اجرا میشود. کد زیر زوج بودن اعداد بین ۱۰ تا ۱۰۰ را بررسی میکند.
۲۳. دستور foreach در C#
از دستور foreach برای چرخیدن در مجموعهای از آیتمها مثل یک آرایه استفاده میشود. بدنهی کد foreach باید در یک {} قرار بگیرد. اگر بدنه تنها دارای یک خط کد باشد، نیازی به {} نیست. در ادامه دربارهی آرایهها و collectionها توضیح خواهیم داد.
کد زیر آرایهای از اعداد فرد میسازد و از حلقهی foreach برای چرخیدن در میان آیتمها و خواندن آنها استفاده میکند.
در کد زیر مثالی از یک حلقهی for میبینید که آیتمهای یک آرایه را میخواند.
۲۴. دستور do-while در C#
یک دستور do-while تا زمانی که شرط while درست باشد، یک بلوک دستور را اجرا میکند. بدنهی کد باید در یک {} قرار بگیرد. اگر بدنه تنها دارای یک خط کد باشد، نیازی به {} نیست.
کد زیر یک حلقه را تا زمانی که مقدار counter کمتر از ۲۰ شود، اجرا میکند.
۲۵. دستور while در C#
یک دستور while تا زمانی که شرط while درست باشد، یک بلوک دستور را اجرا میکند. بدنهی کد باید در یک {} قرار بگیرد. اگر بدنه تنها دارای یک خط کد باشد، نیازی به {} نیست.
کد زیر یک حلقه را تا زمانی که مقدار counter کمتر از ۲۰ شود، اجرا میکند.
۲۶. دستور goto در C#
وقتی میخواهیم به قسمتی خاصی از کد برویم، از goto استفاده میکنیم. در کد زیر اگر شرط درست باشد، با استفاده از دستور goto از یک بلوک case به بلوک case دیگر میرویم.
برنامه یک رشته را از کنسول میگیرد. وقتی کلمهی ‘Mahesh’ را تایپ میکنید، بلوک case کنترل اجرا را به caseای با عبارت ‘Chand’ میدهد.
توجه داشته باشید که اگر از دستور go to در بلوک کد یک case استفاده کنید، دیگر لازم نیز دستور break را نیز بنویسید. در تمامی حالات دیگر داشتن break الزامی است.
۲۷. دستور break در C#
برنامه با دستور break بلافاصله از یک حلقه یا دستور switch خارج میشود. معمولاً وقتی میخواهیم با برقرار بودن شرطی از یک حلقه خارج شویم، یا وقتی میخواهیم بدون اجرای ادامهی ساختار حلقه از آن خارج شویم، از دستور break استفاده میکنیم.
از دستور break در دستورات for، foreach، while و do-while استفاده میشود. کد زیر استفاده از دستور break را نشان میدهد. اگر شرط num == 15 درست باشد، اجرای برنامه از حلقه خارج میشود.
۲۸. دستور continue در C#
مثل دستور break، از دستور continue در دستورات for، foreach، while و do-while استفاده میشود. دستور continue اجرای iteration جاری حلقه را متوقف میکند و باقی iterationهای حلقه را اجرا میکند.
در کد بالا، اگر شرط num == 5 درست باشد، اجرای برنامه از iteration جاری حلقه خارج میشود و iteration بعدی را اجرا میکند.
۲۹. دستور return در C#
دستور return قبل از رسیدن به انتهای متد، از آن خارج میشود. با توجه به متدی که از return استفاده میکند، این دستور میتواند یک مقدار را برگرداند یا مقدار نداشته باشد.
کد زیر نمونهای از یک دستور return است. اجرای برنامه به برنامهای که، متد را فراخوانی کرده است، باز میگردد.
۳۰. واسط (Interface) در C#
یک واسط نقشهای است که یک کلاس یا struct باید برای implement کردن آن پیادهسازی کند.
یک واسط تنها امضاهای اعضایش را دارد. وقتی برنامهنویسانِ کتابخانهها و کامپوننتها، باید الگویی خاص را در پیادهسازی کلاس یا struct دنبال کنند، از واسط استفاده میکنند.
یک واسط دارای propertyهای زیر است:
- هر کلاس یا structای که interface را implement میکند، باید تمامی اعضای آن را نیز implement کند.
- نمیتوانیم مستقیما یک واسط را new کنیم. اعضای آن تنها با implement شدن در یک کلاس یا struct پیادهسازی میشوند.
- واسطهای میتوانند event، indexer، متد و property داشته باشند.
- واسطها، متدها را پیادهسازی نمیکنند.
- یک کلاس یا struct میتواند چندین واسط را implement کند. یک کلاس میتواند از یک کلاس پدر ارثبری داشته باشد و یک یا چند واسط را implement کند.
- عضوی که، یک کلاس یا struct بعد از implement کردن واسط دارد، باید public باشد، static نباشد و دارای نام و امضایی مشابه با عضو اصلی واسط باشد.
- واسطها نیز میتوانند base interface داشته باشند و یک واسط میتواند از چند base interface ارثبری داشته باشد.
۳۱. کلاس partial در C#
کلاسهای partial در C# 2 معرفی شدند. این کلاس به برنامهنویسان این امکان را میدهد که یک کلاس را به چند فایل فیزیکی تقسیم کنند. کلاسهای partial در پروژههای بزرگ بسیار مفیدند.
وقتی اندازهی یک کلاس خیلی بزرگ باشد، عملکرد آن بین اعضای مختلف تیم برنامهنویسی تقسیم میشود.
در پروژههای بزرگ، چندین نفر روی یک عملکرد برنامه کار میکنند. بیایید فرض کنیم که یک برنامه دارای یک واسط کاربری (UI) به صورت یک پنجرهی ویندوز یا صفحهی وب است. UI دارای عملکردهای زیادی است و چندین برنامهنویس باید روی عملکرد یک پنجرهی برنامه کار کنند.یک برنامهنویس واسط کاربری را میسازد و طراحی و layout آن را تغییر میدهد. دو برنامه نویس دیگر روی پایگاه داده و منطق تجاری کار میکنند. میتوانیم بهسادگی کد پنجرهی برنامه را به سه کلاس partial فیزیکی تبدیل کنیم و هر برنامهنویس روی کلاس جدای خود کار کند.
۳۲. کلاس static در C#
کلاسهای استاتیک سازندهی instance ندارند و میتوان بدون ساختن یک instance از کلاس از آنها استفاده کرد. در زیر برخی از ویژگیهای این کلاسها آورده شده است.
- نمیتوانید با استفاده از عملگر new یک instance از یک کلاس استاتیک بسازید.
- یک کلاس استاتیک، یک کلاس sealed است. یعنی هیچ کلاسی نمیتواند از یک کلاس استاتیک ارثبری داشته باشد.
- این کلاسها فقط میتوانند اعضای استاتیک داشته باشند. درصورت داشتن عضو غیر استاتیک خطای کامپایلر رخ میدهد.
- یک کلاس استاتیک نمیتواند سازندهی instance داشته باشد.
- سازندهی استاتیک یکبار فراخوانی میشود و کلاس استاتیک در طول عمر برنامه، در حافظهای که برنامه در آن قرار دارد، باقی میماند.
۳۳. کلاس abstract در C#
هدف کلاسهای abstract داشتن نقشهای از کلاسهای فرزند است. کلاسهای abstract پیادهسازی نمیشوند. کلاسهایی که از یک کلاس abstract ارثبری دارند، عملکرد کلاس را implement میکنند.
در زیر ویژگیهای کلیدی کلاسهای abstract آورده شده است:
- نمیتوان از یک کلاس abstract نمونه (instance) داشت.
- یک کلاس تنها میتواند از یک کلاس abstract ارثبری داشته باشد.
- یک کلاس abstract میتواند متد، property و eventهای abstract داشته باشد.
- یک کلاس abstract با داشتن sealed modifier نمیتواند تغییر داده شود.
- کلاسی که از یک کلاس abstract ارث میبرد، باید تمامی متدها و accessorهای abstract را implement کند.
۳۴. آرایه (Array) در C#
یک آرایه در C# مجموعهای از اشیاء و انواع است. المنتهای آرایه میتوانند از هر نوعی، حتی آرایه باشند. آرایه میتواند یک بعدی، دوبعدی یا Jagged باشد. اندازهی آرایه میتواند ثابت یا پویا (dynamic) باشد.
ایندکس (index) یک آرایه از صفر شروع میشود. یعنی اولین آیتم آرایه در مکان ۰ قرار دارد. مکان آخرین آیتم برابر است با: تعداد آیتمهای موجود در آرایه منهای یک. به این ترتیب اگر آرایهای ۱۰ آیتم داشته باشد، ۱۰امین آیتم در مکان ۹ قرار دارد.
اندازهی آرایه میتواند ثابت یا پویا باشد. یک آرایه با اندازهی ثابت میتواند تعدادی آیتم، که این تعداد از پیش تعیین شده است، داشته باشد. یک آرایه با اندازهی پویا تعداد از پیش تعیین شده ندارد.با افزودن آیتمهای جدید به آرایهای با اندازهی پویا، اندازهی آن افزایش مییابد. میتوانید یک آرایه را با اندازهی ثابت یا پویا تعریف کنید. حتی میتوانید یک آرایه با اندازهی پویا را به آرایه با اندازهی ثابت تغییر دهید.
کد زیر یک آرایه با سه آیتم میسازد. بعد از ساختن آرایه، این سه آیتم مقداردهی شدهاند.
-
رشته (String) در C#
نوع دادهای System.String نشانگر یک رشته در .NET است. یک کلاس String شئای از کلاس System.String است. کلاس String در C# یک رشته را نشان میدهد.
کد زیر سه رشته میسازد که دارای حروف، اعداد و نوع double هستند.
کد زیر مثالی کامل از شیوهی استفاده از string در C# و .NET است.
-
دیکشنری (Dictionary) در C#
یک نوع دیکشنری دارای مجموعهای از جفتِ مقدار (value) و کلید (key) است.
کلاس دیکشنری در System.Collections.Generic namespace ، که یک کلاس generic است، تعریف شده است و تنها انواع مقداری را به صورت جفتِ مقدار و کلید میتواند ذخیره کند.
کلیدهای موجود در یک مجموعه باید منحصر به فرد باشند.
قبل از استفاده از کلاس دیکشنری در کدتان، بایدSystem.Collections.Generic namespace را با استفاده از کد زیر import کنید.
سازندهی کلاس دیکشنری، یک مقدار دادهای را به عنوان کلید و یک مقدار دادهای را به عنوان مقدار میگیرد. هر دو generic هستند، پس میتوان از هر نوع داده در .NET استفاده کرد.
کلاس دیکشنری زیر، یک کلاس generic است و میتواند هر نوع دادهای را ذخیره کند.
کلاس تعریف شده در کد، یک دیکشنری میسازد که هم مقدار و هم کلید، از نوع رشته هستند.
کد زیر آیتمهایی را به دیکشنری اضافه میکند.
۳۷. لیست (List) در C#
کلاس <List<T در C# یک لیست strongly typed از اشیاء را نشان میدهد. <List<T به برنامهنویسان اجازهی ساختن لیستی از اشیاء را میدهد، آنها میتوانند در لیست شئای را پیدا کنند، لیست را مرتب کنند، در لیست جستوجو کنند و آن را تغییر دهند. در List<T>، T نشانگر نوع اشیاء است.
<List<T یک کلاس generic است و در System.Collections.Generic تعریف شده است. برای استفاده از کلاس <List<T در پروژهتان باید System.Collections.Generic را import کنید.
از سازندهی کلاس List<T> برای ساخت لیستی از اشیاء با نوع T اسفاده میشود. سازنده میتواند خالی باشد.
یا میتواند یک عدد صحیح را به عنوان یک آرگومان بگیرد که با نام capacity شناخته میشود و اندازهی اولیهی لیست است. اگر سازنده خالی باشد، اندازهی لیست متغیر درنظر گرفته میشود و با افزودن یک آیتم به لیست، اندازه نیز بیشتر میشود.
همینچنین میتوانید زمان ساخت یک شئ لیست، مجموعهای از المنتهای اولیه را به آن بدهید.
کد زیر یک لیست با نوع Int16 و یک لیست با نوع String میسازد. قسمت آخر کد، یک List<T> با مجموعهای مشخص میسازد.
همانطور که میبینید، capacity یکی از لیستها ۵ است. البته با افزودن المنتهای بیشتر، لیست به صورت خودکار بزرگتر میشود.
خلاصهی مطالب
این آموزش مقدمهای بر زبان برنامهنویسی C# برای مبتدیهاست.
در این آموزش، شیوهی نوشتن اولین برنامهی C# را یاد گرفتیم و با انواع دادهها، کلاس، شئ و اعضای کلاس آشنا شدیم.
منبع: https://faranesh.com
- لینک دانلود فایل بلافاصله بعد از پرداخت وجه به نمایش در خواهد آمد.
- همچنین لینک دانلود به ایمیل شما ارسال خواهد شد به همین دلیل ایمیل خود را به دقت وارد نمایید.
- ممکن است ایمیل ارسالی به پوشه اسپم یا Bulk ایمیل شما ارسال شده باشد.
- پسورد تمامی فایل ها www.bibliofile.ir است.
- در صورتی که به هر دلیلی موفق به دانلود فایل مورد نظر نشدید با ما تماس بگیرید.
- در صورتی که این فایل دارای حق کپی رایت و یا خلاف قانون می باشد ، لطفا به ما اطلاع رسانی کنید.
نقد و بررسیها
هیچ دیدگاهی برای این محصول نوشته نشده است.