OpenIddict 4.0 منتشر شد
struct چیست؟
structها مشابه classها هستند با این تفاوت که structها finalizer ندارند و از ارث بری پشتیبانی نمیکنند. structها کاملا مشابه classها تعریف میشوند و در تعریف آنها از کلمه کلیدی struct استفاده میشود. آنها شامل فیلدها، متدها، خصوصیتها نیز میشوند. در زیر نحوه تعریف آن را مشاهده میکنید:
struct Point { private int x, y; // private fields public Point (int x, int y) // constructor { this.x = x; this.y = y; } public int X // property { get {return x;} set {x = value;} } public int Y { get {return y;} set {y = value;} } }
value type و reference type
تفاوت دیگری که بین class و struct، از اهمیت ویژهای برخوردار است آن است که classها reference-type و structها value-type هستند و در زمان اجرا با آنها متفاوت رفتار میشود و در ادامه به تشریح آن میپردازیم.
Point p1 = new Point(); // Point is a *struct* Form f1 = new Form(); // Form is a *class*
Form f1; // Allocate the reference f1 = new Form(); // Allocate the object
Point p2 = p1; Form f2 = f1;
Point myPoint = new Point (0, 0); // a new value-type variable Form myForm = new Form(); // a new reference-type variable Test (myPoint, myForm); // Test is a method defined below void Test (Point p, Form f) { p.X = 100; // No effect on MyPoint since p is a copy f.Text = "Hello, World!"; // This will change myForm’s caption since // myForm and f point to the same object f = null; // No effect on myForm }
Point myPoint = new Point (0, 0); // a new value-type variable Form myForm = new Form(); // a new reference-type variable Test (ref myPoint, ref myForm); // pass myPoint and myForm by reference void Test (ref Point p, ref Form f) { p.X = 100; // This will change myPoint’s position f.Text = “Hello, World!”; // This will change MyForm’s caption f = null; // This will nuke the myForm variable! }
تخصیص حافظه
CLR اشیاء را در دو قسمت ذخیره میکند:
- stack یا پشته
- heap
void CreateNewTextBox() { TextBox myTextBox = new TextBox(); // TextBox is a class }
پشته همیشه برای ذخیره سازی موارد زیر استفاده میشود:
- قسمت reference متغیرهای محلی و پارامترهای از نوع reference-typed (مانند myTextBox)
- متغیرهای محلی و پارامترهای متد از نوع value-typed (مانند integer, bool, char, DateTime و ...)
- محتویات شیء از نوع reference-typed
- هر چیزی که قرار است در شیء از نوع reference-typed ذخیره شود.
آزادسازی حافظه در heap
در کد بالا وقتی اجرای متد CreateNewTextBox به اتمام برسد متغیر myTextBox از دید (Scope) خارج میشود. بنابراین از پشته نیز خارج میشود ولی با خارج شدن myTextBox از پشته چه اتفاقی برای TextBox object رخ خواهد داد؟! پاسخ در garbage-collector نهفته است. garbage-collector بصورت خودکار عملیات پاکسازی heap را انجام میدهد و اشیائی که اشاره گر معتبر ندارند را حذف مینماید. در حالت کلی اگر شیء از حافظه خارج شد باید منابع سایر قسمتهای اشغال شده توسط آن هم آزاد شود، که این آزاد سازی بعهده garbage-collector است.
حال آزاد سازی برای کلاسهایی که اینترفیس IDisposable را پیاده سازی میکنند به دو صورت انجام میشود:
- دستی: با فراخوانی متد Dispose میسر است.
- خودکار: افزودن شیء به Net Container. مانند Form, Panel, TabPage یا UserControl. این نگهدارندها این اطمینان را به ما میدهند در صورتیکه آنها از حافظه خارج شدند کلیه عضوهای آن هم از حافظه خارج شوند.
برای آزادسازی دستی میتوانیم مانند کدهای زیر عمل کنیم:
using (Stream s = File.Create ("myfile.txt")) { ... }
Stream s = File.Create ("myfile.txt"); try { ... } finally { if (s != null) s.Dispose(); }
مثالی از Windows Forms
فرض کنید قصد داریم فونت و اندازه یک ویندوز فرم را تغییر دهیم.
Size s = new Size (100, 100); // struct = value type Font f = new Font (“Arial”,10); // class = reference type Form myForm = new Form(); myForm.Size = s; myForm.Font = f;
همانطور که مشاهد میکنید محتویات s و آدرس f را در Form object ذخیره کرده ایم که نشان میدهد تغییر در s برروی فرم تغییر ایجاد نمیکند ولی تغییر در f باعث ایجاد تغییر فرم میشود. Form object دو اشاره گر به Font object دارد.
In-Line Allocation (تخصیص درجا)
در قبل گفته شد برای ذخیره متغیرهای محلی از نوع value-typed از پشته استفاده میشود آیا شیء Size جدید هم در پشته ذخیره میشود؟ خیر، بدلیل اینکه آن متغیر محلی نیست و در شیء دیگر ذخیره میشود (در مثال بالا در یک فرم ذخیره شده است) که آن شیء هم در heap ذخیره شده است پس شیء جدید Size هم در heap ذخیر میشود که به این نوع ذخیره سازی In-Line گفته میشود.
تله (Trap)
فرض کنید کلاس Form بشکل زیر تعریف شده است:
class Form { // Private field members Size size; Font font; // Public property definitions public Size Size { get { return size; } set { size = value; fire resizing events } } public Font Font { get { return font; } set { font = value; } } }
myForm.ClientSize.Height = myForm.ClientSize.Height * 2;
Cannot modify the return value of 'System.Windows.Forms.Form.ClientSize' because it is not a variable
برای توضیح بیشتر میتوانید به این سوال مراجعه کنید و در تکمیل آن این لینک را هم بررسی کنید.
پس بنابراین کد بالا را به کد زیر اصلاح میکنیم:
myForm.ClientSize = new Size (myForm.ClientSize.Width, myForm.ClientSize.Height * 2);
ReSharper Ultimate 2016.1.1 منتشر شد
ReSharper 2016.1.1. The update helps ReSharper see controllers outside of ASP.NET MVC areas and folders again (RSRP-458398, RSRP-455213); adds smart, license-aware update checks; enables bulk renaming in TypeScript (RSRP-458570); fixes Go to Everything so that it works after suspending and resuming ReSharper (RSRP-458404); improves performance in solutions with large JavaScript and JSON files (RSRP-458363); fixes pessimistic mode in value analysis (RSRP-458210); makes IL Viewer available via the Navigate To pop-up (RSRP-458323); improves details of ReactJS support (RSRP-458229, RSRP-458242, RSRP-458308). See all fixes in ReSharper 2016.1.1.
The data validated our hypothesis — of the average 9.3 million daily visits to Stack Overflow, we get fewer than 88,000 clicks to the navigation or top bar (this includes inbox, rep, profile, and search.) If you divided each individual click per visit, that’s fewer than 1% of visits navigating anywhere (and far fewer if you counted multiple clicks per visit). Our navigation is not being used by 99% of our users.
آزمون اطلاعات عمومی JavaScript
JS Is Weird
JavaScript is a great programming language, but thanks to the fact that its initial release was built in only ten days back in 1995, coupled with the fact that JS is backward-compatible, it's also a bit weird. It doesn't always behave the way you might think. In this quiz, you'll be shown 25 quirky expressions and will have to guess the output. Even if you're a JS developer, most of this syntax is probably, and hopefully, not something you use in your daily life.