در قسمت قبلی این مقاله، با مفاهیم تئوری برنامه نویسی تابعی آشنا شدیم. در این مطلب قصد دارم بیشتر وارد کد نویسی شویم و الگوها و ایدههای پیاده سازی برنامه نویسی تابعی را در #C مورد بررسی قرار دهیم.
Immutable Types
هنگام ایجاد یک Type جدید باید سعی کنیم دیتای داخلی Type را تا حد ممکن Immutable کنیم. حتی اگر نیاز داریم یک شیء را برگردانیم، بهتر است که یک instan ...
آشنایی
این قسمت از مقاله به ایده اصلی برنامه نویسی تابعی و دلیل وجودی آن خواهد پرداخت. هیچ شکی نیست که بزرگترین چالش در توسعه نرم افزارهای بزرگ، پیچیدگی آن است. تغییرات همیش اجتناب ناپذیر هستند. به خصوص زمانی که صحبت از پیاده سازی امکان جدیدی باشد، پیچیدگی اضافه خواهد شد. در نتیجه منجر به سخت شدن فهمیدن کد میشود، زمان توسعه را بالاتر میبرد و باگهای ناخواسته را به وجود خواهد آورد. همچنین تغییر هر چیزی در دنیای نرم افزار ب ...
در قسمت قبل دیدیم که انجام کارهای همزمان، با Objectهایی که به اصطلاح Thread Safe نیستند (مانند DbContext) خروجی چندان جالبی ندارد و برای مثال اگر در یک Service یک DbContext را Inject کنیم (مثلا با Constructor injection) و از آن در متدی استفاده کنیم که آن متد یا با TPL یا RX و ... به صورت چندتایی و همزمان اجرا شود، DbContext به مشکل میخورد ؛ یعنی نمیتوان یک وهله از DbContext را بین چند Thread همزمان پردازش موازی، به اشتراک گذاشت. ...
آیا تا به حال لیستی از دیتا داشتهاید که بخواهید بر روی آنها کاری را انجام دهید؟ مثلا لیستی از مشتریان که باید برای تک تک آنها Pdf ای را بسازید، یا لیستی از مشتریان که باید برای تک تک آنها بیمه نامه صادر کنید، یا مثلا لیست اطلاعات بلیطهای قابل فروش را گرفتهاید و برای تک تک آنها میخواهید کمیسیون حساب کنید و ... در اکثر مواقعی کاری که برای تک تک آیتمها قرار است انجام شود، ساده است و با استفاده از یک حلقه foreach کار تمام میشود. ...
هنگامیکه خطاهای غیر منتظرهای در برنامهی مدیریت شدهی شما رخ میدهند، شما اطلاعات کمی را در مورد این مساله دارید. اگرچه شما میتوانید تا حدودی جلوی این نوع خطاهای غیرمنتظره را با ابزارهای خطایابی و یا لاگر، رصد کنید ولی همیشه اینطور نیست؛ در این حال ذخیره، تجزیه و تحلیل Dumpهای حافظه، ممکن است آخرین گزینه برای شما باشد. خوشبختانه ویژوال استودیو، ابزاری عالی برای تجزیه و تحلیل Dumpهای حافظه است! در این مطلب به شما نشان میدهیم که چگونه ...
فرض کنید اسمبلی A که System.Drawing.Common، نام دارد، فضای نام System.Drawing.Common را ارائه میدهد و اسمبلی B که CoreCompact.System.Drawing نام دارد، باز هم دقیقا همان فضای نام را ارائه میدهد. سؤال: آیا میتوان از این دو اسمبلی مختلف در برنامهی خود استفاده کرد؟ یا مثال دیگر آن داشتن دو اسمبلی با نگارشهای مختلف، از یک کتابخانه است. برای مثال یکی بر اساس netcoreapp2.1 تهیه شدهاست و دیگری بر اساس netstandard2.0 و به هر دلیلی نیاز است که ...
امکان تعریف نوعهای شمارشی async در C# 8.0
فرض کنید قصد دارید یک متد async از نوع IEnumerable را که تعدادی yield return به تاخیر افتاده را به همراه دارد (yield returnها فقط زمانی اجرا میشوند که بر روی آنها متدهایی مانند ToList و یا حلقهی foreach اجرا شوند) و همچنین توسط await Task.Delay، دریافت اطلاعات به صورت async را نیز شبیه سازی میکند، تهیه کنید: public struct Statement
{
public int Id { get; }
publ ...
یکی دیگر از ویژگیهای جدید C# 8.0، پشتیبانی از using declarations (اعلانهای using) در مقابل using statements (عبارات using) پیشین است که سبب میشود بتوان کدهای کمتری را برای تعریف آنها نوشت. مثالی از using declarations
تا پیش از C# 8.0، روش متداول کار با عبارات using به صورت زیر است و به آن استفاده از using statements گفته میشود: class Program
{
static void UsingOld()
{
...
در نگارشهای پیشین #C ، بهبودهایی در زمینهی Pattern matching وجود داشتند. در نگارش 8 نیز این بهبودها ادامه پیدا کردهاند که نتیجهی آن بهوجود آمدن روش جدیدی برای نوشتن عبارات switch است.
معرفی روش جدید نوشتن عبارات switch در C#8.0
فرض کنید یک enum که معرف تعدادی رنگ است را تعریف کردهایم: public enum Rainbow
{
Red,
Orange,
Yellow,
Green,
Blue, ...