درک مفهوم رویدادها در #C
چهارشنبه 10 تیر 1394رویدادها یکی از مفاهیم مهم و کلیدی در محیط برنامه نویسی #C هستند. گاهی فهمیدن آنها بدون یک تفسیر درخور و یا یک مثال دشوار است. مطالعه این مقاله درک مفهوم رویدادها را برای شما آسان خواهد کرد.
به بیان ساده، یک رویداد میتواند یک رخداد و یا عمل باشد، مانند کلیک با موس، فشار برروی یک دکمه از کیبورد، حرکت موس یا پیغام های تولید شده ی سیستم. برنامه های کاربردی می توانند در زمانی که یک رویداد به وقوع پیوست، واکنشی نشان دهند. رویدادها، پیغام هایی هستند که بوسیله شیء برای نشان دادن یک رخداد از رویداد ارسال شده اند. رویدادها متدهای موثری برای فرآیند ارتباط هستند. رویدادها برای یک شیء بسیار کارآمد هستند، زیرا وضعیتی را فراهم می کند که برای کاربری که ممکن است از آن شیء استفاده کند تغییر کند.
اگر جملات بالا برای شما قابل فهم نیست، پس آن ها را برای شما ساده تر خواهیم کرد. اگر برروی یک دکمه در یک فرم توسط کاربر کلیک شود، درنتیجه یک رویداد رخ داده است. همینطور زمانی که یک کاربر درون یک TextBox متنی را می نویسد، کلیدهای کیبورد فشار داده می شوند و در نهایت یک رویداد رخ داده است.
شکل زیر یک نمونه عمومی است رویدادها و مدیریت رویدادها را شرح می دهد.
در #C، از نمایندگان (delegate) به همراه رویدادها برای اجرای مدیریت رویدادها استفاده می شوند. مدل رویداد NET Framework. از نمایندگان برای اتصال پیغام ها با متدهای شناخته شده به عنوان مدیر رویداد استفاده می کند.
بررسی رویداد NET Windows Application Button Click.
Visual Studio را اجرا کنید و برنامه کاربردی تحت ویندوز ایجاد کنید. یک فرم به برنامه خود اضافه کنید و نام آن را Form1.cs بنامید. یک button به فرم بیافزایید. برای خصوصیت آن button، رویداد onclick درج می کنیم. همچنین در بخش دستورات این دکمه، کدهای مربوط برای نمایش یک متن بعد از رویداد کلیک را درج می کنیم. حال که برنامه را اجرا کردید، فرم موردنظر با یک دکمه برای شما به نمایش درخواهد آمد.
همانطور که می بینید، دکمه ای که در Form قرار دارد و بوسیله کاربر کلیک می شود و نتیجه آن نمایش یک پیغام است که توسط نمایندگان مدیریت می شود.
دستورات:
وقتی که فرم Form1.Designer.cs را بررسی می کنیم و مراحلی که در زیر شرح میدهیم را دنبال می کنیم، به راحتی می توانیم رویداد اصلی و نمایندگان اصلی را مشخص کنیم و لذا مشخص جزئیات آنها را مشخص کنیم.
مرحله 1-
فرم Form1.Designer.Cs را از منوی Solution Explorer اجرا کنید.
مرحله 2-
در Form1.Designer.Cs دستورات EventHandler را وارد کنید.
مرحله 3-
برروی button1 دوبار کلیک کنید و دکمه F12 را برای مشاهده جزئیات رویداد کلیک مشاهده کنید.
در زیر جزئیات رویداد را می بینید.
در زیر جزئیات نمایندگان را مشاهده می کنید.
Publisher-Subscriber model
رویدادها در یک کلاس مشخص و مطرح می شوند و با استفاده از نمایندگان درون کلاس یکسان یا کلاس های دیگر با مدیر رویداد مرتبط می شوند. رویدادها بخشی از یک کلاس هستند و کلاس یکسان برای انتشار این رویداد استفاده شده است. کلاس های دیگر می تواننداین رویدادها را بپذیرند یا به عبارت دیگر می توانند برای این رویدادها پذیرفته شوند. رویدادها از publisher و subscriber model استفاده می کنند.
publisher یک شیء است که شامل جزئیات رویدادها و نمایندگان است. رابطه رویداد با نماینده در کلاس publisher مشخص شده است. شیء کلاس publisher، رویدادی که برای اشیاء دیگر اطلاع داده می شود را فراخوانی می کند.
subscriber یک شیء است که رویدادی را میپذیرد و یک مدیر برای رویداد فراهم میکند. نماینده کلاس publisher متدی از کلاس subscriber را فراخوانی میکند. این متد در کلاس subscriber، مدیر رویداد است. publisher و subscriber model اجرا شده میتواند توسط یک کلاس یکسان مشخص می شوند.
تصویر زیر مکانیزم استفاده شده بوسیله شیء publisher و subscriber را نمایش می دهد.
حال به ادامه کار می پردازیم:
یک مثال با موضوع مدیریت رویدادها ایجاد می کنیم. در مثال زیر می بینیم که چگونه می توانیم رویدادهای سفارشی خود را توضیح دهیم، چگونه می توانیم آن ها را ارتقاء دهیم و چگونه می توانیم با استفاده از مدیریت رویداد سفارشی خود، آن را مدیریت کنیم.
در این مثال ساده یک برنامه کنسول ایجاد کردیم که رویداد TransactionMade را که توسط کاربر درخواست شده را ذخیره میکند و پیغامی به کاربر نمایش می دهد.
ابتدا کلاس Account را ایجاد می کنیم.
یک سازنده برای مقداردهی اولیه متغیرهایمان با نوع داده int BalanceAmount به کلاس اضافه می کنیم.
public int BalanceAmount; public Account(int amount) { this.BalanceAmount = amount; }
سپس ما به بررسی رویدادها و نمایندگان خود می پردازیم.
تعریف کامل رویداد در یک کلاس publisher که شامل تعریف نمایندگان و همچنین تعریف رویدادها بر اساس نمایندگان است. کد زیر یک نماینده با نام TransactionHandler و یک رویداد با نام TransactionMade را تعریف میکند که یک TransactionHandler delegate را در زمان اجرا درخواست می کند.
public delegate void TransactionHandler(object sender,TransactionEventArgs e); public event TransactionHandler TransactionMade;
همانطور که میبینید، نام نمایده ما TransactionHandler است و این نشانه شامل یک مقدار void و دو پارامتر از نوع شیء و TransactionEventArgs است. اگر بخواهید از این نماینده در مثال استفاده کنید، تابع پاس داده شده به عنوان پارامتر سازنده باید نشانه یکسان با این نماینده داشته باشد.
زمانی که از یک رویداد استفاده شد، ما تعدادی اطلاعات به subscriber که در یک کلاس مورد استفاده قرار گرفته ارسال می کنیم. برای مثال، در اینجا ما میخواهیم Transaction Amount و نوع Transaction made را فراهم می کنیم. سپس کلاس TransactionEventArgs را تعریف می کنیم که از EventArgs برای ارسال اطلاعات به کلاس subscriber، ارث بری می کند. دو متغیر خصوصی تعریف می کنیم، یکی از نوع int _transactionAmount برای ارسال اطلاعات transaction amount و دیگری از نوع string _transactionType برای ارسال اطلاعات (transaction type (credit/debit به کلاس subscriber.
کدهای زیر تعاریف کلاس ها را شرح می دهد:
public class TransactionEventArgs : EventArgs { private int _transactionAmount; private string _transactionType; public TransactionEventArgs(int amt,string type) { this._transactionAmount = amt; this._transactionType = type; } public int TranactionAmount { get { return _transactionAmount; } } public string TranactionType { get { return _transactionType; } } }
حال، همه چیز در کلاس Account ما هستند. حال ما متدهای پیغام دهنده خود را که با یک transaction اعتباری فراخوانی می شوندرا تعریف می کنیم و رویدادهایمان را ارتقا می دهیم.
در متد Debit، مقادیر متعادل (balance amount) کسر خواهند شد و رویداد برای پیغام subscriber که balance amount آن تغییر کرده است اجرا خواهد شد. به صورت مشابه، در نمونه ای از متد Credit، مقادیر متعادل معتبر خواهند شد و پیغام به کلاس subscriber ارسال خواهد شد.
Debit Method:
public void Debit(int debitAmount) { if (debitAmount < BalanceAmount) { BalanceAmount = BalanceAmount - debitAmount; TransactionEventArgs e = new TransactionEventArgs(debitAmount,"Debited"); OnTransactionMade(e); } }
Credit Method:
public void Credit(int creditAmount) { BalanceAmount = BalanceAmount + creditAmount; TransactionEventArgs e = new TransactionEventArgs(creditAmount,"Credited"); OnTransactionMade(e); }
همانطوری که در مثال قبل دیدید، ما یک نمونه از TransactionEventArgs ایجاد کردیم و آن نمونه را در یک متد ()OnTransactionMade ایجاد نموده و آن را فراخوانی کردیم. ()OnTransactionMade متدی است که رویدادهای ما را اجرا می کند.
protected virtual void OnTransactionMade(TransactionEventArgs e) { if (TransactionMade != null) { TransactionMade(this, e); } }
دستورات زیر کدهای کامل کلاس Account هستند:
namespace EventExample { public delegate void TransactionHandler(object sender,TransactionEventArgs e); class Account { public event TransactionHandler TransactionMade; public int BalanceAmount; public Account(int amount) { this.BalanceAmount = amount; } public void Debit(int debitAmount) { if (debitAmount < BalanceAmount) { BalanceAmount = BalanceAmount - debitAmount; TransactionEventArgs e = new TransactionEventArgs(debitAmount,"Debited"); OnTransactionMade(e); } } public void Credit(int creditAmount) { BalanceAmount = BalanceAmount + creditAmount; TransactionEventArgs e = new TransactionEventArgs(creditAmount,"Credited"); OnTransactionMade(e); } protected virtual void OnTransactionMade(TransactionEventArgs e) { if (TransactionMade != null) { TransactionMade(this, e); } } }
اجرای یک رویداد با فراخوانی رویداد TransactionMade انجام می شود. و این رویداد با مدیریت رویداد ما مدیریت خواهد شد.
حال می خواهیم کلاس Subscriber را که در یک رویداد اثرگذار است را تفسیر کنیم.
ابتدا یک کلاس با نام TestMyEvent ایجاد میکنیم و یک متد SendNotification برای آن مشخص می کنیم، این متد نوع و پارامتری که باید نماینده ما را به کلاس publisher نزدیک میکند. در واقع این متد برروی رویدادی که در مقادیر متعادل ما تغییر کرده است اثرگذار است و کاربر را آگاه می سازد.
private static void SendNotification(object sender, TransactionEventArgs e) { Console.WriteLine("Your Account is {0} for Rs.{1} ", e.TranactionType, e.TranactionAmount); }
حال در متد ()Main از کلاس subscriber یک نمونه ایجاد کنید و مقادیر متعادل اولیه را به آن پاس می دهیم.
private static void Main() { Account MyAccount = new Account(10000); MyAccount.TransactionMade += new TransactionHandler(SendNotification); MyAccount.Credit(500); Console.WriteLine("Your Current Balance is : " + MyAccount.BalanceAmount); Console.ReadLine(); }
کدهای زیر کلاس subscriber را شرح می دهد:
class TestMyEvent { private static void SendNotification(object sender, TransactionEventArgs e) { Console.WriteLine("Your Account is {0} for Rs.{1} ", e.TranactionType, e.TranactionAmount); } private static void Main() { Account MyAccount = new Account(10000); MyAccount.TransactionMade += new TransactionHandler(SendNotification); MyAccount.Credit(500); Console.WriteLine("Your Current Balance is : " + MyAccount.BalanceAmount); Console.ReadLine(); } }
خروجی برنامه:
جمع بندی:
در این مقاله رویدادهای NET. را بررسی کردیم و رویداد رسمی خود را ساختیم و گفتیم که چگونه رویدادها اجرا و مدیریت می شوند.
- C#.net
- 5k بازدید
- 2 تشکر