With the rise of multi-core processors and multi-threading, Asynchronous Programming has become an essential tool for building efficient and responsive C# applications. Fortunately, C# provides a rich library for making Asynchronous calls. However, this complex and advanced topic can be challenging for many developers.
PowerShell 7.1 و استفاده از NET 5.
The preview release of PowerShell 7.1 includes .NET 5 preview 1. Starting with PowerShell 7.0, devs have shifted to align with .NET’s release and support life-cycle more closely. PowerShell 7.1 is expected to become available within a week or two of .NET 5’s release date of winter 2020 and align with their annual release cadence going forward.
کتاب های رایگان برنامه نویسی
This list was originally a clone of stackoverflow - List of Freely Available Programming Books by George Stocker.
The list was moved to GitHub by Victor Felder for collaborative updating and maintenance. It grew to become one of the most popular repositories on Github, with over 80,000 stars, over 4000 commits, over 800 contributors, and over 20,000 forks.
کلاس ArrayList
using System; using System.Collections; class ProgrArrayListExample { static void Main() { ArrayList list = new ArrayList(); list.Add("Hello"); list.Add(5); list.Add(3.14159); list.Add(DateTime.Now); for (int i = 0; i < list.Count; i++) { object value = list[i]; Console.WriteLine("Index={0}; Value={1}", i, value); } } }
Index=0; Value=Hello Index=1; Value=5 Index=2; Value=3.14159 Index=3; Value=29.02.2015 23:17:01
ArrayList list = new ArrayList(); list.Add(2); list.Add(3.5f); list.Add(25u); list.Add(" ریال"); dynamic sum = 0; for (int i = 0; i < list.Count; i++) { dynamic value = list[i]; sum = sum + value; } Console.WriteLine("Sum = " + sum); // Output: Sum = 30.5ریال
مجموعههای جنریک Generic Collections
GenericType<T> instance = new GenericType<T>();
List<int> intList = new List<int>(); List<bool> boolList = new List<bool>(); List<double> realNumbersList = new List<double>();
List<int> intList = new List<int>();
- استفاده از index برای دسترسی به یک مقدار، صرف نظر از اینکه چه میزان دادهای در آن وجود دارد، بسیار سریع انجام میگیرد.
- جست و جوی یک عنصر بر اساس مقدار: جست و جو خطی است در نتیجه اگر مقدار مورد نظر در آخرین خانهها باشد بدترین وضعیت ممکن رخ میدهد و بسیار کند عمل میکند. داده هر چی کمتر بهتر و هر چه بیشتر بدتر. البته اگر بخواهید مجموعهای از مقدارهای برابر را برگردانید هم در بدترین وضعیت ممکن خواهد بود.
- حذف و درج (منظور insert) المانها به خصوص موقعی که انتهای آرایه نباشید، شیفت پیدا کردن در آرایه عملی کاملا کند و زمانبر است.
- موقعی که عنصری را بخواهید اضافه کنید اگر ظرفیت آرایه تکمیل شده باشد، نیاز به عمل زمانبر افزایش ظرفیت خواهد بود که البته این عمل به ندرت رخ میدهد و عملیات افزودن Add هم هیچ وابستگی به تعداد المانها ندارد و عملی سریع است.
- افزودن به انتهای لیست به خاطر این که همیشه گره آخر در tail وجود دارد بسیار سریع است.
- عملیات درج insert در هر موقعیتی که باشد اگر یک اشاره گر به آن محل باشد یک عملیات سریع است یا اینکه درج در ابتدا یاانتهای لیست باشد.
- جست و جوی یک مقدار چه بر اساس اندیس باشد و چه مقدار، کار جست و جو کند خواهد بود. چرا که باید تمامی المانها از اول به آخر اسکن بشن.
- عملیات حذف هم به خاطر اینکه یک عمل جست و جو در ابتدای خود دارد، یک عمل کند است.
استفاده از لیست پیوندی برای پیاده سازی پشته:
Stack<string> stack = new Stack<string>(); stack.Push("A"); stack.Push("B"); stack.Push("C"); while (stack.Count > 0) { string letter= stack.Pop(); Console.WriteLine(letter); } //خروجی //C //B //A
ابتدای آرایه مکانی است که عنصر از آنجا برداشته میشود و Head به آن اشاره میکند و tail هم به انتهای آرایه که جهت درج عنصر جدید مفید است. با برداشتن هر خانهای که head به آن اشاره میکند، head یک خانه به سمت جلو حرکت میکند و زمانی که Head از tail بیشتر شود، یعنی اینکه دیگر عنصری یا المانی در صف وجود ندارد و head و Tail به ابتدای صف حرکت میکنند. در این حالت موقعی که المان جدیدی قصد اضافه شدن داشته باشد، افزودن، مجددا از اول صف آغاز میشود و به این صفها، صف حلقوی میگویند.
عملیات اصلی صف دو مورد هستند enqueue که المان جدید را در انتهای صف قرار میدهد و dequeue اولین المان صف را بیرون میکشد.
پیاده سازی صف به صورت پویا با لیستهای پیوندی
برای پیاده سازی صف، لیستهای پیوندی یک طرفه کافی هستند:
در این حالت عنصر جدید مثل سابق به انتهای لیست اضافه میشود و برای حذف هم که از اول لیست کمک میگیریم و با حذف عنصر اول، متغیر Head به عنصر یا المان دوم اشاره خواهد کرد.
کلاس از پیش آمده صف در دات نت <Queue<T است و نحوهی استفاده آن بدین شکل است:
static void Main() { Queue<string> queue = new Queue<string>(); queue.Enqueue("Message One"); queue.Enqueue("Message Two"); queue.Enqueue("Message Three"); queue.Enqueue("Message Four"); while (queue.Count > 0) { string msg = queue.Dequeue(); Console.WriteLine(msg); } } //خروجی //Message One //Message Two //Message Thre //Message Four
مقدمه :
نوع دادهها، اجزای اصلی سازندهی یک زبان برنامه نویسی و شبیه قواعد هر زبانی هستند.
مفاهیمی که در این مطلب بررسی خواهد شد :
• Data Type نوع داده
• Variables متغیرها
• Naming Convention قراردادهای نامگذاری
• Value Type/Reference Type انواع مقداری و ارجاعی
• Stack/heap memory حافظه پشته و هرم
نوع داده
متغیرها
چک کردن سایز نوع داده (Data Type)
Console.WriteLine(sizeof(int)); Console.WriteLine(sizeof(char)); Console.WriteLine(sizeof(bool)); Console.WriteLine(sizeof(decimal)); Console.WriteLine(sizeof(float));
4 2 1 16 4
نکته : متد sizeof فقط برای نمایش اندازهی نوع دادههای مقداری (value type) میتواند مورد استفاده قرار گیرد.
چک کردن نوع داده
ما میتوانیم نوع دادهها را برای بدست آوردن کلاسی که به آن تعلق دارند، چک کنیم.
مثال :
int a = 23; float b = 3.14f; Console.WriteLine(a.GetType()); Console.WriteLine(b.GetType());
System.Int32 System.Single
چک کردن نوع دادهی دو شیء
فرض کنید 2 شیء را با نامهای obj1 و obj2 داریم که هر دو از نوع long هستند. برای اینکه این مقایسه را انجام دهیم، از متد Object.RefrenceEqual میتوان استفاده کرد.
مثال :
long obj1 = 356; long obj2 = 54; float obj3 = 234; Console.WriteLine(object.ReferenceEquals(obj1.GetType(), obj2.GetType())); Console.WriteLine(object.ReferenceEquals(obj1.GetType(), obj3.GetType()));
True False
تعریف یک متغیر ومقدار دهی به آن
برای استفاده از یک متغیر ابتداباید آن را تعریف کنیم :
//<data type> <variable name>; Int a;
مقداردهی اولیه یک متغیر
مقدار دهی اولیهی یک متغیر با استفاده از عملگر = و نوشتن مقدار مورد نظر برای ذخیره کردن در متغیر، در سمت راست عملگر اتفاق خواهد افتاد.
//<data type> <variable name>=value; Int a=23; Int a;//declare تعریف a=23;//مقدار دهی اولیه initializing Int a=23;//تعریف و مقدار دهی در یک خط Int a,b,c=23;//تعریف چند متغیر و مقدار دهی در یک خط
قرار دادهای نام گذاری متغیرها :
در دنیای برنامه نویسی دو نوع قرار داد نام گذاری بسیار متداول وجود دارند:
1- camelCase : در این قرار داد، حرف اول کلمهی اول، بصورت کوچک و حرف اول از کلمهی دوم، بصورت بزرگ نوشته خواهد شد. برای مثال: firstName,lastName
2- PascalCase : در این قرار داد حروف ابتدایی دو کلمهی مجاور، بصورت بزرگ نوشته خواهند شد: FirstName,LastName
چند نکته :
• نامگذاری متغیرها را میتوانید با علامت _ و یا @ شروع کنید.
• کلمات کلیدی (key word) سی شارپ نمیتوانند به عنوان نام متغیر مورد استفاده قرار بگیرند (مگر آنکه با @ شروع شوند).
• در بین نام متغیر نباید فضای خالی وجود داشته باشد. کاراکترهای سازندهی متغیر میتوانند اعداد، حروف و زیر خط باشند.
لیستی از نام گذاریهای مجاز:
int abc; long _abcd; float @abcd; bool main_button; decimal piValue; string firstName; string first_name; bool button55_on;
long _a.5bc5d; float @ab cd; decimal pi@Value; //استفاده از کلمات کلیدی سی شارپ که کامپایلر آنها را مجاز نمیداند bool class; string namespace; string string; int static;
در ادامه کمی در مورد نوع دادهها بحث خواهیم کرد.
در سی شارپ دو مدل نوع داده وجود دارد:
• انواع مقداری Value Type
• انواع ارجاعی یا اشارهای Reference Type
انواع مقداری (Value Type) :
• انواع مقداری مستقیما حاوی دادهها هستند. اگر یک متغیر از نوع مقداری را به یک متغیر دیگر تخصیص دهید، مقدار آنها مستقیما کپی میشوند؛ برعکس نوعهای اشارهای که با نخصیص یک متغیر به یک متغیر دیگر، تنها اشارهگر به مقدار شیء کپی خواهد شد و نه خود شیء.
• کلیه نوعهای مقداری از کلاس ValueType مشتق شدهاند.
• در فضای stack به آنها حافظه تخصیص داده میشود.
• نمیتوانند مقدار null بپذیرند. البته با قابلیت nullabletype امکان تخصیص مقدار null به نوع دادههای مقداری نیز مهیا شده است.
• همه نوعهای دادههای مقداری، یک سازنده پیش فرض دارند که به صورت ضمنی کار مقدار دهی اولیه برای آنها را انجام میدهد. برای مطالعه بیشتر درباره مقادیر پیش فرض به اینجا مراجعه کنید.
انواع مقداری به دو دستهی اصلی تقسیم میشود :
• Structs
• Enumerations
طبقه بندی Structs به صورت زیر است :
• Numeric Type
* Integral Type : sbyte,short,ushort,int,uint,long,ulong,char
* Floating-Point Types : float,double
* Decimal : decimal
• Bool دو مقدار true و false
• User Defined Struct
نوع داده نال (تهی) پذیر (nullable Type) و چگونگی تعریف آن
< data type >? < variable name >= null; //syntax
int? a = null; //assigning null int? b = 55; //assigning null and a value var? c = 55 //it will give error
نکته : var نمیتواند بصورت nullable تعریف شود.
برای چک کردن مقدار در انواع تهی پذیر (nullable) دو خصوصیت وجود دارد:
• HasValue
اگر مقداری در متغیر وجود داشته باشد ارزش true بازگردانده میشود؛ در غیر اینصورت ارزش false
• Value
مقدار واقعی متغیر را باز میگرداند.
مثال :
int? a = null; int? b = 22; Console.WriteLine(a.HasValue); //------------ Console.WriteLine(b.HasValue); Console.WriteLine(b.Value);
False True 22
انواع ارجاعی Reference Type
انواع ارجاعی مستقیما حاوی اطلاعات نیستند و ارجاعی هستند به آدرسی از حافظه که حاوی اطلاعات واقعی است. به بیانی دیگر، اشارهگری به آدرسی از حافظه هستند.
• انواع ارجاعی بصورت غیر مستقیم حاوی دادهها هستند.
• در بخشی از حافظه که به آن heap میگوییم، به آنها فضا اختصاص داده میشود.
• میتوانند بصورت null (بدون مقدار) باشند.
انواع ارجاعی نیز به دو دستهی کلی تقسیم میشوند :
• انواع از پیش تعریف شده
Object,string,dynamic
• انواع تعریف شده توسط کاربر
class,interface,delegate
نکته : آدرس مکانی از حافظه که دادهها در آن قرار دارند، در بخش پشته یا Stack ذخیره میشود و دادهها در فضای heap ذخیره میشوند.
مثال :
test obj; //allocating reference on stack obj= new test(55);//allocating object on heap
نکته : دو متغیر از نوع ارجاعی میتوانند به یک آدرس از حافظه اشاره کنند. در شکل زیر این موضوع نشان داده شده است.
در شکل زیر طبقه بندی نوع دادهها در سی شارپ نشان داده شده است :
وقتی از یک متغیر مقداری را به یک متغیر دیگر تخصیص میدهیم، یک کپی جدید از آن در فضای stack ایجاد میشود. بدین معنی که محتوای دو متغیر یکسان هستند، ولی در دو بخش مجزای در حافظهی Stack قرار دارند. به همین خاطر تغییر محتوای یک متغیر، محتوای متغیر دیگر را تغییر نمیدهد.
مثال :
int a = 55;//declare a and initialize int copya = a;//copya contains the copy of value a
• عملیات کپی، در نوع دادهی ارجاعی
test obj; obj=new test(23); test objCopy; objCopy = obj;
دیاگرام حافظهی قطعه کد بالا به شکل زیر است :
تخصیص حافظه در بخش Stack و Heap به متغیرها
سیستم عامل و net CLR. حافظه را به دو بخش stack و heap تقسیم بندی میکنند.