دانلود نرم افزار - آموزش سی شارپ
دانلود نرم افزار - آموزش سی شارپ

دانلود نرم افزار - آموزش سی شارپ

آموزش سی شارپ 7 ( ساختارهای کنترلی )

در سی شارپ دو دسته ساختار کنترلی بسیار مفید و پرکاربرد وجود دارد

دسته‌ی اول: حلقه‌ها (Loops)

شامل :

for

foreach

while

do-while

 دسته‌ی دوم: ساختارهای تصمیم‌گیری (Decision-Making Structures)

شامل :

If

If – else

If – else if – else

Switch – case

 هنگام استفاده از ساختارهای کنترلی بالا گاهی اوقات می توانیم از "دستورات کنترل جریان" (Control Flow Statements)   که شامل موارد زیر می باشند نیز استفاده کنیم .

break  : به این دستور گاهی «دستور قطع» یا «Break Statement» می‌گویند، زیرا اجرای حلقه یا ساختار کنترلی مثل switch-case را به طور کامل متوقف کرده و کنترل را به خارج از آن منتقل می‌کند.

continue  : به این دستور معمولاً «دستور ادامه» یا «Continue Statement» می‌گویند، زیرا باعث می‌شود اجرای دور فعلی حلقه متوقف شود و مستقیماً به دور بعدی حلقه برود.

 در ادامه با 10 مثال انواع مختلف ساختارهای کنترلی را بیان می کنیم .

 ۱. ساختار شرطی (if) : برای اجرای کد در صورت برقراری یک شرط.

int age = 6;

if (age >= 6)

{

    Console.WriteLine("شما مجاز به ثبت نام در دبستان هستید.");

}

۲. ساختار شرطی (if-else) : برای اجرای یک بلوک کد در صورت برقراری شرط و بلوک دیگر در صورت عدم برقراری شرط.

int age = 16;

if (age >= 18)

{

    Console.WriteLine("شما مجاز به رای دادن هستید.");

}

else

{

    Console.WriteLine("شما مجاز به رای دادن نیستید.");

}

۳. ساختار شرطی (if-else if-else) : برای بررسی چندین شرط.

int score = 85;

if (score >= 90)

{

    Console.WriteLine("نمره شما A است.");

}

else if (score >= 80)

{

    Console.WriteLine("نمره شما B است.");

}

else

{

    Console.WriteLine("نمره شما C است.");

}

۴. ساختار تکرار (for) : برای تکرار یک بلوک کد به تعداد مشخصی.

for (int i = 0; i < 5; i++)

{

    Console.WriteLine("شمارش: " + i);

}

۵. ساختار تکرار (while) : برای تکرار یک بلوک کد تا زمانی که یک شرط برقرار باشد.

int count = 0;

while (count < 5)

{

    Console.WriteLine("شمارش: " + count);

    count++;

}

۶. ساختار تکرار (do-while) : برای اجرای یک بلوک کد حداقل یک بار و سپس تکرار آن تا زمانی که شرط برقرار باشد.

int count = 0;

do

{

    Console.WriteLine("شمارش: " + count);

    count++;

} while (count < 5);

۷. ساختار کنترل (break) : برای خروج از حلقه‌های تکرار.

for (int i = 0; i < 10; i++)

{

    if (i == 5)

    {

        break;

    }

    Console.WriteLine(i);

}

۸. ساختار کنترل (continue) : برای رد شدن از بقیه کد در یک تکرار و رفتن به تکرار بعدی.

for (int i = 0; i < 5; i++)

{

    if (i == 2)

    {

        continue;

    }

    Console.WriteLine(i);

}

۹. ساختار کنترل (switch) : برای انتخاب یکی از چندین بلوک کد بر اساس مقدار یک متغیر.

int day = 3;

switch (day)

{

    case 1:

        Console.WriteLine("شنبه");

        break;

    case 2:

        Console.WriteLine("یکشنبه");

        break;

    case 3:

        Console.WriteLine("دوشنبه");

        break;

    default:

        Console.WriteLine("روز نامعتبر");

        break;

}

۱۰. ساختار کنترل (return) : برای بازگشت از یک تابع و خاتمه اجرای آن.

int Add(int a, int b)

{

    return a + b;

}

int result = Add(5, 3);

Console.WriteLine("نتیجه: " + result);

این مثال‌ها مفاهیم پایه‌ای ساختارهای کنترلی در سی‌شارپ را نشان می‌دهند.

 

آموزش سی شارپ 8 ( مفهوم دلیگیت )

مفهوم دلیگیت (Delegate) در سی‌شارپ به زبانی ساده :

با درود امروز می‌خواهیم با یه مفهوم کاربردی در سی‌شارپ آشنا بشیم که اسمش دلیگیت (Delegate) هست. فکر کنید دلیگیت مثل یه "پیک موتوری" توی دنیای برنامه‌نویسیه که کارش اینه که تابع رو براتون ببره و هرجا که گفتید تحویل بده! این پیک موتوری فقط همون کاری رو انجام می‌ده که شما بهش سفارش دادید، نه بیشتر و نه کمتر. بیاید این مفهوم رو با یه داستان یاد بگیریم.

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

از نظر فنی، دلیگیت یه نوع داده (Type) خاص تو سی‌شارپه که می‌تونه به یه تابع اشاره کنه. مثل یه اشاره‌گر (Pointer) عمل می‌کنه، ولی خیلی امن‌تر و شیک‌تره. شما اول دلیگیت رو تعریف می‌کنید و می‌گید که چه شکلی تابع‌ها رو قبول می‌کنه (مثلاً ورودی و خروجی تابع چی باشه)، بعد هر تابعی که این شکل رو داشته باشه می‌تونه به دلیگیت وصل بشه. این قابلیت باعث می‌شه کدتون انعطاف‌پذیر بشه، چون می‌تونید تابع‌ها رو مثل لِگو به جاهای مختلف وصل کنید و جدا کنید!

به مثال رستوران برمی گردیم فرض کنید توی رستوران دو نوع غذا داریم: کباب و پیتزا. می‌خواهیم یه دلیگیت بسازیم که سفارش مشتری رو به آشپز برسونه:

using System;

class Program

{

    // تعریف دلیگیت: یه پیک موتوری که فقط اسم غذا رو می‌بره و تحویل می‌ده

    delegate void FoodOrder(string foodName);

    static void Main(string[] args)

    {

        // ساختن یه دلیگیت به اسم waiter (گارسون)

        FoodOrder waiter;

        // وصل کردن دلیگیت به تابع پخت کباب

        waiter = CookKebab;

        Console.WriteLine("سفارش مشتری اول:");

        waiter("کباب کوبیده"); // گارسون می‌ره کباب رو سفارش می‌ده

        // حالا وصل کردن دلیگیت به تابع پخت پیتزا

        waiter = CookPizza;

        Console.WriteLine("سفارش مشتری دوم:");

        waiter("پیتزا مارگاریتا"); // گارسون حالا پیتزا رو سفارش می‌ده

        // می‌تونیم چند تابع رو با هم وصل کنیم (Multicast)

        waiter = CookKebab;

        waiter += CookPizza; // گارسون حالا دوتا کار رو با هم انجام می‌ده

        Console.WriteLine("سفارش مشتری سوم:");

        waiter("کباب و پیتزا با هم!");

    }

    // تابع پخت کباب

    static void CookKebab(string foodName)

    {

  Console.WriteLine($"آشپز داره {foodName} رو آماده می‌کنه. صبر کن داغ و تازه برسه!");

    }

    // تابع پخت پیتزا

    static void CookPizza(string foodName)

    {

 Console.WriteLine($"آشپز داره {foodName} رو توی فر می‌ذاره. بوی خوبش داره میاد!");

    }

}

خروجی این کد:

سفارش مشتری اول:

آشپز داره کباب کوبیده رو آماده می‌کنه. صبر کن داغ و تازه برسه!

سفارش مشتری دوم:

آشپز داره پیتزا مارگاریتا رو توی فر می‌ذاره. بوی خوبش داره میاد!

سفارش مشتری سوم:

آشپز داره کباب و پیتزا با هم! رو آماده می‌کنه. صبر کن داغ و تازه برسه!

آشپز داره کباب و پیتزا با هم! رو توی فر می‌ذاره. بوی خوبش داره میاد!

آموزش سی شارپ 9 ( مفاهیم اصلی برنامه نویسی شی گرا )

در این پست مفاهیم اصلی برنامه نویسی شی گرا رو نام برده و بطور ساده بیان می کنیم  که هر کدام در چه شرایطی می تونن به ما کمک کنن تا بتونیم کاری رو که به نظر غیر ممکن میاد رو انجام بدیم.

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

  1 . کپسوله‌سازی (Encapsulation): اگه بخواهیم یه چیزی رو مخفی کنیم و فقط به شکلی که خودمون می‌خواهیم در دسترس بذاریم، از کپسوله‌سازی استفاده می‌کنیم. مثلاً تو برنامه مدیریت دانشجوها، فرض کنید نمی‌خواهیم کسی بتونه مستقیماً نمره یه دانشجو رو تغییر بده و فقط از طریق یه متد خاص با شرط (مثلاً نمره بین 0 تا 20) این کار رو بکنه. اینجا با تعریف فیلدهای خصوصی (مثل private int score) و پراپرتی‌ها با get و set، این کنترل رو به دست می‌گیریم. این کار باعث می‌شه کد امن‌تر بشه و جلوی اشتباهات رو بگیره.

  2 . ارث‌بری (Inheritance): حالا اگه بخواهیم یه کار به‌ظاهر غیرممکن مثل مدیریت همزمان دانشجوها، استادها و کارمندها رو تو یه سیستم انجام بدیم، از ارث‌بری استفاده می‌کنیم. مثلاً یه کلاس پایه به اسم Person می‌سازیم که ویژگی‌های مشترک مثل اسم و کد ملی رو داره. بعد کلاس‌های Student، Professor و Employee ازش ارث می‌برن و هر کدوم ویژگی‌های خاص خودشون (مثل نمره برای دانشجو یا حقوق برای کارمند) رو اضافه می‌کنن. اینجوری بدون اینکه کد تکراری بنویسیم، همه رو با یه ساختار منظم مدیریت می‌کنیم.

  3 . چندریختی (Polymorphism): فرض کنید می‌خواهیم یه کار عجیب بکنیم: یه تابع بنویسیم که بتونه برای هر نوع موجود (دانشجو، استاد، کارمند) یه پیام خاص چاپ کنه، بدون اینکه برای هر کدوم یه تابع جدا بنویسیم. اینجا چندریختی به کمکمون میاد. با تعریف یه متد مجازی (virtual) تو کلاس Person مثل PrintRole() و اورراید کردنش تو کلاس‌های فرزند، هر شیء خودش تصمیم می‌گیره چه پیامی نشون بده. مثلاً student.PrintRole() می‌گه "من دانشجوام" و professor.PrintRole() می‌گه "من استادیارم". این انعطاف‌پذیری واقعاً شگفت‌انگیزه!

  4 . انتزاع (Abstraction): اگه بخواهیم پیچیدگی‌ها رو کم کنیم و فقط چیزای مهم رو نشون بدیم، از انتزاع استفاده می‌کنیم. مثلاً فرض کنید می‌خواهیم یه سیستم پرداخت آنلاین بسازیم که هم با کارت بانکی کار کنه هم با کیف پول دیجیتال. یه کلاس انتزاعی یا اینترفیس به اسم IPayment تعریف می‌کنیم که فقط متد Pay() رو مشخص می‌کنه. حالا هر نوع پرداخت (مثل CreditCardPayment یا DigitalWalletPayment) خودش جزئیاتش رو پیاده‌سازی می‌کنه، و ما فقط با Pay() کارمون رو پیش می‌بریم بدون اینکه درگیر پیچیدگی‌ها بشیم.

  6 - 5  . کلاس‌ها و اشیا (Classes and Objects): پایه همه این کارها کلاس‌ها و اشیائند. مثلاً می‌خواهیم یه بازی بسازیم که توش شخصیت‌ها، سلاح‌ها و دشمن‌ها باشن. برای هر کدوم یه کلاس تعریف می‌کنیم (مثل Player، Weapon، Enemy) و با ساختن اشیا از این کلاس‌ها، دنیای بازیمون رو زنده می‌کنیم. هر شیء می‌تونه ویژگی‌ها و رفتارهای خاص خودش رو داشته باشه، مثلاً یه بازیکن با قدرت 50 و یه سلاح با Damage 20.

   7 . پیام‌رسانی (Messaging): این مفهوم وقتی به کار میاد که بخواهیم اشیا با هم حرف بزنن. مثلاً تو همون بازی، اگه بازیکن به دشمن حمله کنه، شیء Player یه پیام (فراخوانی متد) به شیء Enemy می‌فرسته که مثلاً TakeDamage(20) رو اجرا کنه. اینجوری اشیا با هم تعامل می‌کنن و کارای پیچیده مثل نبرد رو ممکن می‌کنن.

  8 . ارتباط و وابستگی (Association/Dependency): اگه بخواهیم یه سیستم بزرگ‌تر بسازیم که بخش‌هاش به هم وصل باشن، از این مفهوم استفاده می‌کنیم. مثلاً تو یه برنامه فروشگاهی، کلاس Order به کلاس Customer وابسته‌ست چون هر سفارش مال یه مشتریه. یا تو بازی، Player به Weapon وابسته‌ست چون بازیکن بدون سلاح نمی‌تونه حمله کنه. این ارتباط‌ها باعث می‌شه سیستم ما مثل یه پازل کامل کار کنه.

  9 . اینترفیس (Interface): اگه بخواهیم یه کار به‌ظاهر غیرممکن مثل وصل کردن بخش‌های مختلف برنامه رو بدون اینکه به جزئیاتشون گیر کنیم انجام بدیم، از اینترفیس استفاده می‌کنیم. فرض کنید می‌خواهیم یه سیستم پخش موسیقی بسازیم که هم با بلندگوهای بلوتوثی کار کنه، هم با هدفون سیمی، هم با یه دستگاه پخش ماشین. یه اینترفیس به اسم IPlayable تعریف می‌کنیم که فقط متد Play() رو مشخص کنه. حالا هر دستگاه (مثل BluetoothSpeaker یا WiredHeadphones) این اینترفیس رو پیاده‌سازی می‌کنه و خودش تصمیم می‌گیره چطور صدا رو پخش کنه. اینجوری کد ما انعطاف‌پذیر می‌شه و می‌تونیم بدون تغییر برنامه اصلی، دستگاه‌های جدید رو بهش اضافه کنیم. این قدرت انتزاع و استانداردسازی واقعاً ذهن آدم رو درگیر می‌کنه که چطور یه ایده ساده این همه کار رو ساده می‌کنه!

 10 . سطوح دسترسی (Access Modifiers): حالا اگه بخواهیم یه سیستم امن و منظم بسازیم که هرکسی نتونه به هر بخشش دست بزنه، از سطوح دسترسی مثل public، private، protected و internal استفاده می‌کنیم. مثلاً تو یه برنامه بانکی، می‌خواهیم موجودی حساب مشتری فقط از طریق یه متد خاص (مثل برداشت یا واریز) تغییر کنه و کسی مستقیم بهش دسترسی نداشته باشه. با تعریف فیلد private decimal balance و یه متد عمومی مثل public void Withdraw(decimal amount) که شرط‌های لازم (مثل کافی بودن موجودی) رو چک کنه، این کار رو ممکن می‌کنیم. یا مثلاً تو یه پروژه تیمی، با internal یه کلاس رو فقط برای همون اسمبلی نگه می‌داریم تا بقیه پروژه‌ها بهش دست نزنن. این کنترل دسترسی باعث می‌شه کد ما هم قابل‌اعتمادتر بشه، هم ساختارش شفاف‌تر بمونه.


 با این مفاهیم، شما می‌تونید کارهایی بکنید که شاید اولش غیرممکن به نظر بیاد. مثلاً یه برنامه بسازید که خودش تصمیم بگیره کی تخفیف بده، یا یه رابط کاربری که با یه کلیک کلی کار انجام بده. C# و شی‌گرایی بهتون این قدرت رو می‌دن که ایده‌هاتون رو به شکلی منظم و قابل‌مدیریت به کد تبدیل کنید. هر کدوم از این مفاهیم مثل یه ابزار توی جعبه‌ابزار شماست که بسته به نیازتون می‌تونید ازش استفاده کنید تا دنیای دیجیتال رو اونجوری که می‌خواهید بسازید!

آموزش سی شارپ 10 ( گرافیک )

بیایید تفاوت بین

 Graphics g = this.CreateGraphics();

و

 Graphics g = e.Graphics;

رو به‌صورت کامل و با جزئیات بررسی کنیم و ببینیم هر کدوم تو چه شرایطی مناسب‌ترن. این دو روش برای دسترسی به شیء Graphics توی Windows Forms استفاده می‌شن که ابزاری برای ترسیم اشکال، خطوط، متن و تصاویر روی فرم یا کنترل‌هاست. اما کاربرد و نحوه کارشون با هم فرق داره.

Graphics g = this.CreateGraphics();

توضیح:

این خط یه شیء Graphics جدید رو مستقیماً از فرم  یا هر کنترل دیگه‌ای که this بهش اشاره می‌کنه  ایجاد می‌کنه.

CreateGraphics()

یه متد از کلاس Control هست که هر بار که فراخوانی می‌شه، یه نمونه تازه از Graphics می‌سازه و به شما اجازه می‌ده روی سطح فرم چیزی ترسیم کنید.

این شیء به رویدادهای ترسیم سیستم  مثل Paint وابسته نیست ( ما وابسته نیستیم)و شما خودتون کنترلش می‌کنید.

نحوه کار:

وقتی از

 CreateGraphics()

استفاده می‌کنید، ترسیم‌هایی که انجام می‌دید موقتی هستن. یعنی اگه فرم نیاز به بازنقاشی پیدا کنه  مثلاً وقتی پنجره رو جابه‌جا می‌کنید، کوچکش می‌کنید، یا یه پنجره دیگه روش رو می‌پوشونه و بعد کنار می‌ره ، چیزایی که با این روش کشیدید پاک می‌شن، چون این ترسیم‌ها توی حافظه دائمی رندر فرم ذخیره نمی‌شن. برای نگه داشتن ترسیم‌ها، باید هر بار که فرم بازنقاشی می‌شه، خودتون دوباره کد ترسیم رو اجرا کنید.

مثال:

private void button1_Click(object sender, EventArgs e)

{

    Graphics g = this.CreateGraphics();

    g.DrawRectangle(new Pen(Color.Red), 10, 10, 100, 50);

}

اینجا با کلیک روی دکمه، یه مستطیل قرمز کشیده می‌شه. ولی اگه فرم رو minimize کنید و دوباره برگردونید، مستطیل غیبش می‌زنه!

پس این روش مناسب چه شرایطی است ؟

ترسیم‌های موقتی و فوری: مثلاً وقتی می‌خواهید یه پیش‌نمایش سریع (مثل یه خط یا شکل) نشون بدید که نیازی به دائمی بودنش نیست.

ترسیم در پاسخ به رویدادهای کاربر: مثل وقتی که کاربر با ماوس چیزی می‌کشه و شما فقط می‌خواهید همون لحظه نشونش بدید (مثل یه برنامه نقاشی ساده).

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

معایب:

عدم پایداری: ترسیم‌ها با هر بازنقاشی فرم پاک می‌شن، مگه اینکه خودتون توی رویداد Paint دوباره بکشیدشون.

مصرف منابع: هر بار که CreateGraphics() رو صدا می‌زنید، یه شیء جدید ساخته می‌شه که اگه زیاد استفاده بشه، می‌تونه عملکرد رو پایین بیاره.

نیاز به مدیریت دستی: باید خودتون حواستون باشه که شیء Graphics رو با Dispose() آزاد کنید( اگه خارج از Paint استفاده می‌کنید)، وگرنه ممکنه مشکل حافظه پیش بیاد.

 

Graphics g = e.Graphics;

توضیح:

این خط از شیء Graphicsای استفاده می‌کنه که توسط سیستم توی رویداد Paint یا رویدادهای مشابه مثل OnPaint به شما داده شده.

e  یه آرگومان از نوع PaintEventArgs هست که شامل اطلاعات ترسیم (مثل ناحیه‌ای که باید بازنقاشی بشه) و یه نمونه آماده از Graphics است.

این شیء به سیستم رندرینگ فرم وصله و بخشی از فرآیند بازنقاشی ویندوزه.

نحوه کار:

وقتی از e.Graphics استفاده می‌کنید، ترسیم‌هاتون به‌صورت خودکار با چرخه بازنقاشی فرم هماهنگ می‌شن. یعنی هر وقت فرم نیاز به ترسیم دوباره داشته باشه (مثلاً بعد از تغییر اندازه یا باز شدن)، کد توی Paint دوباره اجرا می‌شه و اشکال شما حفظ می‌شن.

سیستم خودش مدیریت منابع رو انجام می‌ده و نیازی نیست شما Dispose() کنید، چون e.Graphics توسط رویداد کنترل می‌شه.

مثال:

private void Form1_Paint(object sender, PaintEventArgs e)

{

    Graphics g = e.Graphics;

    g.DrawRectangle(new Pen(Color.Red), 10, 10, 100, 50);

}

اینجا مستطیل قرمز هر بار که فرم بازنقاشی می‌شه کشیده می‌شه و پاک نمی‌شه، چون به رویداد Paint وصل شده.

این روش مناسب چه شرایطی است ؟

ترسیم‌های دائمی: وقتی می‌خواهید چیزی رو روی فرم بکشید که همیشه دیده بشه، مثل کادرها، نمودارها یا آیکن‌ها.

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

بهینه‌سازی: چون از سیستم بازنقاشی ویندوز استفاده می‌کنه، بهینه‌تره و نیازی به مدیریت دستی منابع نداره.

معایب:

وابستگی به رویداد: فقط توی رویداد Paint یا OnPaint می‌تونید ازش استفاده کنید و نمی‌تونید خارج از این رویداد بهش دسترسی داشته باشید.

عدم انعطاف برای ترسیم لحظه‌ای: برای ترسیم‌های سریع و موقتی (مثل واکنش به کلیک ماوس) باید یه راه دیگه پیدا کنید یا با Invalidate() رویداد Paint رو دستی فراخوانی کنید.

تفاوت‌های کلیدی

ویژگی                                     this.CreateGraphics()                                      e.Graphics

منبع                                         مستقیماً از فرم یا کنترل ساخته می‌شه                    از رویداد Paint تأمین می‌شه

پایداری ترسیم                        موقتی (با بازنقاشی پاک می‌شه)                               دائمی (با هر بازنقاشی تکرار می‌شه)

محل استفاده                           هر جایی (مثل رویدادهای کلیک)                           فقط توی رویداد Paint

مدیریت منابع                         نیاز به Dispose() داره اگه دستی باشه                  خودکار توسط سیستم مدیریت می‌شه

بهینه‌سازی                               کمتر بهینه (ایجاد شیء جدید هر بار)                     بهینه‌تر (استفاده از سیستم رندر)

آموزش سی شارپ 11 ( ارتباط بین فرم و کلاس روش اول )

ارتباط بین فرم و کلاس با استفاده از Property

فرض کنید برنامه‌ای دارید که در آن، وضعیت یک چک‌باکس (CheckBox) تعیین می‌کند که کدام بخش از کد در کلاس شما اجرا شود. به طور مستقیم نمی‌توانید از داخل کلاس به کنترل‌های موجود در فرم دسترسی داشته باشید.

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

برای این کار، در کلاس خود یک Property ایجاد می‌کنیم. این Property به عنوان یک رابط بین فرم و کلاس عمل می‌کند. فرم می‌تواند مقدار این Property  را   true  یا false  تعیین کند و کلاس می‌تواند بر اساس این مقدار، تصمیم‌گیری کند.

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

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

کد کلاس:

internal class MyClass
{
private bool _isChecked; // فیلد پشتیبان

public bool IsChecked // Property برای دریافت و تنظیم وضعیت چک‌باکس

{

    get { return _isChecked; }

    set { _isChecked = value; }

}

public string GetStatusText() // متد برای برگرداندن وضعیت به صورت متن

{

    if (_isChecked)

    {

        return "تیک خورده";

    }

    else

    {

        return "تیک نخورده";

    }

}

}

نحوه استفاده از کلاس در رویداد کلیک یک دکمه (Button) با فرض وجود یک چک‌باکس (CheckBox) روی فرم:

private void button1_Click(object sender, EventArgs e)
{
MyClass testClass = new MyClass(); // ایجاد نمونه از کلاس

// تنظیم مقدار Property با استفاده از وضعیت چک‌باکس

testClass.IsChecked = checkBox1.Checked;

// استفاده از متد برای نمایش وضعیت چک‌باکس

label1.Text = testClass.GetStatusText();

}

توضیحات :

ابتدا نمونه ای از کلاس  MyClass ایجاد می‌کنیم. سپس، با استفاده از پراپرتی  IsChecked، وضعیت چک‌باکس را به کلاس منتقل می‌کنیم. از این به بعد، کلاس می‌تواند با استفاده از فیلد _isChecked به وضعیت چک‌باکس دسترسی داشته باشد.

برای بررسی صحت عملکرد کد، می‌توانیم از متد GetStatusText استفاده کرده و وضعیت چک‌باکس را در یک Label نمایش دهیم.