فصل 2 از 40 درس 1 از 1

ساختار پایه برنامه در C#

ساختار پایه برنامه در C#

بخشی از آموزش جامع C# و .NET 10

محتوای درس ساختار پایه برنامه در C#

فایل‌ها، Namespace، Class، Method، Statement، Expression و قواعد نام‌گذاری

هر برنامه C# از مجموعه‌ای از اجزای ساختاری تشکیل می‌شود. شناخت نقش فایل‌ها، فضای نام، Typeها، متدها، دستورها و عبارت‌ها باعث می‌شود کد از همان ابتدا منظم، قابل فهم و قابل توسعه نوشته شود.

۱. فایل‌های برنامه در C#

کد C# معمولاً در فایل‌هایی با پسوند cs نگهداری می‌شود. در پروژه‌های واقعی بهتر است هر Type اصلی در فایل مستقل خود قرار گیرد تا ساختار پروژه قابل نگهداری باقی بماند.

public class Product
         {
             public string Name { get; set; } = "";
         }

اگر این کلاس Type اصلی فایل باشد، نام مناسب برای فایل Product.cs است. هماهنگی نام فایل و Type اصلی باعث می‌شود جست‌وجو و مرور پروژه ساده‌تر شود.

۲. ساختار کلی یک برنامه

یک برنامه ساده می‌تواند شامل Namespace، Class، Method و Statement باشد. هر کدام یک سطح مشخص از سازمان‌دهی و اجرای کد را بر عهده دارند.

namespace SampleApp;
         
         internal class Program
         {
             private static void Main()
             {
                 Console.WriteLine("Application started.");
             }
         }

Namespace محدوده نام را مشخص می‌کند، Program یک Class است، Main متد نقطه ورود و Console.WriteLine یک Statement اجرایی داخل متد است.

۳. Namespace

Namespace برای دسته‌بندی Typeها و جلوگیری از تداخل نام استفاده می‌شود. در پروژه‌های بزرگ معمولاً Namespaceها با ساختار ماژول‌ها و پوشه‌های اصلی هماهنگ می‌شوند.

namespace AlborzITCenter.Core;
         
         public class Course
         {
             public string Title { get; set; } = "";
         }

کلاس Course در Namespace با نام AlborzITCenter.Core قرار گرفته است. اگر Namespace دیگری نیز کلاسی با نام Course داشته باشد، نام کامل Type ابهام را برطرف می‌کند.

۴. File-scoped Namespace

در نسخه‌های جدید C# می‌توان Namespace را به‌شکل File-scoped تعریف کرد. این روش یک سطح از تورفتگی را حذف می‌کند و برای فایل‌هایی که تمام Typeهای آن‌ها در یک Namespace هستند مناسب است.

namespace Store.Domain;
         
         public class Customer
         {
             public int Id { get; set; }
             public string Name { get; set; } = "";
         }

علامت semicolon پس از Namespace نشان می‌دهد تمام محتوای بعدی فایل در همان Namespace قرار دارد.

۵. Class

Class قالب تعریف یک موجودیت یا رفتار است. کلاس می‌تواند Field، Property، Method، Constructor و اعضای دیگری داشته باشد.

public class Product
         {
             public string Name { get; set; } = "";
             public decimal Price { get; set; }
         
             public void PrintInfo()
             {
                 Console.WriteLine($"{Name} - {Price}");
             }
         }

در این مثال Product دو Property و یک Method دارد. Propertyها وضعیت شیء و Method رفتار آن را نمایش می‌دهند.

۶. Object

Object نمونه‌ای از یک Class است. پس از ساخت شیء، مقادیر Propertyها و رفتار تعریف‌شده در Methodهای آن قابل استفاده هستند.

var product = new Product
         {
             Name = "Laptop",
             Price = 75_000_000m
         };
         
         product.PrintInfo();

کلیدواژه new نمونه جدیدی از Product ایجاد می‌کند. Object Initializer نیز مقداردهی Propertyها را در زمان ساخت شیء خواناتر می‌کند.

۷. Method

Method مجموعه‌ای از دستورات است که یک وظیفه مشخص را انجام می‌دهد. متد می‌تواند ورودی دریافت کند و در صورت نیاز مقداری برگرداند.

static int Add(int firstNumber, int secondNumber)
         {
             return firstNumber + secondNumber;
         }
         
         int result = Add(10, 20);
         Console.WriteLine(result);

Add دو Parameter دریافت می‌کند و نتیجه جمع را با return برمی‌گرداند. مقدار برگشتی در متغیر result ذخیره می‌شود.

۸. Statement

Statement یک دستور کامل اجرایی است و معمولاً با semicolon پایان می‌یابد. تعریف متغیر، انتساب مقدار و فراخوانی متد نمونه‌هایی از Statement هستند.

int count = 5;
         count = count + 1;
         Console.WriteLine(count);

هر خط بالا یک Statement مستقل است. ترتیب Statementها بر نتیجه نهایی اجرای برنامه اثر مستقیم دارد.

۹. Expression

Expression ترکیبی از مقادیر، متغیرها، Operatorها یا فراخوانی‌ها است که یک مقدار تولید می‌کند. Expression معمولاً بخشی از یک Statement بزرگ‌تر است.

int price = 100;
         int quantity = 3;
         
         int total = price * quantity;
         bool hasDiscount = total > 250;

عبارت price * quantity مقدار عددی تولید می‌کند و عبارت total > 250 یک مقدار bool برمی‌گرداند.

۱۰. Comment

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

// Calculate final price after applying discount.
         decimal price = 1_000_000m;
         decimal discount = 0.10m;
         
         decimal finalPrice = price - (price * discount);
         Console.WriteLine(finalPrice);

Comment بالا دلیل محاسبه را بیان می‌کند. Commentهایی که صرفاً همان کد را با کلمات دیگر تکرار می‌کنند ارزش نگهداری کمی دارند.

۱۱. قواعد نام‌گذاری

نام‌گذاری یکنواخت بخش مهمی از خوانایی کد است. در C# معمولاً برای Class، Method و Property از PascalCase و برای متغیرها و Parameterها از camelCase استفاده می‌شود.

public class OrderService
         {
             public decimal CalculateTotal(decimal unitPrice, int quantity)
             {
                 decimal totalPrice = unitPrice * quantity;
                 return totalPrice;
             }
         }

OrderService، CalculateTotal و Propertyها یا Typeهای عمومی با PascalCase نام‌گذاری می‌شوند؛ unitPrice، quantity و totalPrice نیز camelCase هستند.

۱۲. Scope مقدماتی

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

int outerValue = 10;
         
         if (outerValue > 5)
         {
             int innerValue = 20;
             Console.WriteLine(innerValue);
         }
         
         Console.WriteLine(outerValue);

outerValue در کل محدوده متد قابل دسترسی است، اما innerValue فقط داخل بلوک if معتبر است. Scope در فصل اختصاصی خود با جزئیات بیشتری بررسی خواهد شد.

۱۳. خطاهای رایج

• قرار دادن تعداد زیادی Class مستقل در یک فایل بدون دلیل.

• انتخاب نام‌هایی مانند x، temp و data برای مفاهیمی که نام دقیق‌تری دارند.

• نوشتن Methodهای بسیار طولانی که چند مسئولیت متفاوت را انجام می‌دهند.

• استفاده از Comment برای توضیح کدی که با نام‌گذاری بهتر قابل فهم است.

// Weak naming
         int x = 500;
         
         // Better naming
         int maximumRetryCount = 500;

در مثال دوم بدون نیاز به Comment مشخص است مقدار 500 چه مفهومی دارد. نام‌گذاری صحیح بخشی از طراحی کد است، نه صرفاً یک موضوع ظاهری.

۱۴. سناریوی عملی فصل

یک برنامه ساده برای نمایش اطلاعات یک دوره آموزشی ایجاد کنید. مدل باید در یک Class مستقل تعریف شود و برنامه با ساخت Object و فراخوانی Method اطلاعات را نمایش دهد.

namespace CourseCatalog;
         
         public class Course
         {
             public string Title { get; set; } = "";
             public int DurationHours { get; set; }
         
             public void PrintSummary()
             {
                 Console.WriteLine($"{Title} - {DurationHours} hours");
             }
         }
         
         public static class Program
         {
             public static void Main()
             {
                 var course = new Course
                 {
                     Title = "C# Programming",
                     DurationHours = 60
                 };
         
                 course.PrintSummary();
             }
         }

این سناریو Namespace، Class، Property، Method، Object، Statement و Expression را در یک مثال یکپارچه کنار هم قرار می‌دهد.

۱۵. تمرین

کلاس Book را با Propertyهای Title، Author و Price ایجاد کنید. سپس متدی با نام PrintInfo بسازید که مشخصات کتاب را نمایش دهد و در Main دو نمونه متفاوت از Book ایجاد و چاپ کنید.

public class Book
         {
             public string Title { get; set; } = "";
             public string Author { get; set; } = "";
             public decimal Price { get; set; }
         
             public void PrintInfo()
             {
                 Console.WriteLine($"{Title} - {Author} - {Price}");
             }
         }

برای تکمیل تمرین، ساخت Objectها و فراخوانی PrintInfo را در Main انجام دهید و نام متغیرها را مطابق قواعد نام‌گذاری این فصل انتخاب کنید.

۱۶. جمع‌بندی

ساختار پایه برنامه C# از فایل‌ها، Namespaceها، Typeها، Methodها، Statementها و Expressionها تشکیل می‌شود. درک دقیق این اجزا باعث می‌شود مباحث بعدی مانند متغیرها، ساختارهای کنترلی و برنامه‌نویسی شی‌گرا روی یک پایه منظم و قابل فهم بنا شوند.