معرفی و نحوه کارکرد داتنت
به طور خلاصه، داتنت یک پلتفرم برای توسعه اپلیکشنهای دسکتاپ، موبایل، سرور، وب و
این پلتفرم به طور کلی شامل سه قسمت اصلی هست:
این نسخه برخلاف نسخههای قبلی،
نحوه کارکرد
زمانی که یک کد سیشارپ (یا
وقتی کدتون رو
بعد از تبدیل کدهای شما به
----
به زبان ساده، کدهای شما در زمان
توی قسمتهای بعدی جزئیات این فرایند و
#CLR
👤 QWxp
💎 Channel: @DevelopixCSharp
به طور خلاصه، داتنت یک پلتفرم برای توسعه اپلیکشنهای دسکتاپ، موبایل، سرور، وب و
IOT و بازی هست.این پلتفرم به طور کلی شامل سه قسمت اصلی هست:
1.Languages: C#, F#, Vb, Q# ...etc
2.Runtimes: CLR
3.Libraries: BCL, packages ...etc
اولین نسخه در سال 2002~ تحت عنوان dotnet framework 1.0 منتشر شد که مخصوص توسعه اپلیکیشنهای ویندوز بود؛ تا حدود سال 2016، یک successor با عنوان dotnet core 1.0 معرفی شد. (توسعه نسخه framework همچنان ادامه داره و اخرین نسخه، 4.8.1 حوالی سال 2022 منتشر شده)این نسخه برخلاف نسخههای قبلی،
open-source و cross-platform بود که تحول نسبتاً بزرگی به حساب میومد.نحوه کارکرد
زمانی که یک کد سیشارپ (یا
F# ,vb و بقیه زبانهای داتنت) مینویسید، کد شما برعکس زبانهایی مثل C/CPP و Rust و ... به زبان ماشین تبدیل نمیشن.وقتی کدتون رو
compile میکنید، کدهای شما توسط CLR (در ادامه راجبش صحبت میکنیم) به یک زبان میانی به اسم MSIL یا همون CIL تبدیل میشن.MS-IL: Microsoft Intermediate Language.
CIL : Common Intermediate Lanauge.
(هردو یکی هستن که به طور خلاصه بهشون IL میگیم، نامگذاریهای مایکروسافته دیگه)بعد از تبدیل کدهای شما به
IL، در زمان اجرا تمامی این کدها توسط یک compiler دیگه به اسم JIT به کدهای native یا کدهای قابل فهم machine تبدیل میشن.----
به زبان ساده، کدهای شما در زمان
compile به یک زبان دیگه تبدیل و وقتی برنامتون رو اجرا میکنید، در لحظه اجرا، اون کدها به زبان ماشین تبدیل و اجرا میشن.توی قسمتهای بعدی جزئیات این فرایند و
CLR رو بررسی میکنیم.#CLR
👤 QWxp
💎 Channel: @DevelopixCSharp
👍8❤1🔥1
بررسی CLR - قسمت اول
مهمترین اونها:
که البته سعی میکنم راجب همشون صحبت کنم ولی قبلش باید دقیقا متوجه بشیم که چه اتفاقی برای کد های ما میوفته؛ بعد از تبدیل کد های ما به
زمانی که شما یک کد
اما برای زبان های داتنتی و به طور کلی زبان هایی که روی
به طور خلاصه،
1. نقش JIT
در مرحله اول، کد های
توجه داشته باشید که
2. وظیفه CL
#CLR #JIT
👤 QWxp
💎 Channel: @DevelopixCSharp
CLR: Common Language Runtime
(JVM in Java)
کدهای سیشارپ مثل جاوا، روی یک virtual machine اجرا میشن، یک محیط ایزوله و managed شده که وظیفه کنترل و مانیتور کد هارو به عهده داره. CLR از اجزای مختلفی تشکیل شده،مهمترین اونها:
JIT, CL, CTS, CLS, Memory Manager, GC, Security Manager, Thread Manager, Exception Manager
هستن.که البته سعی میکنم راجب همشون صحبت کنم ولی قبلش باید دقیقا متوجه بشیم که چه اتفاقی برای کد های ما میوفته؛ بعد از تبدیل کد های ما به
IL ، چالش اصلی، محیطی هست که کد های ما قراره داخلش اجرا بشن، یکی از دلایل وجود CLR و JIT هم همینه؛ کد های IL ای که برای ما تولید شدن، مربوط به هیچ سیستم عامل بهخصوصی نیستن، درواقع IL ساخته شده قابلیت اینو داره که روی تمام سیستم ها اجرا بشه ، چیزی که توی زبان های native طبیعتا امکان پذیر نیست.زمانی که شما یک کد
C/CPP رو Compile میکنید، کد های شما مخصوص یک محیط، یک CPU و معماری هستن، کد های تولید شده امکان اجرا روی محیط های دیگه رو ندارن، اگه برای ویندوز کد نوشتید، کد شما روی لینوکس اجرا نمیشه و برعکس ... اما برای زبان های داتنتی و به طور کلی زبان هایی که روی
VM اجرا میشن اینطور نیست.به طور خلاصه،
CLR به ما کمک میکنه که کدهامون رو توی محیط های مختلف اجرا کنیم1. نقش JIT
JIT: Just-In-Time Compiler
با درنظر گرفتن تمام این موارد، چطور کد های IL روی سیستم های مختلف قابل اجرا هستن؟ در مرحله اول، کد های
IL شما به وسیله JIT، به کد های native تبدیل میشن، اگر برنامه شما روی لینوکس اجرا میشه ، JIT کد های IL رو برای لینوکس compile میکنه، و اگر روی ویندوز اجرا بشه ، برای ویندوز؛ به این فرایند اصطلاحا JIT'ing گفته میشه.توجه داشته باشید که
JIT فقط کد هایی رو تبدیل به native میکنه که CL اونهارو Load کرده باشه.2. وظیفه CL
CL: Class Loader
احتمالا خودتون میتونید حدس بزنید که نقش CL چیه، وظیفه مدیریت و load کردن کلاس ها به عهده CL هست، زمانی که یک کلاس رو توی کد استفاده میکنید، تا زمانی که برنامه به اون قسمت از کد نرسه، کلاس رو Load نمیکنه، به محض نیاز، کلاس توسط CL توی حافظه load میشه و بعد از استفاده هم طبیعتا از بین میره.#CLR #JIT
👤 QWxp
💎 Channel: @DevelopixCSharp
👍5🔥2
بررسی CLR - قسمت دوم
3.وظیفه CTS
تمامی زبان های داتنت درنهایت از یک
نقش
برای درک بهتر، یک
این سه
پس متوجه شدیم که وظیفه
4.بررسی CLS
هر زبان، تحت قوانین مشترکی نوشته و پیاده سازی میشه که درنتیجه، باعث میشه تمام زبان ها یک ساختار رو داشته باشن ولی با شکل و شمایل مختلف.
به عنوان مثال ، در هر سه زبان
تمام این قوانین توسط
به زبان ساده،
#CLR #CTS #CLS
👤 QWxp
💎 Channel: @DevelopixCSharp
3.وظیفه CTS
CTS: Common Type System
هر زبان برنامه نویسی، یک type system داره که مختص همون زبان هست. مشخصا type های زبان Go توسط زبان Rust قابل درک نیست و ... ؛ اما برای داتنت اینطور نیست.تمامی زبان های داتنت درنهایت از یک
type system واحد استفاده میکنن که در واقع همون CTS هست.نقش
CTS، کنترل و مدیریت type ها در managed code هست. برای درک بهتر، یک
value type مثل INT رو درنظر بگیرید، این type در تمام زبان ها وجود داره، توی سیشارپ و افشارپ به عنوان int میشناسیمش، توی vb به عنوان integer.این سه
type ، همشون درنهایت باید به type قابل درک برای IL تبدیل بشن، که توی این مثال int32 هست.پس متوجه شدیم که وظیفه
CTS ، تبدیل تایپ type های ما به type های قابل درک CLR و مدیریت اون ها هست.4.بررسی CLS
CLS : Common Language Specification
زبان های داتنتی قابلیت این رو دارن که باهم ترکیب بشن، به عنوان مثال ، شما میتونید از یک کتابخانه ای که به زبان C# نوشته شده ، توی F# یا VB استفاده کنید، با برعکس ، این قابلیت به لطفا قوانین مشترک زبان های داتنت وجود داره .هر زبان، تحت قوانین مشترکی نوشته و پیاده سازی میشه که درنتیجه، باعث میشه تمام زبان ها یک ساختار رو داشته باشن ولی با شکل و شمایل مختلف.
به عنوان مثال ، در هر سه زبان
c#, f# ,vb فانکشن ها دارای اسم، ورودی، خروجی و .. هستن، شاید چیدمان یا نحوه تعیین کردنشون متفاوت باشه ، اما درنهایت برای IL ، هر سه زبان یکی هستن.تمام این قوانین توسط
CLS کنترل و مدیریت میشن.به زبان ساده،
CLS قابلیت همکاری یا Interoperability رو به زبان های داتنتی میده. زبان هایی که تحت قوانین CLS پیاده سازی میشن، به اصطلاح CLS complaint هستن.#CLR #CTS #CLS
👤 QWxp
💎 Channel: @DevelopixCSharp
👍4🔥1
بررسی CLR - قسمت سوم
5. وظیفه Memory Manager
هر زبان برنامهنویسی با تکنیکها و استراتژیهای مختلفی با
نقش
6. وظیفه GC
7.وظیفه Security Manager
قبل از اجرای کدهای شما،
8.وظیفه Thread Manager
ساخت
9.وظیفه Exception Manager
وقتی یک
#CLR #GC
👤 QWxp
💎 Channel: @DevelopixCSharp
5. وظیفه Memory Manager
هر زبان برنامهنویسی با تکنیکها و استراتژیهای مختلفی با
memory ارتباط برقرار میکنه؛ در زبانهایی مثل C/CPP این کار به صورت کاملا دستی و توسط برنامهنویس انجام میشه، زبانهایی مثل سیشارپ و جاوا، به طور خودکار این موضوع رو مدیریت میکنن و برنامهنویس نیازی به انجام این کار نداره.نقش
Memory Manager مدیریت رم به طور خودکار هست، زمانی که یک متغیر تعریف میکنید، یک متغیر رو صدا میزنید و یا تغییرش میدید، تمام مسائل مربوط به رم توسط Memory Manager کنترل میشه.6. وظیفه GC
GC: Garbage Collector
توی قسمت قبل گفتیم که وظیفه ساخت متغیر و ... به عهده memory manager هست، اما وظیفه حذف و جابجایی و ... به عهده کیه؟GC مسئول کنترل و حذف دیتای استفاده نشده داخل مموری هست.7.وظیفه Security Manager
قبل از اجرای کدهای شما،
CLR ملزم به چک کردن Permission های مورد نیاز برنامه، بررسی سالم بودن و الوده نشدن کدها توسط عوامل خارجی و ... هست. تمام این کارها توسط Security Manager انجام میشه.8.وظیفه Thread Manager
ساخت
Thread اصلی برنامه یا Main Thread، قابلیت ایجاد و دسترسی به sub-thread ها و کنترل ThreadPool به عهده این سرویس هست.9.وظیفه Exception Manager
وقتی یک
Exception رخ میده، تمام اطلاعاتی که همراهش ایجاد میشه مثل stack trace، اجرای Catch Block، دنبال کردن سلسله مراتب break و return ها، تماماً توسط Exception manager کنترل میشه.#CLR #GC
👤 QWxp
💎 Channel: @DevelopixCSharp
👍5🔥1
معرفی کلمهکلیدی
هر کدی که در
کد امن کدی هست که مستقیم به
درنتیجه کدهایی که به صورت
به دو صورت میتونید از
1.modifier:
2.scopped (block):
نکته: کلمه
#unsafe
👤 QWxp
💎 Channel: @DevelopixCSharp
unsafe
کاری که این keyword انجام میده اینه که context رو از حالت امن خارج میکنه.هر کدی که در
unsafe context نوشته بشه تضمینی از سمت compiler و CLR برای امن بودنش وجود نداره.کد امن کدی هست که مستقیم به
memory دسترسی نداره، از pointer استفاده نمیکنه، توسط GC مدیریت میشه و کاربر نقشی توی کار با مموری ایفا نمیکنه.درنتیجه کدهایی که به صورت
unsafe نوشته میشه، میتونن دقیقا مثل زبان های C/CPP برنامه نویس رو با مشگلات memory مواجه کنند.به دو صورت میتونید از
unsafe استفاده کنید:1.modifier:
unsafe void MyFunc(){}
هرچیزی که اینجا تعریف بشه کلا unsafe هست؛2.scopped (block):
void MyFunc(){
//safe
unsafe{
//unsafe
}
}
اینجا هرکدی که داخل unsafe block باشه ، طبیعتا unsafe هست و بیرون از این block کد ها safe هستن.نکته: کلمه
unsafe به خودی خود تاثیری روی IL یا JIT به طور مستقیم نداره، میشه گفت نوشتن این کلمه، صرفا یک مجوز برای کامپایل هست، نه بیشتر.#unsafe
👤 QWxp
💎 Channel: @DevelopixCSharp
👍7
- معرفی BCL
پکیج هایی که از
اما خود داتنت به طور مستقل یک کتابخانه مشترک و عمومی در اختیار توسعه دهنده قرار میده که اصطلاحا بهش
مواردی مثل
درواقع
و خیلی مواردی که تا الان بهشون برخوردید همگی بخشی از این کتابخانه مشترک هستن، یکی از موارد مهمی که باید بهش توجه کنید،
- معرفی FCL
پس
اما چه فرقی میکنن ؟ چرا همشون یکجا توی
همونطور که بالاتر گفتم،
اما
خب پس تمام مواردی که بین نسخه های مختلف داتنت مشترک هستند، بخشی از
#CLR
👤 QWxp
💎 Channel: @DevelopixCSharp
BCL: Base Class Libraryقبلا اشاره کردیم که یکی از بخش های اکوسیستم داتنت، کتابخانه های اون هستش.
پکیج هایی که از
nuget نصب میکنید، همگی بخشی از این کتابخانه ها هستن، مثلا newtonSoft ، automapper ، dapper و...اما خود داتنت به طور مستقل یک کتابخانه مشترک و عمومی در اختیار توسعه دهنده قرار میده که اصطلاحا بهش
BCL یا CL میگن؛ BCL بخشی از FCL هست که به طور مشترک در بین تمامی نسخه های داتنت وجود داره،مواردی مثل
data type ها مثل string, int, bool و List, Dictionary و تمام موارد این چنینی بخشی از BCL هستن،درواقع
BCL ، اولین خطی هست که توی برنامتون مینویسید(معمولا):using System;تمام
type ها ، utility ها و بیشتر چیزهایی که از این namespace میاد، بخشی از BCL هست، مثلا:System.Collectionsیا کلاس های
System.Linq
System.Net
HttpClient یا Stream و خیلی مواردی که تا الان بهشون برخوردید همگی بخشی از این کتابخانه مشترک هستن، یکی از موارد مهمی که باید بهش توجه کنید،
FCL و تفاوت این دو هست.- معرفی FCL
FCL : Framework Class Libraryمورد قبلی که بهش اشاره کردیم،
Base بود ولی الان که کلمه framework رو دیدید احتمالا حدس میزنید که چه فرقی دارن، کاملا اشتباه حدس زدید، FCL مخصوص نسخه های .net framework نیست ، در واقع هیچ ربطی به اسمش نداره (باز هم نامگذاری های مایکروسافت).FCL به تمام کد ها و کتابخانه های ارائه شده توسط داتنت گفته میشه، هر کدی که توسط مایکروسافت نوشته شده، توی این دسته قرار میگیره، مثلا asp.net ، wpf, winform و همچنین خود BCL همگی بخشی از FCL هستن؛پس
FCL یک مجموعه کلی از کتابخانه ها و ابزار های مایکروسافت هست که BCL فقط بخشی از اون هست.اما چه فرقی میکنن ؟ چرا همشون یکجا توی
BCL نیستن ؟ همونطور که بالاتر گفتم،
BCL توی تمامی نسخه های داتنت وجود داره، فرقی نمیکنه سیستم عامل هدف چیه، cpu چی هست یا کدتون اصلا روی یخچال خونه میخواد اجرا بشه یا جای دیگه، هرجا که داتنت هست، تمامی کتابخانه های BCL وجود دارن؛اما
FCL محدود به محیط هست، شما طبیعتا روی یک یخچال نمیتونید WPF یا Winform اجرا کنید، اگر داتنت ورژن بخصوصی برای یخچال داشته باشه، قطعا شامل System.Windows نمیشه.خب پس تمام مواردی که بین نسخه های مختلف داتنت مشترک هستند، بخشی از
BCL هستند؛ و تمام مواردی که مشترک نیستند بخشی از FCL.#CLR
👤 QWxp
💎 Channel: @DevelopixCSharp
👍9🔥1
چندتا ترفند یاد بگیری بد نیست :
1- پشت string هایی که مینویسی «
2- خب حالا میرسیم به @ که خیلی کاربردی تر از قبلیه! حالا میگم چرا:)
دوتا از فایدههایی که @ داره رو اینجا معرفی میکنم:
اولاً که باعث میشه توی absolute path های فایل ویندوز به مشکل نخوری! مثلا ببین:
دومین فایده @ پشت string اینه که میتونی یک string رو تقسیم کنی و توی چندین خط بنویسی، در حالی که string واحد داری (یکی از پر کاربردترین استفادههاش توی نوشتن sql query هست) مثلاً:
""+
""+
.
.
.
مینوشتن، ولی خب @ اومد و کار برنامه نویسا رو راحت تر کرد:)))
3- این موردی که میخوام بگم تقریباً همه جا کاربردی هست، و شاید در نگاه اول تاثیرگذار نباشه ولی به خودت میای و میفهمی داری نصف وقتت رو ازش استفاده میکنی:)
برای اینکه به اول یه کلمه یا اخر کلمه بری میتونی دکمه Ctrl رو نگه داری! اره، میدونم خیلی ساده هست ولی کاربردیتر از اونی هست که فکرش رو بکنی (چمیدونم مثلاً داری نام متغیر یا فایل رو تغییر میدی و یا توی مرورگرت یه کلمه رو اشتباه نوشتی و...).
4- مورد چهارم رو خلاصه بگم:
میتونی توی سیشارپ توابع تک خطی داشته باشی، حالا چه بدردت میخوره، خب معلومه! کدت رو خواناتر میکنه! مثلا به این کد توجه کن:
یه نام درست و حسابی برای متغیر، توابع، کلاس ها، اینترفیس ها و... انتخاب کن، شاید الان متوجه نشی ولی قطعا بعدا متوجه اهمیتش میشی!!
به جای اینکه زیر کدت یه کامنت برای توضیح کدت قرار بدی، کدت رو خواناتر کن و کامنت رو پاک کن.
میدونم که شاید به حرفام بخندی، اما خب به وقتش میفهمی چقدر مهم هستن!
همیشه یادت باشه:
«اشکهایی که به خاطر باگ امروز میریزی، عرقهایی هستن که برای نوشتن کد تمیز نریختی»
👤 MrKaveh
💎 Channel: @DevelopixCSharp
1- پشت string هایی که مینویسی «
$@» قرار بده تا خیلی از کدهات خلاصه بشه (دقیقاً به همین ترتیب، جا به جا بنویسی ارور میده) مثال :
string test = $@"";خب اول باید بگم
$ چیکار میکنه؟ شما میتونی متغیر رو خیلی خواناتر توی string خودت قرار بدی! مثلاً:string name = Console.ReadLine();داخل قلاب (curly bracket) هر چقدر فاصله بزاری تاثیری نداره، ولی بیرون curly bracket داخل string قطعاً تاثیر گذاره!
string test = $"hello { name }";
2- خب حالا میرسیم به @ که خیلی کاربردی تر از قبلیه! حالا میگم چرا:)
دوتا از فایدههایی که @ داره رو اینجا معرفی میکنم:
اولاً که باعث میشه توی absolute path های فایل ویندوز به مشکل نخوری! مثلا ببین:
string test = $@"C:\windows\system";اگر توی کد بالا @ رو برداری خطا میده و این به خاطر اینه که \ رو به عنوان کاراکتر کنترلی میشناسه و بعدش باید یه سری کاراکتر خاص بیاد ولی وقتی @ میزاری این خطا رفع میشه!
دومین فایده @ پشت string اینه که میتونی یک string رو تقسیم کنی و توی چندین خط بنویسی، در حالی که string واحد داری (یکی از پر کاربردترین استفادههاش توی نوشتن sql query هست) مثلاً:
string test = $@"select * from [table]قبلاً برنامه نویسا باید کلی
where [column] = {someData}";
""+
""+
.
.
.
مینوشتن، ولی خب @ اومد و کار برنامه نویسا رو راحت تر کرد:)))
3- این موردی که میخوام بگم تقریباً همه جا کاربردی هست، و شاید در نگاه اول تاثیرگذار نباشه ولی به خودت میای و میفهمی داری نصف وقتت رو ازش استفاده میکنی:)
برای اینکه به اول یه کلمه یا اخر کلمه بری میتونی دکمه Ctrl رو نگه داری! اره، میدونم خیلی ساده هست ولی کاربردیتر از اونی هست که فکرش رو بکنی (چمیدونم مثلاً داری نام متغیر یا فایل رو تغییر میدی و یا توی مرورگرت یه کلمه رو اشتباه نوشتی و...).
4- مورد چهارم رو خلاصه بگم:
میتونی توی سیشارپ توابع تک خطی داشته باشی، حالا چه بدردت میخوره، خب معلومه! کدت رو خواناتر میکنه! مثلا به این کد توجه کن:
if(data != null)خواناتر هست یا این کد:
{
//codes
}
private bool CheckNotNull(data) => data != null;یادت باشه مهمتر از این که کد قابل اجرا بنویسی، باید کد قابل توسعه (maintainable) و خوانا بنویسی! یعنی بعد یه ماه برگشتی سر کدت چشمت از حدقه نزنه بیرون :))
.
.
if(CheckNotNull())
{
//codes
}
یه نام درست و حسابی برای متغیر، توابع، کلاس ها، اینترفیس ها و... انتخاب کن، شاید الان متوجه نشی ولی قطعا بعدا متوجه اهمیتش میشی!!
به جای اینکه زیر کدت یه کامنت برای توضیح کدت قرار بدی، کدت رو خواناتر کن و کامنت رو پاک کن.
میدونم که شاید به حرفام بخندی، اما خب به وقتش میفهمی چقدر مهم هستن!
همیشه یادت باشه:
«اشکهایی که به خاطر باگ امروز میریزی، عرقهایی هستن که برای نوشتن کد تمیز نریختی»
👤 MrKaveh
💎 Channel: @DevelopixCSharp
👍9❤1
تفاوت
این ابجکت درواقع یک
این تابع رو تصور کنید:
اما کد ما چه مسیر هایی رو میتونه طی کنه ؟
خب ممکنه در مرحله اول ورودی ما خالی یا
ممکنه خالی نباشه اما یک username معتبر نباشه که توی شرط دوم برسی میشه و کد دوباره تموم میشه
و حالت خوشحال کننده که username معتبر هست و فالور های اون به کاربر نشون داده میشه؛
- خب، اینا چه ربطی به
ربطی نداشت واقعا، اما پیش زمینه بود؛ چند تا از این مسیر ها ، به کد
همون مسیر خوشحال کننده که درنهایت یک درخواست احتمالا به
- خب، مشکلش چیه؟
هیچ مشکلی نداره، مشکل جایی به وجود میاد که این متد صد ها هزار بار یا بیشتر صدا زده بشه، برای هر بار اجرای این متود، شما یک ابجکت اضافه، جدای از تعداد فالور های کاربر ذخیره میکنید، بله خود
و خب اینکار در دنیای ما، جنایت به حساب میاد؛ اما اینجاست که
درواقع در لایه زیرین شما همچین چیزی دارید:
کاربرد های مختلفی برای
"اگر کد، چندین مسیر مختلف داره و بعضی از اون مسیر ها میتونن به کد
و البته محدودیت هایی هم برای استفادش وجود داره:
-برخلاف
-بیشتر از 1 بار نباید از
-استفاده از
#performance #async #task
👤 QWxp
💎 Channel: @DevelopixCSharp
<Task <T و <ValueTask<T
همونطور که میدونید هر عملیات Asynchronous نیازمند یک return type از نوع Task هست، اما یک نوع دیگه هم به اسم ValueTask وجود داره که احتمالا قبلا دیدید.این ابجکت درواقع یک
Discriminated Union هست که به زبان ساده، میتونه چندین type مختلف از دیتا رو در خودش نگه داری کنه، که توی زبان هایی مثل Typescript, Rust, FSharp و ... وجود داره، البته کار ValueTask نگه داری چند type مختلف برای شما نیست! اما چرا این type وجود داره ؟این تابع رو تصور کنید:
async Task<int> GetFollowers(string? username)زیاد پیچیده نیست، صرفا یک username به عنوان ورودی میگیره و تعداد فالور های اون کاربر رو برمیگردونه؛
{
if (string.IsNullOrEmpty(username))
return -1;
if (!_validateRegex.IsMatch(username))
return -2;
return await GetInstagramFollowers(username);
}
اما کد ما چه مسیر هایی رو میتونه طی کنه ؟
خب ممکنه در مرحله اول ورودی ما خالی یا
null باشه که با شرط اول کد تموم میشه؛ممکنه خالی نباشه اما یک username معتبر نباشه که توی شرط دوم برسی میشه و کد دوباره تموم میشه
و حالت خوشحال کننده که username معتبر هست و فالور های اون به کاربر نشون داده میشه؛
- خب، اینا چه ربطی به
ValueTask داشت ؟ ربطی نداشت واقعا، اما پیش زمینه بود؛ چند تا از این مسیر ها ، به کد
asynchronous ختم میشه ؟ فقط یکیشون!همون مسیر خوشحال کننده که درنهایت یک درخواست احتمالا به
API یا DB فرستاده میشه، اما ما برای هر سه مسیر داریم یک Task برمیگردونیم! - خب، مشکلش چیه؟
هیچ مشکلی نداره، مشکل جایی به وجود میاد که این متد صد ها هزار بار یا بیشتر صدا زده بشه، برای هر بار اجرای این متود، شما یک ابجکت اضافه، جدای از تعداد فالور های کاربر ذخیره میکنید، بله خود
Task که از آسمون نازل نمیشه، اون هم داخل Heap ذخیره میشه درست مثل بقیه Object ها، اون هم درصورتی که اینجا ما فقط توی یک مسیر ازش استفاده کردیم، درواقع دو مسیر دیگه، منابع اضافه مصرف میکنن!!و خب اینکار در دنیای ما، جنایت به حساب میاد؛ اما اینجاست که
ValueTask به دردمون میخوره، اگه تابع شما به جای Task ، صرفا ValueTask برگردونه، در دو مسیر دیگه که کد به درخواست asynchronous منتهی نمیشن، صرفا مقدار خالص رو به شما میده، و در مسیر اخری که کد ما به await کردن و درخواست I/O میرسه، یک Task به شما برمیگردونه.درواقع در لایه زیرین شما همچین چیزی دارید:
ValueTask<Task<T>,T>که یا میتونه
T باشه یا <Task <T
اگر واقعا Task اتون به خطوط async برسه، یک Task دارید، و اگر صرفا در مراحل قبل از اون به اتمام برسه، یک T به صورت مستقیم دارید:async ValueTask<int> GetFollowersAsync(string? username)درنتیجه، شما در دو مسیر، از مصرف بیخود منابع جلوگیری میکنید، که توی تعداد درخواست های بالا میتونه زندگیتون رو نجات بده؛
{
if (string.IsNullOrEmpty(username))
return -1; //int
if (!_validateRegex.IsMatch(username))
return -2; //int
return await GetInstagramFollowers(username); //Task<int>
}
کاربرد های مختلفی برای
ValueTask وجود داره، از معروف هاش میشه به سیستم caching اشاره کرد، اما صرفا شرط ساده ای که باید به خاطر بسپارید:"اگر کد، چندین مسیر مختلف داره و بعضی از اون مسیر ها میتونن به کد
async یا sync منتهی بشن، ValueTask میتونه مورد خوبی برای بهینه کردن کد باشه"و البته محدودیت هایی هم برای استفادش وجود داره:
-برخلاف
Task ها، ValueTask ها نباید بیشتر از 1 بار await بشن!-بیشتر از 1 بار نباید از
AsTask بر روی ValueTask استفاده کنید!-استفاده از
Result. یا ()GetAwaiter().GetResult زمانی که هنوز عملیات به اتمام نرسیده یا بیشتر از یک بار استفاده بشن( کلا از اینها هیچوقت استفاده نکنید، چه Task و چه ValueTask ) #performance #async #task
👤 QWxp
💎 Channel: @DevelopixCSharp
👍14👎3❤1
در سیشارپ، توابعی که خروجی Task دارند ولی از کلمهکلیدی async درآنها استفاده نشده در واقع sync هستند.
در مثالی که در تصویر میبینید شاید تصور شود که متد Example باید در پس زمینه اجرا شود، ولی این اتفاق نمیافتد و کاملا به صورت sync اجرا خواهد شد. این تابع در واقع مثل بقیه تابع های sync فقط یک خروجی Task دارد، مثل تابع زیر:
static string Example()
#Task
#Async
👤 Mahdiyar
💎 Channel: @DevelopixCSharp
در مثالی که در تصویر میبینید شاید تصور شود که متد Example باید در پس زمینه اجرا شود، ولی این اتفاق نمیافتد و کاملا به صورت sync اجرا خواهد شد. این تابع در واقع مثل بقیه تابع های sync فقط یک خروجی Task دارد، مثل تابع زیر:
static string Example()
#Task
#Async
👤 Mahdiyar
💎 Channel: @DevelopixCSharp
👍12❤1🔥1
Forwarded from Developix Support
📌 اگر دنبال تبدیل شدن به یک برنامهنویس مطرح در دنیای فریلنسری و کسب درآمد بیشتر هستی، شرکت در این کارگاه رو از دست نده!
💻 کارگاه تجارت بینالمللی برای برنامهنویسها؛
(فریلنسرینگ حرفهای در مقیاس جهانی)
🗓 زمان: 30 شهریور تا 6 مهر 1402
حضوری و آنلاین (2 جلسه حضوری و 5 جلسۀ آنلاین)
📝 اطلاعات بیشتر و ثبتنام
🔻و یا برای کسب اطلاعات بیشتر کافیه به آیدی ما پیام بدی!
🆔 @MaktabSharif_Admin
🌐 وبسایت |📱کانال تلگرام | 📲 اینستاگرام
💻 کارگاه تجارت بینالمللی برای برنامهنویسها؛
(فریلنسرینگ حرفهای در مقیاس جهانی)
🗓 زمان: 30 شهریور تا 6 مهر 1402
حضوری و آنلاین (2 جلسه حضوری و 5 جلسۀ آنلاین)
📝 اطلاعات بیشتر و ثبتنام
🔻و یا برای کسب اطلاعات بیشتر کافیه به آیدی ما پیام بدی!
🆔 @MaktabSharif_Admin
🌐 وبسایت |📱کانال تلگرام | 📲 اینستاگرام
Forwarded from کار و کسب، عادل طالبی 📌
This media is not supported in your browser
VIEW IN TELEGRAM
📌 دوره آنلاین سئو برای مدیران، آخرین روز ثبتنام با تخفیف ویژه
🔘 استراتژی سئو
🔘 مدیریت فرآیندهای سئو
🔘 گزارشات سئو
🔘 ارزیابی و نظارت بر فرآیندهای سئو
🔘 اشتباهات سئو
🔘 قراردادهای سئو
این دوره پس از سه سال مجدداً برگزار میشود. در این دوره یاد میگیرید چگونه فرآیندهای سئو را مدیریت کنید. این دوره برای مدیران و صاحبان کسب و کارها مفید است که بدانند از تیم سئو چه بخواهند و چگونه از اجرای صحیح فرایندهای سئو اطمینان یابند. همچنین متخصصین سئو یاد میگیرند چگونه با کارفرمایان به شکل درست تعامل و همکاری کرده، به نیازهای آنها پاسخ صحیح بدهند.
پنج جلسه آموزش انلاین فشرده و تخصصی همراه با یک جلسه پرسش و پاسخ.
اطلاعات بیشتر و ثبتنام در ایسمینار:
🌐 eseminar.tv/wb116105
کد تخفیف: talebi
فقط امروز و فردا، به جای 5 میلیون تومان فقط با 2 میلیون تومان در این دوره آنلاین شرکت کنید.
هدایای شرکت در دوره:
🔘 حداقل 2 میلیون تومان رپورتاژ در تریبون
🔘 اکانت 6 ماهه جتسئو به ارزش 1.200.000 تومان
🔘 اکانت یک سالۀ سازمانی میزیتو به ارزش 2.900.000 تومان
🔘 یک جلد کتاب سئو 2022+2023 امضاء شده.
❌❌ فقط امروز ❌❌
☑️ @kar_kasb
🔘 استراتژی سئو
🔘 مدیریت فرآیندهای سئو
🔘 گزارشات سئو
🔘 ارزیابی و نظارت بر فرآیندهای سئو
🔘 اشتباهات سئو
🔘 قراردادهای سئو
این دوره پس از سه سال مجدداً برگزار میشود. در این دوره یاد میگیرید چگونه فرآیندهای سئو را مدیریت کنید. این دوره برای مدیران و صاحبان کسب و کارها مفید است که بدانند از تیم سئو چه بخواهند و چگونه از اجرای صحیح فرایندهای سئو اطمینان یابند. همچنین متخصصین سئو یاد میگیرند چگونه با کارفرمایان به شکل درست تعامل و همکاری کرده، به نیازهای آنها پاسخ صحیح بدهند.
پنج جلسه آموزش انلاین فشرده و تخصصی همراه با یک جلسه پرسش و پاسخ.
اطلاعات بیشتر و ثبتنام در ایسمینار:
🌐 eseminar.tv/wb116105
کد تخفیف: talebi
فقط امروز و فردا، به جای 5 میلیون تومان فقط با 2 میلیون تومان در این دوره آنلاین شرکت کنید.
هدایای شرکت در دوره:
🔘 حداقل 2 میلیون تومان رپورتاژ در تریبون
🔘 اکانت 6 ماهه جتسئو به ارزش 1.200.000 تومان
🔘 اکانت یک سالۀ سازمانی میزیتو به ارزش 2.900.000 تومان
🔘 یک جلد کتاب سئو 2022+2023 امضاء شده.
❌❌ فقط امروز ❌❌
☑️ @kar_kasb
👎2
پشتیبانی از Visual studio بر روی Mac متوقف شد
حدود 2 روز پیش مایکروسافت اعلام کرد که پشتیبانی از ویژوال استودیو برای مک، تا سال آینده، همین موقع متوقف خواهد شد.(
طبق گفته مایکروسافت آپدیت های جدید دیگه منتشر نمیشه ولی همچنان به رفع باگ و مشکلات امنیتی تا سال اینده ادامه میدن.
تیم مایکروسافت همچنین پیشنهاد کرده توسعه دهندگانی که روی مک هستن، بجای ویژوال، از vs code و افزونه جدیدی که چند مدت پیش تحت عنوان C# Dev Kit منتشر شده بود استفاده کنن، یا ویژوال رو داخل ویندوز از طریق ماشین مجازی یا cloud استفاده کنن.
-خودم پیشنهاد میکنم از Rider استفاده کنید اگه منابع مورد نیازش رو دارید.
مایکروسافت دلیل این "بازنشستگی" رو، تمرکز روی بهینه سازی و optimize کردن ویژوال اعلام کرده.
#vs
👤 QWxp
💎 Channel: @DevelopixCSharp
حدود 2 روز پیش مایکروسافت اعلام کرد که پشتیبانی از ویژوال استودیو برای مک، تا سال آینده، همین موقع متوقف خواهد شد.(
31 August)طبق گفته مایکروسافت آپدیت های جدید دیگه منتشر نمیشه ولی همچنان به رفع باگ و مشکلات امنیتی تا سال اینده ادامه میدن.
تیم مایکروسافت همچنین پیشنهاد کرده توسعه دهندگانی که روی مک هستن، بجای ویژوال، از vs code و افزونه جدیدی که چند مدت پیش تحت عنوان C# Dev Kit منتشر شده بود استفاده کنن، یا ویژوال رو داخل ویندوز از طریق ماشین مجازی یا cloud استفاده کنن.
-خودم پیشنهاد میکنم از Rider استفاده کنید اگه منابع مورد نیازش رو دارید.
مایکروسافت دلیل این "بازنشستگی" رو، تمرکز روی بهینه سازی و optimize کردن ویژوال اعلام کرده.
#vs
👤 QWxp
💎 Channel: @DevelopixCSharp
🔥10👍5❤1
Forwarded from Developix Support
This media is not supported in your browser
VIEW IN TELEGRAM
دایناسورها در حال خرید در تهران 🤯
⚡️هیچوقت فکرشو میکردی که همچین تصویری رو ببینی؟
⚡️از آینده به تو سلام 😁
💠این تصویر با استفاده از یک ابزار جدید در تلگرام ساخته شده که هر متنی بهش بدی رو تبدیل به عکس میکنه!
همینالان بهش پبام بده تا عکسش رو برات بفرسته😇
فقط کافیه بزنی رو آیدی زیر و شروع کنی 😉👇🏻
@aiolearn_artbot
🌀هوشمصنوعی با پیشرفت فوقالعادش داره همه دنیار رو فرا میگیره 😉🤯
⚡️هیچوقت فکرشو میکردی که همچین تصویری رو ببینی؟
⚡️از آینده به تو سلام 😁
💠این تصویر با استفاده از یک ابزار جدید در تلگرام ساخته شده که هر متنی بهش بدی رو تبدیل به عکس میکنه!
همینالان بهش پبام بده تا عکسش رو برات بفرسته😇
فقط کافیه بزنی رو آیدی زیر و شروع کنی 😉👇🏻
@aiolearn_artbot
🌀هوشمصنوعی با پیشرفت فوقالعادش داره همه دنیار رو فرا میگیره 😉🤯
👍2👎2
🌀 کامپوننت تقویم فارسی برای استفاده در MAUI 🌀
🔗 لینک این کامپوننت در گیتهاب
#معرفی_ابزار
👤 MHReza
💎 Channel: @DevelopixCSharp
🔗 لینک این کامپوننت در گیتهاب
#معرفی_ابزار
👤 MHReza
💎 Channel: @DevelopixCSharp
👍13
اولین نسخه RC برای داتنت 8 منتشر شد.
تیم داتنت هم بجز System.Text.Json هیچ دغدغه دیگه ای نداره خداروشکر و به طور وحشیانه ای فیچر اضافه میکنن بهش
لینک معرفی
دانلود
مقایسه پرفورمنس (خیلی خلاصه نوشته)
👤 QWxp
💎 Channel: @DevelopixCSharp
تیم داتنت هم بجز System.Text.Json هیچ دغدغه دیگه ای نداره خداروشکر و به طور وحشیانه ای فیچر اضافه میکنن بهش
لینک معرفی
دانلود
مقایسه پرفورمنس (خیلی خلاصه نوشته)
👤 QWxp
💎 Channel: @DevelopixCSharp
👍6
🌀 معرفی switch expression 🌀
🔸 توی نسخه سیشارپ هشت این switch expression ها معرفی شدن که باعث میشه دستورات سوییچ خودمون رو خواناتر بکنیم. بریم یه مثال ببینیم از قبل و بعد از استفاده از این switch expression ها.
🔹 توی این مثال از حالت عادیمون استفاده میکنیم.
#Tips
👤 MHReza
💎 Channel: @DevelopixCSharp
🔸 توی نسخه سیشارپ هشت این switch expression ها معرفی شدن که باعث میشه دستورات سوییچ خودمون رو خواناتر بکنیم. بریم یه مثال ببینیم از قبل و بعد از استفاده از این switch expression ها.
🔹 توی این مثال از حالت عادیمون استفاده میکنیم.
int number = 1;🔸حالا بریم با switch expression بازنویسیش کنیم.
string result = "";
switch (number)
{
case 1:
result = "One";
break;
case 2:
result = "Two";
break;
case 3:
default:
result = "Default case";
break;
}
int number = 1;🔹 میبینید که چقد کدمون رو کوتاهتر و خواناتر کرده.
string result = number switch
{
1 => "One",
2 => "Two",
_ => "Default case"
};
#Tips
👤 MHReza
💎 Channel: @DevelopixCSharp
👍19❤5🔥2
معرفی کتابخانه RazorSlices
این کتابخانه یک
برای شروع:
1.کتابخانه را نصب کنید
1.پشتیبانی از
#asp #razor
👤 QWxp
💎 Channel: @DevelopixCSharp
این کتابخانه یک
template سبک و سریع برای asp.net core minimal api ساخته شده، بدون نیاز به استفاده از MVC، بهینه شده برای رندر کردن HTML در Razor یا Blazor.برای شروع:
1.کتابخانه را نصب کنید
$ dotnet add package RazorSlices
2.یک دایرکتوری به نام Slices توی پروژتون ایجاد کنید، و داخل اون یک فایل به نام ViewImports.cshtml_ با این محتوا ایجاد کنید:@inherits RazorSliceHttpResult3. یک
@using System.Globalization;
@using Microsoft.AspNetCore.Razor;
@using Microsoft.AspNetCore.Http.HttpResults;
@tagHelperPrefix disable_tagHelpers:
@removeTagHelper *, Microsoft.AspNetCore.Mvc.Razor
cshtml.* دیگه داخل دایرکتوری Slices ایجاد کنید :@inherits RazorSliceHttpResult<DateTime>4.حالا به راحتی داخل
<p>
Hello from Razor Slices! The time is @Model
</p>
minimal api اتون صفحات HTML رو رندر کنید:app.MapGet("/hello", () => Results.Extensions.RazorSlice("/Slices/Hello.cshtml", DateTime.Now));
🧷درحال حاضر موارد زیر در این کتابخانه پشتیبانی نمیشند:1.پشتیبانی از
AOT
2.پشتیبانی از Hot Reload
3.پشتیبانی از Layout ها و Section ها#asp #razor
👤 QWxp
💎 Channel: @DevelopixCSharp
👍9
توصیه میکنم این پلیلیست رو در یوتیوب حتماً دنبال کنید.
مطالب خوبی در مورد EF Core منتشر میکنه.
🔗 لینک
👤 MHReza
💎 Channel: @DevelopixCSharp
مطالب خوبی در مورد EF Core منتشر میکنه.
🔗 لینک
👤 MHReza
💎 Channel: @DevelopixCSharp
👍10
احتمالا شده که خواستید یه کدی رو تست کنید، ولی نمیخواید به خاطرش به پروژه ایجاد بکنید. ابزار
این ابزار بهتون کمک میکنه کدتون رو توی محیط کامند لاین تست کنید. برای نصبش میتونید دستور
رو داخل ترمینالتون وارد کنید.
با وارد کردن دستور
اگه بخواید پکیجی رو هم نصب کنید با این دستور میتونید اون رو نصب کنید، برای مثال دستور زیر رو ببینید:
با این دستور پکیج Newtonsoft.Json براتون نصب میشه
برای اطلاعات بیشتر در مورد این ابزار میتونید به صفحه گیتهابش مراجعه کنید و بیشتر در موردش مطالعه کنید.
👤 MHReza
💎 Channel: @DevelopixCSharp
CSharpRepl اینجا بدردتون میخوره.این ابزار بهتون کمک میکنه کدتون رو توی محیط کامند لاین تست کنید. برای نصبش میتونید دستور
dotnet tool install -g csharprepl
رو داخل ترمینالتون وارد کنید.
با وارد کردن دستور
csharprepl وارد محیط کامند لاین میشید و میتونید هر کدی رو بنویسید.اگه بخواید پکیجی رو هم نصب کنید با این دستور میتونید اون رو نصب کنید، برای مثال دستور زیر رو ببینید:
#r "nuget: Newtonsoft.Json"
با این دستور پکیج Newtonsoft.Json براتون نصب میشه
برای اطلاعات بیشتر در مورد این ابزار میتونید به صفحه گیتهابش مراجعه کنید و بیشتر در موردش مطالعه کنید.
👤 MHReza
💎 Channel: @DevelopixCSharp
👍12🔥3❤1