اثر پروانه ای

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

مشخصات بلاگ
اثر پروانه ای

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

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

آخرین نظرات
  • ۱۱ بهمن ۹۵، ۱۷:۱۸ - فاروق کریمی زاده
    خوب بود.
اثر پروانه ای

۱۳ مطلب در آذر ۱۳۹۱ ثبت شده است

با سلام!

مطلبی رو که امروز براتون آماده کردم. یه کم با مطالب قبلی تفاوت داره. احتمالا یه کم پیچیده تر.


ترمینولوژی:

Variant : چیزی که به چیزهای دیگر وابستگی دارد اما دقیقا مشابه نیست، گوناگون، متغیر

پیشوند Contra : ضد، مخالف، نقیض

پیشوند Co : با، باهم


برای پارامترهای نوع Generic (عام)، کلمه کلیدی in تعیین می کند که پارامتر آن نوع عام Contravariant است. شما می توانید از این کلمه کلیدی (in) در رابط های (Interface) عام و نماینده ها (delegate) استفاده کنید.

کنتراواریانس این توانایی رو به شما می دهد که از نوع کمتر مشتق شده (پایه ای تر، ریشه ای تر) نسبت به آن نوعی که پارامتر generic تعیین کرده استفاده کنید. که اجازه تبدیل ضمنی کلاس هایی که اینترفیس های گوناگون را پیاده سازی کرده اند را می دهد.

سلام!

کلمه کلیدی implicit برای اعلان کردن عملگر کاربر-تعریف تبدیل نوع (Casting) استفاده می شود. برای فعال کردن تبدیل نوع ضمنی بین یک نوع کاربر-تعریف و یک نوع دیگر، اگر این تبدیل تضمین می کند که هیچ تخریب داده ای اتفاق نمی افتد، استفاده می شود.

class Digit
{
    public Digit(double d) { val = d; }
    public double val;
    // ...other members
    // User-defined conversion from Digit to double
    public static implicit operator double(Digit d)
    {
        return d.val;
    }
    //  User-defined conversion from double to Digit
    public static implicit operator Digit(double d)
    {
        return new Digit(d);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Digit dig = new Digit(7);
        //This call invokes the implicit "double" operator
        double num = dig;
        //This call invokes the implicit "Digit" operator
        Digit dig2 = 12;
        Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);
        Console.ReadLine();
    }
}

  • تبدیل های ضمنی با حذف قالب ریزی های (cast) غیرضروری، می توانند خوانایی برنامه و کد منبع را افزایش دهند. هرچند چون تبدیلات ضمنی، برنامه نویسان را در قالب ریزی صریح از یک نوع به نوع دیگر مجبور نمی کند، برای جلوگیری از نتایج ناخواسته باید مواظب بود.
  • در کل عملگر تبدیل نوع ضمنی، هرگز نباید استثنایی را پرتاب کند و هرگز نباید اطلاعات را از بین ببرد یا در آنها خدشه ای ایجاد کند، تا بتواند بصورت امن و بدون مواظبت برنامه نویس استفاده شود.
  • اگر یک عملگر تبدیل نتواند شرایط بالا را فراهم کند باید بصورت explicit تعریف شود.

سلام! امروز با توضیح مختصری از بیان یا به اصطلاح statement تکرار کننده foreach در خدمتتون هستم. در این مقاله و مقالات دیگری که در همین وبلاگ قرار دارند، منظور من از کلمه "بیان" همان statement هست.

گروهی از دستورهای جاسازی شده درون خود را برای هرکدام از عناصر آرایه ای، یا شئ کلکسیونی ای که رابط

System.Collection.IEnumerable

یا

System.Collection.Generic.IEnumerable<T>

 را پیاده سازی (Implement) کند، تکرار می کند.

نوع ممیز شناور 32 بیتی که معادل آن در دات نت System.Single است و دقت آن تا 7 رقم است.

بصورت پیش فرض در یک انتساب، عدد سمت راست بصورت double تفسیر می شود. پس برای مقداردهی اولیه به پسوند f یا F بعد از عدد سمت راست انتساب نیاز است:

float x=3.5f;

که درغیر اینصورت با خطای زمان کامپایل مواجه خواهیم شد.

می توان نوع های عددی صحیح و ممیز شناور را در یک عبارت با یکدیگر ترکیب کرد، که در چنین موردی نوع صحیح به نوع اعشاری تبدیل می شود. ارزیابی عبارت طبق قوانین زیر انجام می شود:

  • اگر یکی از نوع های ممیز شناور double باشد، کل عبارت بصورت double ارزیابی خواهد شد. (در عبارت های رابطه ای، ارزیابی بصورت bool خواهد بود).
  • اگر نوع double در عبارت نباشد، بصورت float ارزیابی خواهد شد.

یک عبارت ممیزشناور می تواند شامل مجموعه مقادیر زیر باشد:

  • صفر مثبت و منفی
  • بی نهایت مثبت و منفی
  • مقدار "عددی نیست" یا NaN که کوتاه شده عبارت Not-a-Number است.
  • مجموعه متناهی از مقادیر غیر صفر

باسلام!


دستور fixed از اینکه GC (آشغال جمع کن یا Garbage Collector) یک متغیر جابجا شدنی را منتقل کند، جلوگیریی می کند. دستور fixed فقط در زمینه(context) برنامه نویسی مدیریت نشده مجاز است.

دستور fixed همچنین می تواند برای ساختن بافرهای با اندازه ثابت مورد استفاده قرار می گیرد. این دستور یک اشاره گر به متغیر مدیریت شده می سازد و آن متغیر را در حین اجرای دستور ثابت می کند. بدون fixed ، اشاره گرهای به متغیرهای مدیریت شده قابل انتقال، کاربرد کمی دارد، چون GC می تواند بطور پیش بینی نشده متغیر را جابجا کند. کامپایلر #C فقط اجازه واگذار کردن اشاره گر به متغیر مدیریت شده را در دستور fixed میدهد.

بعد از اجرای کد داخل دستور fixed هر متغیر پین شده (غیرقابل جابجایی)، Unpin می شود و هدف GC قرار می گیرد. بنابراین بیرون دستور fixed به آنها اشاره نکنید. اشاره گرهایی که در دستور fixed مقداردهی اولیه شده اند قابل اصلاح نیستند.

در روش مدیریت نشده، می توان حافظه پشته را که مورد هدف GC قرار نمی گیرد را اختصاص داد؛ و بنابراین نیازی به pin شدن ندارد.

unsafe static void Test(){
    Poin pt=new Point();
    fixed(int* p=&pt.x){
        *p=1;
    }
}

در مورد دستور unsafe بعدا توضیح خواهم داد.

بلوک فاینالی برای پاکسازی هرگونه منابع اختصاص یافته در بلوک try مفید است. همچنین اجرای هرگونه کدی که باید حتما" اجرا شود، حتی اگر استتثنایی وجود داشته باشد. کنترل اجرای برنامه همیشه به بلوک finally تحویل داده می شود، صرف نظر از اینکه بلوک try چگونه پایان می پذیرد.

از آنجایی که بلوک catch برای مدیریت خطاهایی است که در یک بلوک دستور اتفاق می افتند، finally تضمین می کند که بلوکی از دستورها فارغ از اینکه بلوک try قبلی چطور تمام شده (باخطا یا بی خطا)، اجرا شود.


try{
    Commands List
}catch(Exception1 e1){
    Commands List
}catch(Exception2 e2){
    Commands List
}catch(ExceptionN eN){
    Commands List
}finally{
    Commands List
}


#c همچنین دستور using را که املای (syntax) راحتری نسبت به try-finally دارد، ارائه می دهد.

در مورد کلیدواژه using بعدا توضیح خواهم داد.

به دو صورت استفاده می شود:

  • عملگر (Operator)
  • لیترال (ثابت بدون نام)

اگر بصورت عملگر استفاده شود، مقدار بولی true را برای اینکه نشان دهد که عملوند false است بر می گرداند و درغیر اینصورت true برمی گرداند.

قبل از C# 2.0 عملگر true و false برای ساختن نوع های مقداری تهی پذیر (nullable) کاربر-تعریف که با نوع هایی همچون SqlBool سازگار بود استفاده می شد. هرچند زبان سی شارپ امروزه از نوع های مقداری تهی پذیر پشتیبانی می کند و هرگاه مقدور باشد، باید از آنها بجای overload کردن عملگرهای true و false استفاده کرد.

بوسیله Boolean های تهی پذیر عبارت a != b لزوما برابر (a == b)! نیست؛ زیرا یک یا هردو مقدار ممکن است null باشند. شما مجبورید هردو عملگر true و false را جداگانه بازنویسی (overload) کنید تا با مقادیر null در عبارت ها درست رفتار شود.

اگر در یک کلاس عملگر false را overload کنیم باید حتما عملگر true را هم بازنویسی (overload) کنیم.

کلمات کلیدی true یا false را درحالت لیترال بصورت زیر استفاده می شوند:

bool a=true;
Console.WriteLine(a ? "Yes" : "No");

اینجا صدای آهنگهای پاپ لس آنجلسی و غرب زده آن قدر بلند است که فریادهای «حاج مهدی باکری» به گوش نمی رسد!!!
اینجا همه «حاج ابراهیم همت» را با اتوبان همت می شناسند!!!
اینجا بر دیوارهای شهر روی عکس شهید ، پوستر تبلیغاتی می چسبانند!!!
اینجا نام شهید را برای اینکه بچه ها خشونت طلب و جنگ طلب بار نیایند از کوچه ها برداشته و نام نگین و جاوید می گذارند!!!
اینجا .......... ایران قرن 21 است!!!
اینجا ستارگان درخشان هالیوود آنقدر زیاد شده اند که دیگر کسی ستارگان پرفروغ کربلای ایران را نمی بیند!!!
اینجا دیگر شهدا زنده نیستند و در پیچ و خم های عصر ارتباطات، به خاک سپرده شده اند
اینجا دیگر کسی نمی خواهد گمنام بماند، همه به دنبال کسب نام هستند
اینجا جانبازان موجی را از اجتماع دور نگه می دارند تا آسیبی به افکار عمومی نرسانند
اینجاخرمشهر دیگر خونین شهر نیست، خرمشهر دیگر 36 میلیون جمعیت ندارد!!!
............... اینجا ایران قرن 21 است!!!
اینجا کسی نمی داند، مهدی باکری در وصیت نامه خود از خدا خواسته بود جسدش برنگردد و تکه ای از زمین را اشغال نکند!!!
اینجا دشمن در خانه های ماست، دیگر کسی حاضر به نبرد با دشمن نیست
اینجا در پناه میز هستیم، دیگر کسی پشت خاکریز پناه نمی گیرد
اینجاجانباز شیمیایی، به خاطر نداشتن پول، در بیمارستان پذیرش نمی شود و شهد شهادت می نوشد
اینجا کسی نمی داند، شب عملیات خیبر حاج مهدی باکری، برادرش حمید باکری را جاگذاشت و رفت
اینجاکسی نمی داند، مهدی زین الدین، رتبه چهار کنکور سراسری را داشت
اینجاکسی نمی داند، تکه های پیکر محمد نوبخت را درون گونی برای خانواده اش فرستاده بودند
اینجادعای عهد را فراموش کرده ایم، زمان ندبه و سمات را گم کرده ایم
اینجادیگر کسی، احترامی برای چفیه شهدا قایل نیست
اینجاکسی موهای سفید آقا رو نمیبینه


منبع: افسران: ghrib

اصلاحگر extern برای تعریف یک متد که پیاده سازی آن بیرونی است استفاده می شود. یک استفاده عمومی از extern به همراه صفت DllImport است، وقتی در حال استفاده از سرویس های Interop برای تولید کد های مدیریت نشده هستیم. در این حالت متد باید بصورت static تعریف شود. مانند مثال زیر:

[DllImport("avifil32.dll")]
Private static extern void AVIFileInit();

کلمه کلیدی extern همچنین یک نام مستعار اسمبلی بیرونی تعریف می کند که توانایی ارجاع نسخه های مختلف از یک جزء (Component) یکسان از یک اسمبلی یکسان را می دهد.

باسلام!

بوسیله این کلمه کلیدی می توانیم برای کلاس خود یک عملگر قالب ریزی (Cast) صریح بسازیم.

روش تعریف:

public static explicit operator Celsius(Farenheit f){
     return new Celsius((5.0f / 9.0f)*(f.degrees - 32));
}


روش استفاده:

Farenheit f=new Farenheit(100.0f);
Console.WriteLine(f.degrees.ToString());
Celsius s=(Celsius)f;
Console.WriteLine(s.degrees.ToString());


بوسیله کلیدواژه explicit می توان برنامه را طوری نوشت که بتوان یک نوع مقداری را به یک نوع مرجع تبدیل کرد و یا برعکس.