اثر پروانه ای

برنامه نویسی حرفه ای کامپیوتر به زبان سی شارپ - لیست کامل کلمات کلیدی در ʚĭɞ - ßữʈʨɾflỵ ⓔⓕⓕⓔⓒⓣ

اثر پروانه ای

برنامه نویسی حرفه ای کامپیوتر به زبان سی شارپ - لیست کامل کلمات کلیدی در ʚĭɞ - ßữʈʨɾflỵ ⓔⓕⓕⓔⓒⓣ

اثر پروانه ای

اثر پروانه‌ای نام پدیده‌ای است که به دلیل حساسیت سیستم‌های آشوب‌ناک به شرایط اولیه ایجاد می‌شود. این پدیده به این اشاره می‌کند که تغییری کوچک در یک سیستم آشوب‌ناک چون جو سیارهٔ زمین (مثلاً بال‌زدن پروانه) می‌تواند باعث تغییرات شدید (وقوع توفان در کشوری دیگر) در آینده شود.

ایده‌ٔ این‌که پروانه‌ای می‌تواند باعث تغییری آشوبی شود نخستین بار در ۱۹۵۲ در داستان کوتاهی به نام آوای تندر اثر ری بردبری مطرح شد. عبارت «اثر پروانه ای» هم در ۱۹۶۱ در پی مقاله‌ای از ادوارد لورنتس به وجود آمد. وی در صد و سی و نهمین اجلاس ای‌ای‌ای‌اس در سال ۱۹۷۲ مقاله‌ای با این عنوان ارائه داد که «آیا بال‌زدن پروانه‌ای در برزیل می‌تواند باعث ایجاد تندباد در تکزاس شود؟»

آخرین نظرات
  • ۱۳ بهمن ۰۱، ۱۵:۳۱ - حسنا سادات و سما سادات
    عالی
  • ۱
  • ۰

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

public delegate void EventHandler(object sender, EventArgs e);


نکته
دات نت فریم وورک 2.0 یک نسخه جنریک (عام) از این وکیل را بصورت (EventHandler (of TEventArgs معرفی می کند. مثال های زیر چگونگی استفاده از هر دو نسخه را نشان می دهند.

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

انتشار دادن رویدادهای برپایه الگوی EventHandler

  1. (اگر مجبور نیستید که به همراه رویدادتان داده های سفارشی ارسال کنید، این مرحله را رد کرده و به مرحله 3a بروید.) کلاستان را در قلمروی (scope) که هم توسط کلاس ناشر و هم کلاس متعهد، قابل مشاهده باشد، اعلان کنید و اعضای مورد نیاز را برای نگهداری داده های سفارشی رویداد، اضافه کنید. در این مثال، یک رشته ساده مورد نیاز است.

    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            msg = s;
        }
        private string msg;
        public string Message
        {
            get { return msg; }
        } 
    }
  2. (اگر از نسخه جنریک EventHandler استفاده می نمایید این مرحله را رد کنید.) یک وکیل در کلاس ناشر خود اعلان کنید و به آن یک نام که آخر آن EventHandler باشد بدهید. پارامتر دوم نوع EventArgs سفارشی شما را تعیین می کند.

    public delegate void CustomEventHandler(object sender, CustomEventArgs a);
  3. با استفاده از گام های زیر، رویداد مورد نظر را در کلاس ناشر اعلان کنید.

    1. اگر شما هیچ کلاس سفارشی EventArgs ی ندارید، نوع رویداد شما، وکیل غیرجنریک EventHandler خواهد بود. شما مجبور نیستید که آنرا اعلان کنید، چون قبلا" در فضای نام System تعریف شده است. این فضای نام را در هنگام ساختن پروژه اضافه کرده اید.

      public event EventHandler RaiseCustomEvent;
    2. گر شما از نسخه غیرجنریک EventHandler استفاده می کنید و یک کلاس سفارشی که از EventArgs مشتق شده دارید، رویدادتان را در داخل کلاس ناشر اعلان کرده و از وکیلتان به عنوان نوع آن استفاده کنید:

      class Publisher
      {
          public event CustomEventHandler RaiseCustomEvent;
      }
    3. اگر شما از نسخه جنریک استفاده می کنید، نیازی به استفاده از وکیل سفارشی ندارید. در عوض، نوع رویدادتان را با جایگزین کردن نام کلاس خودتان در علامت های کوچکتر و بزرگتر، بصورت <EventHandler<CustomEventArgs تعیین می کنید.

مثال

مثال زیر گام های قبل را با استفاده از کلاس سفارشی EventArgs و (EventHandler (of TEventArgs به عنوان نوع رویداد، را نشان می دهد.

namespace DotNetEvents
{
    using System;
    using System.Collections.Generic;

    // Define a class to hold custom event info
    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            message = s;
        }
        private string message;

        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }

    // Class that publishes an event
    class Publisher
    {

        // Declare the event using EventHandler<T>
        public event EventHandler<CustomEventArgs> RaiseCustomEvent;

        public void DoSomething()
        {
            // Write some code that does something useful here
            // then raise the event. You can also raise an event
            // before you execute a block of code.
            OnRaiseCustomEvent(new CustomEventArgs("Did something"));

        }

        // Wrap event invocations inside a protected virtual method
        // to allow derived classes to override the event invocation behavior
        protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
        {
            // Make a temporary copy of the event to avoid possibility of
            // a race condition if the last subscriber unsubscribes
            // immediately after the null check and before the event is raised.
            EventHandler<CustomEventArgs> handler = RaiseCustomEvent;

            // Event will be null if there are no subscribers
            if (handler != null)
            {
                // Format the string to send inside the CustomEventArgs parameter
                e.Message += String.Format(" at {0}", DateTime.Now.ToString());

                // Use the () operator to raise the event.
                handler(this, e);
            }
        }
    }

    //Class that subscribes to an event
    class Subscriber
    {
        private string id;
        public Subscriber(string ID, Publisher pub)
        {
            id = ID;
            // Subscribe to the event using C# 2.0 syntax
            pub.RaiseCustomEvent += HandleCustomEvent;
        }

        // Define what actions to take when the event is raised.
        void HandleCustomEvent(object sender, CustomEventArgs e)
        {
            Console.WriteLine(id + " received this message: {0}", e.Message);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub1 = new Subscriber("sub1", pub);
            Subscriber sub2 = new Subscriber("sub2", pub);

            // Call the method that raises the event.
            pub.DoSomething();

            // Keep the console window open
            Console.WriteLine("Press Enter to close this window.");
            Console.ReadLine();

        }
    }
}

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی