C# Programming Guide
193 subscribers
113 photos
9 videos
14 files
102 links
سلام دوستان در این کانال نکاتی در مورد مسائل پیشرفته در سی شارپ ارائه میشه که مربوط به بیش از 15 سال تجربه ی کاری من هست.
ممنون از اینکه دنبال میکنید.
اگر نکات خاصی به ذهنتون رسید با ادمین در میون بذارید
تماس با ادمین:
@Ali_Visual_Studio
Download Telegram
یکی از قابلیت هایی که جدیدا به سیگنالگو اضافه شده قابلیت جنریت کردن خروجی های سرویس ها برای سمت کلاینت با قابلیت حفظ نام برای Value Tuple های سی شارپ 7 هست.توی این نسخه نام های ValueTuple ها موقعی که برای سمت کلاینت جنریت میشن حفظ میشن و زیبایی کد ها حفظ میشه
@csharptips
ویدئوی آموزش سیگنالگو در لینوکس که توسط دوست و همکار عزیزم آقای سعید رضایی @mrgrayhat ساخته شده که میتونید توسط این آموزش یاد بگیرید که توی لینوکس چطوری یک سرور و کلاینت سیگنالگو رو با ویژوال استادیو کد و سیگنالگو کد جنریتور بسازید.

https://www.youtube.com/watch?v=WzbYpTiH2L8
کانال رسمی Signalgo Publisher :
پروژه ای که برای مدیریت و آپلود میکروسرویس های سیگنالگو بهتون کمک میکنه و قراره جایگزینی برای Docker و kubernetes باشه.بخش هایی که تا به امروز انجام شده و قابل استفاده است:
1.کامپیل کردن پروژه
2.اجرای تست های پروژه
3.پابلیش کردن پروژه روی سرور در صورت ی که تست ها Pass بشن
4.میتونید سرور های مختلفی داشته باشید، مثلا سرور های تست و اصلی که روی هر کدوم خواستید سلوشن هاتون رو پابلیش کنید.
5.و خیلی امکانات دیگه

هدف این بوده که برنامه نویس ها با کمترین دانش و بیشترین سرعت بتونن سرویس هاشون رو سریع روی سرور های مورد نظرشون پابلیش کنن.

https://t.iss.one/PublisherGo
#تخصصی
#پرفورمنس
#حرفه_ای
#سی_شارپ

نوع و طریقه استفاده از متغیر ها میتونه توی پرفورمنس تاثیر بسزایی داشته باشه، همه میدونیم دسترسی مقادیر به حافظه stack سریعتر از حافظه heap هست چون برای دسترسی به حافظه heap نیاز به یک اشاره گر در حافظه stack داریم در حالی که مقادیر value type ها به خودی خود اشاره به مقدار اون در حافظه stack میکنن، مثل این میمونه که شما مستقیم از شیر آب، آب بنوشید یا ابتدا آب رو توی یک لیوان بریزید سپس اون رو بنوشید. خب مسلما راه سریعتر برای سیراب شدن خوردن آب از شیر هست.

حالا شما فرض کنید میخواهید یک حلقه ای رو به تعداد ایتم های یک پروپرتی در یک کلاس بچرخونید و عملیات محاسباتی توش انجام بدید. اگر شما به این شکل حلقه رو بنویسید:

            for (int i = 0; i < test1.Items.Count; i++)
{

}


هر باری که حلقه میخواد ببینه به پایان رسیده یا نه مجبوره i رو با مقدار test1.Items.Count چک کنه و این یکم مشکل پرفورمنسی داره، چرا؟ چون توی قسمت test1 ابتدا باید یک اشاره به پوینتر کلاس توی حافظه استک کنه سپس بر اساس اون بره توی حافظه ی Heap و اشاره کنه به Items سپس اشاره کنه به Count این عملیات هر بار که شرط حلقه ی شما اجرا بشه اتفاق میوفته و شاید شما بگید چیز خاصی نیست ولی یک برنامه نویس بکند اگر هزاران خط کد اینشکلی داشته باشه که میلیون ها کلاینت دارن همزمان از این عملیات استفاده میکنن، اونوقت فاجعه افت پرفورمنس رو به وفور خواهید دید و با رعایت این مسائل براحتی میتونید پرفورمنس بهتری توی بکند داشته باشید

برای حل این مشکل باید چیکار کنیم؟

کاری که باید بکنیم اینه که ابتدا مقدار مورد نظر رو در یک حافظه Stack میریزیم.سپس به حلقه اجازه میدیم که مستقیم با همون متغیر که توی stack هست کار کنه.
به این شکل:

            int len = test1.Items.Count;
for (int i = 0; i < len; i++)
{

}


@csharptips
Forwarded from کدهک
چرا نباید از Async void استفاده کنیم؟

https://tinyurl.com/codehaks-avoid-async-void
کدهک
چرا نباید از Async void استفاده کنیم؟ https://tinyurl.com/codehaks-avoid-async-void
این دیدگاه اشتباه هست که چرا نباید از async void استفاده کنیم.چون این خودش یکی از ویژگی های سی شارپ هست، توی برنامه نویسی Multi-Threading وقتی شما به صورت دستی یک Thread میسازید اگر توی اون ترد عملیات try catch انجام نداده باشید هم با خطای unhandle exception مواجه میشید و اپلیکیشن شما کرش میکنه و کاملا متوقف میشه هرچند با روش هایی میشه حتی unhandle exception ها رو هم هندل کرد.اما هیچ برنامه نویس Multi-Threading ای نمیاد یک ترد رو بدون try catch اجرا کنه تا با این خطا مواجه بشه در نتیجه استفاده از async void مستقیم هیچ اشکالی نداره که هیچ خیلی جاها هم کاربرد داره منتهی باید حواستون باشه که توی تابع باید از try catch استفاده کنید تا هنگام مواجه شدن با خطای unhandle exception خطا رو catch کرده باشید.

#csharp
#multi_threading

@csharptips
#تخصصی
#پرفورمنس
#حرفه_ای
#سی_شارپ

فرق struct ها با ref struct ها توی اینه که ref struct ها همون struct هستن با این تفاوت که در زمان کامپایل، کامپایلر سی شارپ به شما اجازه نمیده طوری کد بزنید که struct رو بفرستید توی heap و تضمین میکنه که همیشه متغیر شما توی stack قرار بگیره، چه وقتهایی struct ها در heap قرار میگیرن؟ وقتی که اونارو توی کلاس یا ارایه قرار میدین یا ... در نتیجه شما نمیتونید ref struct ها رو طوری تعریف کنید که توی heap قرار بگیرن و وقتی یک نوع ref struct تعریف میکنید خیالتون راحته که اون همیشه توی stack قرار میگیره و کامپایلر نمیذاره که اشتباها اونو توی heap بفرستید.
اگر میخواهید پیچیدگی یک معماری و یک پروژه رو بسنجید، اونو به یک برنامه نویس حرفه ای نشون ندید، به یک تازه کار نشون بدید.

پ.ن: میزان فهم و سرعت یادگیری یک برنامه نویس تازه کار از معماری پروژه شما، سادگی یا پیچیدگی پروژه شمارو مشخص خواهد کرد.
#DependencyInjection
This media is not supported in your browser
VIEW IN TELEGRAM
مقاله ای نوشتم با عنوان اشکالاتی که به دیزاین Solid وارد هست.گاهی اوقات فکر میکنیم اگر چیزی به عنوان استاندارد تعریف شد پس قاعدتا باید درست باشه، بنظر من فقط برای اینه که طرفدار بیشتر جمع کنیم وگرنه هیچ چیزی استاندارد نیست چون جهان در حال تغییر هست، و اگر استاندارد ها چیز هایی نیستند که ثابت باشند در نتیجه بهتره همیشه با منطق انتخاب کنیم تا در مقابل چیزی که نسبت بهش اطلاع نداریم بگیم این یک استاندارده و همه ازش استفاده میکنن!
@CsharpTips
آگر در نوع کوئری زدن ها و واکشی داده از دیتابیس، تعداد Include های یک کوئری خیلی زیاد باشد یعنی ساختار دیتابس شما نباید Relational و SQL باشد و باید از NoSQL استفاده کنید.
@csharptips
Make generic client services in SignalGo that will help you to remove duplicate classes with the same methods

با استفاده از نسخه جدید سیگنالگو میتوانید سرویس های کلاینت را به صورت جنریک بسازید تا از تکرار شدن کلاس های سرویس ها با توابع یکسان جلوگیری کنید
@csharptips
بنابه دلایلی مجور شدیم توی یکی از پروژه هامون از کد جنریتور swagger در یکی از پروژه های ABP استفاده کنیم، وقتی اینکار رو کردیم تازه متوجه شدیم چقدر ما مباحث و مشکلات رو توی سیگنالگو و کدجنریتورش دیدیم و حل کردیم، مشکلاتی از جمله مدیریت فضای نام ها، skip کردن dll ها و حتی replace کردن فضای نام ها، ساپورت کامل Generic ها در انواع خروجی ها و اینکه به برنامه نویس این اجازه رو دادیم تا خروجی مورد نظرش رو هرجور دوست داره بسازه و حتی توی کد جنرتور انگولار و سی شارپ وقتی از سوئگر استفاده کردیم همیشه باید یه سری ویرایش ها انجام میدادیم به خاطر اشتباهات و باگ هایی که داره و حتی از حوصله ما خارجه بخوایم بریم باگ های سوئگر رو رفع کنیم در حالی که سیگنالگو همه ی این نیاز های مارو برطرف میکرد و توسعه دهندش خودمون بودیم و رفع باگهاش هم برامون بسیار راحت بود.
مباحثی مثل تغییر پروتکل ها و استفاده استاندارد و دقیق توی تست کیس ها که به طور 100% مباحث Type safe توش رعایت شده باشه، یکی از دغدغه های ما بود که واقعا توی این زمینه موفق عمل کردیم و امیدوارم یه روزی بتونیم این رو با حمایت برنامه نویسان جهانی کنیم.
کارهایی که ما توی مدیریت Generic ها کردیم حتی هنوز توی فیچر لیست های asp core و سوئگر نیستند و اینکه بتونیم با کمترین میزان کد زدن میکروسرویس هارو پیاده سازی کنیم و خیالمون از کمتر و کمتر شدن باگ ها راحت باشه.
البته منظورم از میکروسرویس ها ساختار استاندارد و عمومی ای که وجود داره نیست، در ساختاری که ما ساختیم چیزی به نام Core وجود داره و عجیب اینکه هرجا توی ساختار به پیچیگی خوردیم برای ما به صورت منطقی مشکلات رو حل و فصل کرد و مارو قانع کرد که این ساختار صحیحه.
به محض Stable شدن ساختاری میکروسرویس های خودمون، حتما کتابی منتشر خواهم کرد و اونو توضیح میدم و متوجه over engineering و فاجعه ای به نام Dependency Injection در زبان برنامه نویسی سی شارپ (و دیگر زبان های Type safe) خواهید بود که امروز بسیار از اهدافش دور شده و زبان برنامه نویسی سی شارپ با کپی کردن از دیگر زبان ها داره با فیچر ها خودش رو نگه میداره، اما ساختار های سمی ای که از شرکت های بسیار بزرگی مثل مایکروسافت حمایت شده باعث شده برنامه نویسان چشم بسته ساختار هاش رو بپذیرن و حتی به خودشون اجازه نقد و انتقاد به ساختار های شرکت هایی مثل گوگل و مایکروسافت و فیسبوک ندن. البته من متوجه این موضوع شدم که ماها موش های آزمایشگاهی در گیتهاب برای اونها هستیم.تعبیر درستی نیست ولی اینکه هر سال معماری ها رو تغییر میدن و مارو از این شاخه به اون شاخه منتقل میکنن یعنی هنوز به یک سیستم و ساختار یکپارچه نرسیدن و دارن از ما استفاده میکنن و متوجه اش نیستیم و خوشحالیم که هر بار تکنولوژی جدید معرفی میکنن در حالی که از ما زمان برای یادگیری میگیرن.

@csharptips
شاید توی سی شارپ 9 قابلیت Record زیاد به چشمتون بیاد و بلافاصله بخواید ازش استفاده کنید، بذارید چند تا نکته رو بهتون قبل از استفاده از این قابلیت گوشزد کنم:

1.سی شارپ یک زبان Strongly Type هست، رفتن سی شارپ به سمت قابلیت هایی که در زبان های پایتون و جاوا اسکریپت و php و دارت و دیگر زبان های داینامیک برای راحت کد زدن وجود داره به معنی خوب بودن اون قابلیت ها نیست بلکه یک سیاست توی سی شارپ برای جذب مشتری و دولوپر های بیشتر هست، بنابراین اینکه شما یک کلاس رو توی سی شارپ اینطوری بنویسید:
public record Person (string Name,int Age);

توانایی کامنت گذاری برای پارامتر ها رو نخواهید داشت و از مولفه اصلی تمیز کد زدن فاصله میگیرید.

2.این قابلیت یک مشکل پروفورمنسی داره و علتش اینه که با اشاره گر ها کار نمی کنه و تمامی پارامتر ها رو موقع Equal مورد بررسی قرار میده، در نتیجه وقتی جایی از برنامه میخواد برابر بودن اون رو با یک آبجکت دیگه مورد بررسی قرار بده کلیه پارامتر ها رو بررسی میکنه، شاید برای برنامه نویسی رابط کاربری مهم نباشه اما توی برنامه نویسی بک اند و رکوئست های زیاد و همزمان پرفورمنس رو تحت تاثیر قرار میده.

3.زبان برنامه نویسی سی شارپ یکمی داره از اون هدف اصلیش دور میشه و به جای متمرکز شدن روی قابلیت های Strongly Type سعی در این داره که شبیه زبان های دیگه بشه بهمین علت شما در نسخه های اخیر بدون نوشتن کلاس و متد Main مثل پایتون میتونید با یکی دو خط کد برنامه سازی کنید.بنابراین سعی کنید از همه ی قابلیت های سی شارپ استفاده نکنید چون اکثرشون برای آموزش راحت تر به دانش آموزان و رقابت با زبان های برنامه نویسی دیگه ساخته میشه و شاید کاربرد آنچنانی نداشته باشه جز اینکه زبان برنامه نویسی رو پیچیده تر کنه.

@CSharpTips
دو تا از مهمترین مولفه هایی که Dependency Injection باعث کندی پرفورمنس توی سیستم شما و شلخته شدن معماری پروژه شما میشه اینا هستند:

1.شما در یک کلاس سرویس دوتا interface رو inject میکنید در حالی که ممکنه در بعضی از سرویس هاتون (متد هاتون) از اونا استفاده نکنید.این یعنی بخواید نخواید اون Dependency توی constructor کلاس inject خواهد شد و علاوه بر اینکه اینکار یک سربار اضافه بر روی سرویس های شماست حتی اینکه چرا از اون کلاس inject شده استفاده نمی کنید ولی اونو inject میکنید و یا در فیلد های کلاس شما هست خودش مساله هست که معماری سیستم شمارو زیر سوال میبره.بنابراین راه کار اینه که کلاسیرو inject کنید که حتما از اون توی تمامی سرویس ها استفاده میکنید یا اگر نمی کنید توابع رو در یک سرویس جداگانه بزنید که این عمل هم خودش ممکنه باعث زیاد شدن کلاس های سرویس ها به ازای هر interface ای که inject میکنید بشه.

2.به طور کلی استفاده از عملیات runtime برای instance گرفتن کلاس ها از طریق Activator.CreateInstance و روش های دیگه ی Runtime چندین برابر نسبت به عملیات کامپایل تایم کند هست.یعنی شما اگر به صورت دستی یک کلاس رو new کنید صد ها برابر سریعتر از کلاسی هست که به صورت runtime در حافظه new میشه.در Dependency Injection به طور کاملا صد در صد کلاس های سرویس شما به ازای هر بار صدا زدن توسط Activator در حافظه new میشن و همونجا هم constructor هایی که باید inject بشن هم new یا به صورت cache توی اون کلاس inject میشن نمیتونم بگم این عملیات چقدر کند هست اما وقتی این اتفاق توی بک اند کم کم اتفاق میوفته به قول معروف قطره قطره جمع شود وانگهی دریا شود، سیستم شما رو بشدت کند میکنه و شما کماکان دنبال کدهایی در ساختار خودتون برای بالا بردن پرفورمنس میگردید در حالی که مشکل از جای دیگه آب میخوره.

#CSharp
#Dependency_Injection
@CsharpTips
SignalGo 5.0 Performance vs Asp Net Core 5.0
Without JsonGo and version 6.0

1000 request concurrent

------
SignalGo Self Host Net Core 3.1 Debug:
------
TotalTime: 7591.359 ms
finish Success :1000 Fail :0
Success Min Time: 433 ms
Success Max Time: 7564 ms
______________________________________

------
Asp Core Self Host Net 5.0 Release
------
TotalTime: 15128.056 ms
finish Success :1000 Fail :0
Success Min Time: 1591 ms
Success Max Time: 15094 ms
______________________________________

------
Asp Core Self Host Net 3.1 Release
------
TotalTime: 26935.405 ms
finish Success :1000 Fail :0
Success Min Time: 1698 ms
Success Max Time: 26917 ms
______________________________________
آیا شما از سیگنالگو استفاده می کنید؟ Are you using SignalGo?
anonymous poll

بله Yes – 5
👍👍👍👍👍👍👍 29%

خیر No – 5
👍👍👍👍👍👍👍 29%

در آینده استفاده می کنم I will use in the future – 4
👍👍👍👍👍👍 24%

قبلا استفاده می کردم I already use – 3
👍👍👍👍 18%

👥 17 people voted so far.
Koochamoon ~ Music-Fa.Com
Ehsan Daryadel ~ Music-Fa.Com
یه جوری کد میزنی انگاری که دیرته
نوشتن باگهاتم جزئی از تقدیرته

میون همه ی کدهات کامنت هاتم جا میذاری
رو صندلیت لم و دادی و نسکافه نزدیکته
باگ پیچیده ای، تو آی دی ایت پهن باشه
از پشت میز نگام کنی وقتی کارت لنگ باشه
جای تند تند کد زدن کمی تامل میدونی
مهربون باش فکر نمی کنم کارت سخت باشه

چی میشه باگ هاتو رفع بکنی
همه ی تست هاتو پس بکنی

تقصیر من چیه آرزوش این شده
کارتو تموم کنم بعد خودکشی
تو سال 2017 وقتی بک اند برخی پروژه هامون رو با WCF زدیم و خواستیم کلاینت اندروید هم داشته باشیم، در نتیجه تصمیم گرفتیم کلاینت اندروید رو با جاوا بزنیم و وقتی زدیم متوجه شدیم WCF به صورت Duplex کلاینت های جاوا رو ساپورت نمی کنه، کار سخت شد شروع کردیم تحقیق کردن و مجبور شدیم ابزار رو عوض کنیم در نتیجه SignalR رو انتخاب کردیم، سیگنال آر گزینه خوبی بود و تا جای ممکن کارمون رو راه انداخت اما توی اسکیل های بزرگ تر به مشکلات جبران ناپذیری خوردیم که دیگه برامون پروژه قابل توسعه نبود، پیشنهاد دادم به مدیرمون که میتونیم خودمون ابزاری بسازیم که ارتباط بین کلاینت و سرور رو خودمون مدیریت کنیم، بعد از موافقت مدیریت شروع به ساختن پروژه ی SignalGo کردیم و تا به امروز خیلی پروژه ها رو باهاش توسعه دادیم همه نقطه ضعف ها و مشکلاتی که داشت رو حل و رفع کردیم و همچنان در حال توسعه اون هستیم.
حالا امروز بعد از انتشار دات نت 5 میبینم که WCF دیگه توسعه داده نمیشه و مایکروسافت به طور مستقیم دیگه از اون پشتیبانی نمی کنه.
حالا ابزار های سیگنالگو با بیش از 60 هزار دانلود توی nuget مایکروسافت همچنان با قدرت ادامه میده 👌💪💪
#به_ما_بپیوندید