https://www.youtube.com/watch?v=DZbvL-bE0DA&list=PLN5rV4x2x5Xef7lcvrhdDBnJKVfVEw6ui&index=2


به اون جمله میشه statement

خوب toplevel statements
یعنی اون statement اونجا رفته اون بالا
تایپ ها pre defind و csutom type ها ، اولی رو کامپایلر از قبل میدونه
خوب value type , reference type
خوب primitive ها و struct ها میشن value type و بقیه هر چی که هست میشه ref type



چون فضای stack خیلی کمه میایم فقط ادرسش رو توی stack ذخیره میکنیم
خوب نکته اینجاست که struct ها توی stack هستن چون value type هستن
و int هم value type هستش برای همین توی stack هستش ولی s که string هستش چون از نوع refrence type هستش ادرسش رو فقط توی stack نگه میداریم

خوب اون رنگیا به اضای هر عضو توی کلاس struct مون ساخته میشن
stck - filo
خوب حالا چون اینطوریه - اولین چیزی که پاک میشه info هستش بعدش میشه s بعدش میشه i


این جا هم درسته که ذات struct از جنس value type هستش ولی خوده string از جنس Refrence type هستش


اول میاد یه لیست درست میکنه توی stack که ادرسش توی هیپه بعدش بهش یه آدرس دیگه میده که توی ادرسه مقدار string هستش
حالا اول کد رو ببینیم و بعد بریم سراغش - توضیحاتش پایین تر نوشته شده

لیسته یه رفرنس تایپپ هستش و بعدش میایم 6 تا ازش میسازیم
خوب توی اون قسمت زرده یه آدرس هست که توی اون آدرسه - کلاس info ساخته شده که حالا توی همون دوباره توی قسمت name اش یه آدرس هستش که داره به یه قسمت دیگه از حافظه اشاره میکنه که اونجا codenex رو نوشته



خوب ویدیو بالا تموم شد
https://www.youtube.com/watch?v=urEn4JOsqd4&list=PLN5rV4x2x5Xef7lcvrhdDBnJKVfVEw6ui&index=3
statics memory allocations in c#


به cpu وقتی که به هر کدو ما زپین هاش برق وصل میکنیم بهمون 1 میده بقیه صفر - این رو ما توی default value استفاده میکنیم :

توی stack هستش هستش value type ها
خوب به طور مثال اگر ما 10 رو بخوایم داشته باشیم باید توی 8 بیت بسازیمیش و برای ساختن مثلا در 8 بیت نیاز داریم دو تا 1 داشته باشیم برای همین باید بهش برق بدیم
حالا برای کم کردن مصرف برق اینا رو دیفالت گذاشیتیم صفر

خوب ما که نمیدونیم که این name رو به کجا refrence بدیم توی heap برای همین میشه null

خوب اگر name.lenth رو بزنیم null refrence pointer میگیریم چون در heap خالیه
هر refrence tpe رو مثل کلاس user رو اگر new اش کنیم کلا در ابتدا null هستش چون مقداری بهش assign نشده برای همین null هستش پس توی stack هستش ولی مقدارش توی heap نال هستش
خوب rosylin داره تضمین میده که توی Casting اطلاعات از دست نمیرود

اینجا اوکیه
ولی انجا

ولی اینجا داره ارور میده چون یه تایپ بزرگ رو میخواد تبدیل کنه به کوچکتر
ولی 
اینجا explicit نه گرانتی میده نه ضمنی هستش
خوب اون چیزی که کامپایلر نمیفهمه و ممکنه یه اطلاعاتی رو از دست میده از explicit استفاده میکنیم
نکته جانبی : اینجا برامون main و program داره ساخته میشه


خوب اینجا اتفاقی که میوفته اینه که کنسول 0 رو نشون میده خوب اول ما صفر رو میفرستیم توی متد add و اونجا در خروجی add به ما 1 رو چون توی stack یک هستش و pop میشه و بعد number که در stack هستش 0 هستش

در حالت بالا اگر ما اینطوری بنویسیم درست میشه
number = Add(number)

ولی هدف مورد دیگه ایه
حالا ما میخوایم value type رو به صورت ref type بفرستیم


ما این رو refrence ای نکردیم - ما فقط ادرس اون رو در stack بود فرستادیم
خوب به کل این میگن statement

سمت راست میشه expression

خوب اینجا تا اون خط زرده میشه این تصویر که واضحه


تفاوت اینها چیه ؟
خوب تفاوتش اینه که

اینجا وقتی که یه کلاس ساخته میشه اول توی stack یه آدرس میخورده که به یک آدرسی توی heap داره اشاره میکنه - که اونجا یه چیز دیگه ای هم هست به اسم metadata که اون تو داره اشاره میکنه به جایی که متد قرار داره و اگر یه instance دیگه بسازیم دوباره همین مراحل اتفاق میوفته

خوب وقتی که چیزی رو میخوایم static کنیم یعنی میخوایم ازش زیاد استفاده کنیم در heap یه چیزی هست به اسم HFH - heigh frequently heap و متد static تمامی چیز هایی که میخواد رو در خودش داره و قرار نیست با متغییر بیرون تغییر بکنه

در فضای multi thread این نخ ها
ودیو تموم شد
https://www.youtube.com/watch?v=0sWlxJ5hqXU&list=PLN5rV4x2x5Xef7lcvrhdDBnJKVfVEw6ui&index=4

خوب اینجا ما وقتی که داریم از out استفاده میکنیم داریم تعیین میکنیم که حتما باید این متغییر در داخل اون متد باید بهش asssign انجام شود حالا اگر return هم نکردیم ، نکردیم ولی حتما باید روش write انجام شود

خوب وقتی که از in استفاده میکنیم حتما read only هستش و imutable هستش و قابل تغییر نیست
ما داریم اینجا refrance اون متغییر رو میدیم ولی بدون تغییر
چه زمانی cast و convert رو از هم جدا میکنیم ،

اینجا implicit convert چون دو طرف از نوع numeric هستش

اینجا explicit اتفاق میوفته و ما داریم به compiler میگیم که اوکیه این کار رو انجام بدیم یا explisit convert یا این جا بهش cast هم میگن

خوب upcasting رو زمانیه که کلاس فرزند رو بخوایم cast کنیم بخه کلاس پدر و down casitng برعکسه

خوب توی این تبدیل میخوایم - یه value type داریم و یه refrence type خوب اول عدد 5 وارد stack میشه

خوب بعدش obj یه آدرس توی stack میگیره که اون توی heap قرار میگیره
حالا ما میخوایم 5 رو بریزیم توی heap نه خودش رو بلکه یه کپی ازش رو میبریم میریزیم توی یه object که Ref type هستش - یعنی یه value type رو داریم میبریم به یه ref type اینجا میگن boxing اتفاق میوفته

خوب برعکسش میشه unboxing خوب حالا اگر بخوایم برعکسش کنیم یعنی یه چیزی رو از heap بیاریم توی stack میشه unboxing




خوب string ها thread safe هستن به خاطر این که immutable هستش

ما میتونیم اول به یه نغییر string یه اسم بدیم مثلا mohammad بعدش هم میتونیم یه اسم دیگه بدیم مثل hasan ولی اتفاقی که میوفته اینه که وقتی که یه مقدار جدید بهش میدیم اون مقدار قبلی توی heap میمونه و فقط آدرسی که توی stack بوده تغییر میکنه به جایی که hassan هستش - اون مقدار قدیمی انقدر میمونه تا زمانی که gabage collector بیاد پاکش کنه
خوب برای همین هست که میگن password رو به صورت plain string نگیریم چون توی ram میمونه و میشه ازشون سو استفاده کرد

اگر اینجوری میخوایم انجام بدیم - انجام ندیم چون کلی string که به درد نمیخورن توی رم باقی میمونه

برای همین با string builder بسازیم بهتره
https://code-maze.com/stringbuilder-csharp/



خوب حالا داستان اینجاست که اینجا هم نمیاد همون string رو to upper کنه میاد یه جای دیگه این کار رو میکنه

خوب ذات string یه array هستش و دونه به دونه اش char هستش

اینجا هم char به char مقایسه رو انجام میده 24:34
خوب قابلیت string اینه که theared safe هستش
خوب یه قابلیت دیگه اش inrerning


خوب این اتفاق در عکس بالا اتفاق نمی اوفته
چون string ها imutable هستن و در heap هستش این شکلی میشه :


با این دستور بالا میتونیم ref رو چک کنیم


خوب چطوری میفهمه که این دیتا با هم یکسان هستند ؟


خوب آبجکت هایی که حجمشون زیاد هست میرن توی hoh هستیم ، و اون هایی که کوچک هستن soh هستش
حالا ممکنه که بین این دو تا هم جا به جا بشن

خوب وقتی که name_2 رو میخوایم mohamad رو بهش بدیم میره توی hoh چون string هستش و توی اون جا سکشن سکشن هستش و hoh میره اول چک میکنه ببینه mohamad هستش یا نه
خوب interning توی همون گوشه سمت راست هستش که ساختار Array داره
شاید اسمش اینه

https://www.youtube.com/watch?v=pGGLtkyAP7k&list=PLN5rV4x2x5Xef7lcvrhdDBnJKVfVEw6ui&index=5
ویدیو قبلی تموم شد این شروع شد :


خوب ct میشه compile time و پایینش میشه runtime خوب در دل clr ما یه کامپایلر داریم که اسمش jit هستش خوب وقتی که میخوایم یه فانکشن رو اجرا کنیم در همون لحظه در زمان rt کد IL رو اجرا میکنه خوب چرا C# مستقیم به کد assembly تیدیل نمیشه ؟
خوب CLR بعد از یه مدتی اومد توی .net نشست
خوب mirosoft اومد چندین تا rt داده - برای لینوکس و ویندوز و …

خوب حالا این jit برای ترجمه زبان میانی به rt ویندوز هستش خوب حالا یه jit هستش که مخصوص mac هستش


اون بخش بالایی فارغ از چند سکویی بودنه
خوب حالا میرسیم به این قسمت که ما میخوایم از list , dictionary استفاده کنیم که این ها در ویندوز به یه شکلی توی mac به یه شکل دیگه برای همین با CLR اومد یه BCL داد
7:57 خوب .net میشه یه bcl و clr یعنی از این ها تشکیل شده

خوب rt میشه ترکیب این 3 تا app , bcl , clr


خوب کامپایلر هر کدوم از این زبان ها متفاوت هستش - و این ها همشون تبدیل میشن به il

خوب حالا سمت سیستم عامل هم یه compiler میخواد - clr , bcl میخواد و اگر app داشتیم لایه application رو هم میخوایم
خوب حالا

اگر داریم برای وب مینویسیم میشه as.net core اگر داریم بازی میسازیم میشه unity و موارد دیگه

خوب .net یه unified develpment platform

خوب روی هر سیستمی بسته به نوع اون سیستم باید rt نصب بشه

اینجا ما توی class library داریم از ef استفاده میکنیم
خوب unmaged مستقیما به سیستم عامل وصل میشه
خوب il و msil و cil همشون یکی هستن

خوب اون just in time میشه همون CLR


خوب این CLS میاد به ازای هر language یه سری specification در میاره و اون ها رو میده به clr و اینجا clr باید بفهمه که این il از کدوم زبان اومده
خوب cts میشه command type system
خوب مثلا توی vb .net ما داریم intiger ولی توی .net داریم int

کار cts اینه که این تایپ ها رو ترجمه کنیم ویدیو بالا تموم شد
https://www.youtube.com/watch?v=5IRMDGqg2rc&list=PLN5rV4x2x5Xef7lcvrhdDBnJKVfVEw6ui&index=6


ساختمان داده برای این که دیتا ها رو کنار هم نگه داریم یک پوینتر میخوام یک شرط پایان روش پیمایش - یکی یکی یا دو تا دو تا یا هر چی
توی استک و هیپ این اتفاق میوفته

اگر بخوایم یه چیزی دیگه بهش اضافه کنیم باید کلونش کنیم توی یه قسمت دیگه حافظه

و …


پایه ای ترین پروتکل پیمایش هستش
خوب اشاره گری که میخواستیم میشه current

مقدار داخل اون آرایه رو به عنوان obj داره بهمون میده خوب move next نوع پیمایشش هستش + شرط پایان

خوب حالا میخوایم از list استفاده کنیم که ساختمان داده اش array هستش ولی به هر شکلی که بخوایم میتونیم توش پیمایش کنیم

خوب اگر بخوایم یه روش خاصی پیمایش کنیم باید از IEnumerator ارث بری کنیم

اگر بخوایم یه کالکشن درست کنیم باید از IEnumerable ارث بری کنیم

باید این کار رو کنیم که نشون بدیم یه کالکشن هستیم
خوب حالا بعدش بهم بگو که چطوری میخوای روی این ساختمام داده پیشمایش انجام بدی

اینجا میتوینم تعیین کنیم که چطوری پیشمایش انجام بدیم

همه ی این ها از Ienumerator ارث بری مکنند


خوباینجا میبینیم که Iemnumerable از نوع Read only هستش و هر چیزی هم که ازش ارث بری کنه هم read only میشه
ولی حالا اگر ما بخوایم روی این لیست add کنیم ، باید چی کار کنیم ؟
خوب نکته ی که هست اینه که ما وقتی که از ICollection استفاده میکنیم میتونیم از امکانات IEnumerable استفاده کنیم و همچینین قابلیت جدیدی که بهمون میده اینه که ما اینجا به count هم دسترسی داریم

ولی همچنان add نداریم و بقیه کار ها رو نداریم


خوب اینجا ما random access داریم
خوب add به اخر لیست اضافه میکنه و inset به هر جایی که ما میخوایم

خوب اینجا همش به صورت object هستش ولی ما generic اش رو هم میخوایم


در کنار اون بالایی ها gereric اش رو هم ساختن

خوب ما از اون هایی که read only هستند در جای خودش باید ازش استفاده کنیم خوب اینجا اتفاقی که میوفته اینه که اگر دیتایی که داریم ازش میخونیم خیلی تعدادشون زیاد باشه ما نمیتونیم همش رو بیاریم توی رم
خوب خیلی جالبه میره یه سری از دیتا ها رو اول میاره بعد اونجا وایمیسته میگه که اگر بازم سری بعد رو لازم داشتی بیا بهت میدم با yeild
خوب اگر بخوایم یه بار یه لیستی رو بخونیم و ازش استفاده کنیم و از یه سری قابلیت استفاده کنیم میشه ICollection ولی اگر میخوایم چندین بار بخونیم و ازش استفاده کنیم و کار های دیگه روش انجام بدیم میشه IList و برامون مهم نیست که read only نباشد
خوب حالا اگر بخوایم چندین بار بخونیم و بریم بیاریمش و read only هم باشد برای این قضیه میتونیم از imutable objec t ها استفاده کنیم
32:57