<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های میلاد نعمت پور</title>
        <link>https://virgool.io/feed/@miladnowshahr</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 19:37:42</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/286668/avatar/5HVq5M.png?height=120&amp;width=120</url>
            <title>میلاد نعمت پور</title>
            <link>https://virgool.io/@miladnowshahr</link>
        </image>

                    <item>
                <title>تفاوت میان First و FirstOrDefault و Single و SingleOrDefault و Last و LastOrDefault</title>
                <link>https://virgool.io/netcore/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D9%85%DB%8C%D8%A7%D9%86-first-%D9%88-firstordefault-%D9%88-single-%D9%88-singleordefault-%D9%88-last-%D9%88-lastordefault-giabthprkj49</link>
                <description>همه این 6 متدها یک مقدار  از یک توالی را برمیگردانند و می توانند با predicate یا بدون predicate باشد. First:اولین عنصر از یک توالی یا اولین عنصر را که توسط predicate برابر باشد، بر میگرداند. اگر در یک توالی هیچ عنصری وجود نداشته باشد از InvalidOperationException خوانده میشود و پیام : &quot;Sequence contains no elemts&quot; به کاربر نمایش داده می شود. اگر نوع predicate  با یکی از عناصر توالی  برابر نباشد در این صورت باز InvalidOperationException فراخوانی شده و پیام  &quot;Sequence contains no matching element&quot; نمایش داده می شود. // Returns &amp;quota&amp;quot:
 new[] { &amp;quota&amp;quot }.First();  

// Returns &amp;quota&amp;quot:
 new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.First(); 

 // Returns &amp;quotb&amp;quot: 
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.First(x =&gt; x.Equals(&amp;quotb&amp;quot));  

// Returns &amp;quotba&amp;quot: 
new[] { &amp;quotba&amp;quot, &amp;quotbe&amp;quot }.First(x =&gt; x.Contains(&amp;quotb&amp;quot));  

// Throws InvalidOperationException: 
new[] { &amp;quotca&amp;quot, &amp;quotce&amp;quot }.First(x =&gt; x.Contains(&amp;quotb&amp;quot));  

// Throws InvalidOperationException:
 new string[0].First();FirstOrDefault:اولین عنصر از توالی یا اولین عنصری که برابر باشد predicate را برمیگرداند. اگر مقدار predicate برابر نباشد یا هیچ عنصری در توالی نباشد در این صورت مقدار default(T) را بر میگرداند. // Returns &amp;quota&amp;quot:
new[] { &amp;quota&amp;quot }.FirstOrDefault();

// Returns &amp;quota&amp;quot:
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.FirstOrDefault();

// Returns &amp;quotb&amp;quot:
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.FirstOrDefault(x =&gt; x.Equals(&amp;quotb&amp;quot));

// Returns &amp;quotba&amp;quot:
new[] { &amp;quotba&amp;quot, &amp;quotbe&amp;quot }.FirstOrDefault(x =&gt; x.Contains(&amp;quotb&amp;quot));

// Returns null:
new[] { &amp;quotca&amp;quot, &amp;quotce&amp;quot }.FirstOrDefault(x =&gt; x.Contains(&amp;quotb&amp;quot));

// Returns null:
new string[0].FirstOrDefault();Last:آخرین عنصر موجود در توالی یا آخرین عنصری که در  predicateبرابر باشد را برمیگرداند. اگر هیچ عنصری در توالی موجود نبود &quot;InvalidOperationException&quot; فراخوانی و پیام &quot;Sequence contains no elemets&quot; نمایش داده می شود. اگر هیچ عنصری وجود نداشت که برابر با مقدار predicate  باشد باز &quot;InvalidOperationException&quot; و پیام &quot;Sequence contains no matching element&quot; نمایش داده می شود. // Returns &amp;quota&amp;quot:
 new[] { &amp;quota&amp;quot }.Last();  

// Returns &amp;quotb&amp;quot:
 new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.Last();  

// Returns &amp;quota&amp;quot: 
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.Last(x =&gt; x.Equals(&amp;quota&amp;quot));  

// Returns &amp;quotbe&amp;quot: 
new[] { &amp;quotba&amp;quot, &amp;quotbe&amp;quot }.Last(x =&gt; x.Contains(&amp;quotb&amp;quot)); 

 // Throws InvalidOperationException: 
new[] { &amp;quotca&amp;quot, &amp;quotce&amp;quot }.Last(x =&gt; x.Contains(&amp;quotb&amp;quot));  

// Throws InvalidOperationException:
 new string[0].Last();LasrOrDefault:این متد همانند FirsrOrDefault می باشد اما برخلاف First که اولین را برمیگرداند این متد آخرین را برمیگرداند. // Returns &amp;quota&amp;quot:
new[] { &amp;quota&amp;quot }.LastOrDefault();

// Returns &amp;quotb&amp;quot:
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.LastOrDefault();

// Returns &amp;quota&amp;quot:
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.LastOrDefault(x =&gt; x.Equals(&amp;quota&amp;quot));

// Returns &amp;quotbe&amp;quot:
new[] { &amp;quotba&amp;quot, &amp;quotbe&amp;quot }.LastOrDefault(x =&gt; x.Contains(&amp;quotb&amp;quot));

// Returns null:
new[] { &amp;quotca&amp;quot, &amp;quotce&amp;quot }.LastOrDefault(x =&gt; x.Contains(&amp;quotb&amp;quot));

// Returns null:
new string[0].LastOrDefault();Single:اگر در توالی دقیقا یک عنصر وجود داشت یا مقدار predicate دقیقا برابر با یک عنصر از توالی باشد در آن صورت آن عنصر را برمیگرداند. اگر در توالی هیچ عنصری وجود نداشت یا هیچ عنصری برابر با مقدار predicate  نبود در ان صورت &quot;InvalidOperationException&quot; فراخونی و پیام &quot;Sequence contains no elements&quot; نمایش داده می شود. اگر در توالی بیش از یک عنصر باشد یا مقدار predicate بیش از یک عنصر را انتخاب کند &quot;InvalidOperationException&quot;  فراخوانی و پیام &quot;Sequence contains more than one element&quot; نمایش داده می شود. // Returns &amp;quota&amp;quot:
new[] { &amp;quota&amp;quot }.Single();

// Throws InvalidOperationException because sequence contains more than one element:
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.Single();

// Returns &amp;quotb&amp;quot:
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.Single(x =&gt; x.Equals(&amp;quotb&amp;quot));

// Throws InvalidOperationException:
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.Single(x =&gt; x.Equals(&amp;quotc&amp;quot));

// Throws InvalidOperationException:
new string[0].Single();

// Throws InvalidOperationException because sequence contains more than one element:
new[] { &amp;quota&amp;quot, &amp;quota&amp;quot }.Single();SingleOrDefault:اگر در توالی دقیقا یک عنصر وجود داشت یا مقدار predicate دقیقا برابر با یک عنصر از توالی باشد در آن صورت همان عنصر را برمیگرداند. اگر در توالی هیچ عنصری وجود نداشت یا هیچ عنصری برابر با مقدار predicate  نبود در آن صورت Default(T) برگشت داده می شود. اگر در توالی بیش از یک عنصر باشد یا مقدار predicate بیش از یک عنصر را انتخاب کند &quot;InvalidOperationException&quot;  فراخوانی و پیام &quot;Sequence contains more than one element&quot; نمایش داده می شود.// Returns &amp;quota&amp;quot:
new[] { &amp;quota&amp;quot }.SingleOrDefault();

// returns &amp;quota&amp;quot
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.SingleOrDefault(x =&gt; x == &amp;quota&amp;quot);

// Returns null:
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.SingleOrDefault(x =&gt; x == &amp;quotc&amp;quot);

// Throws InvalidOperationException:
new[] { &amp;quota&amp;quot, &amp;quota&amp;quot }.SingleOrDefault(x =&gt; x == &amp;quota&amp;quot);

// Throws InvalidOperationException:
new[] { &amp;quota&amp;quot, &amp;quotb&amp;quot }.SingleOrDefault();

// Returns null:
new string[0].SingleOrDefault();</description>
                <category>میلاد نعمت پور</category>
                <author>میلاد نعمت پور</author>
                <pubDate>Sat, 19 Dec 2020 13:33:44 +0330</pubDate>
            </item>
                    <item>
                <title>When in C#</title>
                <link>https://virgool.io/netcore/whenincsharp-kzwv2mfsvarb</link>
                <description>کلمه کلیدی when اولین بار در C#6  و برای کار با Exceptionها اضافه شدقبل از معرفی when، برای مدیریت خطاها  از یک بلاک catch برای انواع exceptionها استفاده می کردیم اما با اضافه شدن این کلمه کلیدی امکان کنترل بهتری برای ما فراهم شد.برای استفاده از when ، به بلاک catch، کلمه کلیدی when اضافه می کنیم. بلاک catch نیز زمانی استفاده می شود که شرط when صحیح باشد. همانند مثال زیرprivate void CatchException(Action action)
{
    try
      {
         action.Invoke();
      }
       // exception filter
       catch (Exception ex) when (ex.Message.Contains(&amp;quotwhen&amp;quot))
         {
            Console.WriteLine(&amp;quotCaught an exception with when&amp;quot);
         }
          catch (Exception ex)
         {
       Console.WriteLine(&amp;quotCaught an exception without when&amp;quot);
         }
}--------------------------------از آنجاییکه که ورودی متد CatchException ما از نوع action می باشد این متد ها را می سازیم با یک دستور که خطای دستی ایجاد کنیمprivate void Method1() { throw new Exception(&amp;quotmessage for exception with when&amp;quot); }private void Method2() { throw new Exception(&amp;quotmessage for general exception&amp;quot); }--------------------------------در متد main متد catchException را فرا میخوانیمCatchException(Method1);CatchException(Method2);</description>
                <category>میلاد نعمت پور</category>
                <author>میلاد نعمت پور</author>
                <pubDate>Tue, 08 Dec 2020 14:22:16 +0330</pubDate>
            </item>
                    <item>
                <title>Exception Filter - فیلتر استثنائات</title>
                <link>https://virgool.io/@miladnowshahr/exception-filter-%D9%81%DB%8C%D9%84%D8%AA%D8%B1-%D8%A7%D8%B3%D8%AA%D8%AB%D9%86%D8%A7%D8%A6%D8%A7%D8%AA-llfvg5tnh5i4</link>
                <description>فیلتر استثنائات به شما اجازه می دهد بدون اینکه در کدتون از بلاک try..catch استفاده کنید می توانید برای نمایش خطاها در هر متدی از این روش استفاده کنید.فیلتر استثنائات را می توانید بر روی کنترلر، متدهای اکشن،مدل صفحه(razor page) و همچنین متدهای هندلر اعمال کنید. زمانی که استثنائات توسط اندپوینت(end point)یا اکشن، پیچ و result filter مدیریت نشده باشند بر روی اندپوینت اعمال می شود.Exception filter  از اینترفیس IExceptionFilter  پیاده سازی می شوند.Namespace Microsoft.AspNetCore.Mvc.Filters 
{
     Public interface IExceptionFilter:IFilterMetadata
     {
         void OnException(ExceptionContext context);
     }
 }متد OnExceptionAsync از نوع غیرهمزمان و متد OnException از اینترفیس IExceptionFilter زمانی خوانده می شوند که مدیریت خطای هندل نشده وجود داشته باشد. هر دو اینترفیس ها از ExceptionContext  گرفته می شوند که خود آن از filtercontext مشتق شده است.ساخت یک فیلتر استثنافیلترهای استثنا می توانند از یک فیلتر  یا از طریق اینترفیس های  IExcptionFilter یا IAsyncException مشتق شوند. در صفحع خطا برای خطای خاص از فیلتر استثنا استفاده می شود تا به وسیله آن کاربر بتواند اطلاعات مفیدی را به دست آورد.یک پوشه جدید به نام فیلتر  و در آن یک فایل به نام RangeExceptionAttribute ایجاد کنید کدهای زیر را در آن بنویسید:using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using System;
namespace WebApp.Filters
{
       public class RangeExceptionAttribute : ExceptionFilterAttribute {
       public override void OnException(ExceptionContext context) {
       if (context.Exception is ArgumentOutOfRangeException) {
       context.Result = new ViewResult() {
               ViewName = &amp;quot/Views/Shared/Message.cshtml&amp;quot,
               ViewData = new ViewDataDictionary(
               new EmptyModelMetadataProvider(),
               new ModelStateDictionary()) {Model = @&amp;quotThe data received by the application 
                cannot be processed&amp;quot}};
}}}}در کد بالا که از کلاس ExceptionFilterAttribute مشتق شده و از متد OnException استفاده می کنم که ورودی آن یک ExceptionContext می باشد در آن بررسی کردم که نوع استثنایی که هنگام خروجی به کاربر نشان می دهد اگر از نوع ArgumentOutOfRangeException بود پارامترهای شامل آدرس نام نمایش خطا و ViewData آن را برابر با متنی که می خواهیم نمایش دهیم می نویسیم.در کنترلر یا razor page  کدهای زیر را بنویسید[RangeException]
public ViewResult GenerateException(int? id)
{
      if (id == null)
      {
           throw new ArgumentNullException(nameof(id));
      } else if (id &gt; 10) {
           throw new ArgumentOutOfRangeException(nameof(id));
      } else {
           return View(&amp;quotMessage&amp;quot, $&amp;quotThe value is {id}&amp;quot);
      }
 }متد GenerateException یک ورودی اپشینال از نوع int  از درخواست url می پذیرد  ما به طور مثال یک عدد بالاتر از مقدار 10 به ان بایند می کنیم وارد بدنه if دومی خواهد شد که یک استثنا به صورت دستی ایجاد کردیم  و یک خطا از نوع ArgumentOutOfRange برای این مقدار ورودی اتفاق خواهد افتاد و چون بالای اکشن از فیلتر RangeException استفاده شده است بنابراین خطای که در فیلتر بالا نوشته ایم نمایش خواهد داد همانند تصویر زیر.</description>
                <category>میلاد نعمت پور</category>
                <author>میلاد نعمت پور</author>
                <pubDate>Sun, 06 Dec 2020 22:11:00 +0330</pubDate>
            </item>
                    <item>
                <title>کلمه کلیدی volatile در C#</title>
                <link>https://virgool.io/@miladnowshahr/%DA%A9%D9%84%D9%85%D9%87-%DA%A9%D9%84%DB%8C%D8%AF%DB%8C-volatile-zudcljx9vgjc</link>
                <description>کلمه کلیدی volatile نشان می دهد که یک فیلد ممکن است توسط چندین thread  همزمان اجرا می شوند تغییر کند. هدف اصلی از کلمه کلیدی Volatile جلوگیری از بهینه سازی کامپایلر به شرطی که تنها دسترسی یک Thread  را فرض می کند.استفاده از volatile  این  اطمینان را می دهد مقدار یک فیلد، جدیدترین مقداری است که در دسترس است و این مقدار منوط به caching نیست که مقادیر غیر فرار(non-volatile) هستند.روش خوبی است که هر متغیری را که توسط چندین thread  استفاده شود به عنوان متغیر ناپایدار علامت گذاری کنید تا از رفتارهای غیر منتظره به دلیل بهینه سازی های پشت صحنه جلوگیری کند.public class Example
{
       public int x;
       public void DoStuff()
       {   
            X=5;
            var y=x+10;
            Debug.WriteLine(“x=” x+” , y= “+y);
       }
 }در تکه کد بالا کامپایلر x=5 , y=x+10 را می خواند و تعیین میکند که این مقدار y  همیشه 15  می ماند. بنابراین در آخرین بهینه سازی کامپایلر y=15 می باشد. اگر چه متغیر x  در حقیقت از نوع عمومی می باشد و مقدار x  ممکن است توسط Threadهای دیگر در زمان اجرا تغییر کند.دیگر مقدار y=15  نمی باشد. حال متغیر  x را از نوع volatile  تعریف می کنیم:Public class Example
  { 
     Public volatile int x;
     Public void DoStuff()
     {
       x=5;
       var y=x+10;
       Debug.writeline(“x=” x+” , y= “+y);
     }
}حال کامپایلر عملیات قفل را برای فیلد x  ایجاد می کند و این اطمنیان را می دهد که مقدار کنونی x  همیشه این مقدار را برگرداند. اگر چندین Thread بر روی این فیلد بخوانند و بنویسند این اطمینان را می دهد که این مقدار کنونی همیشه برمیگرداند. volatile میتواند فقط بر روی فیلدهای کلاس و ساختار عمال شود و برای مثال زیر معتبر نمی باشدPublic void MyMethod(){
volatile int x;
} فقط می توان بر روی فیلد های زیر اعمال کرد:1- رفرنس تایپ و نوع های عمومی که رفرنس تایپ معرفی شده باشد3. نوع های شمارشی که بر اساس sbyte, byte,short,int,ushort ,uint char, float, bool3. نوع های شمارشی که بر اساس sbyte, byte, short, int, ushort, uintنکات: معمولا برای یک فیلد که چندین Thread  امکان دسترسی دارند و بدون عملیات قفل گذاری می باشند استفاده می شود.کلمه کلیدی volatile می تواند بر روی فیلدهای از نوع های رفرنس اعمال می شودنوع های دیگر از جمله double  , long نمیتوانند از ویژگی های volatile استفاده کنند زیرا خواندن و نوشتن در فیلد این نوع ها نمی توانند گارانتی کنند که اتمیک باشند. برای محافظت این نوع ها از دسترسی چند Thread از روش lock در کلاس interlocked  استفاده کنید.</description>
                <category>میلاد نعمت پور</category>
                <author>میلاد نعمت پور</author>
                <pubDate>Mon, 30 Nov 2020 23:10:42 +0330</pubDate>
            </item>
                    <item>
                <title>Static Constructor - سازنده ایستا</title>
                <link>https://virgool.io/@miladnowshahr/static-constructor-%D8%B3%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%D8%A7%DB%8C%D8%B3%D8%AA%D8%A7-c9xzcq3mfnbo</link>
                <description>سازنده ها متدهای هستند که زمانی یک نمونه کلاس ایجاد شد فراخوانی می شوند. مسولیت اصلی آنها  قرار دادن  شی جدید  را در وضعیت مفید و سازگار است.همانطور که می دانید کلاس حتما باید یک سازنده داشته باشد حتی اگر شما یک متد سازنده ایجاد نکنید فریم ورک دات نت برای کلاس یک سازنده پیش فرض ایجاد می کند.سازنده ایستا زمانی که برای اولین بار در کلاس  فراخوانی و بررسی می شود در صورت تایید به طور ثابت در نمونه های بعدی مورد استفاده قرار می گیرد.سازنده های ایستا  Thread-safe می باشند  و معمولا برای موقعیت های زیر مورد استفاده قرار می گیرند.1. در نمونه های مختلف یک کلاس به اشتراک گذاشته شود.2. ایجاد الگوی singleton public class Animal
{     
    static Animal()
    {
          Console.WriteLine(&amp;quotAnimal Initialized&amp;quot);
    }
    public Animal()
    {
          Console.WriteLine(&amp;quotAnimal created&amp;quot);
    }
    public static void StMethod()
    {
          Console.WriteLine(&amp;quotstatic method&amp;quot);
    }
}
-------------------------------------------
 static void Main(string[] args)
 {
            var animal1 = new Animal();
            var animal2 = new Animal();
           Animal.StMethod();
 }

OutPut:
///Animal Initialized
///Animal Created
///Animal Created
////static methodهمانطور که مشاهده می کنید خروجی این تکه کد فقط یک بار سازنده ایستا فراخوانی می شود.برای الگوی singleton از این روش استفاده می شود به این صورت است:public class SessionManager
{
    public static SessionManager Instance;
   static SessionManager()
   {
    Instance = new SessionManager();
    }
}نکته:1. سازنده های ایستا فقط یک بار اجرا می شوند زمانی که اولین شی اون کلاس اجرا شود2. سازنده های ایستا نمی توانند صفتی داشته باشند (access modifierها)3. سازنده های ایستا نمی توانند هیچ پارامتر ورودی داشته باشند.</description>
                <category>میلاد نعمت پور</category>
                <author>میلاد نعمت پور</author>
                <pubDate>Fri, 27 Nov 2020 12:41:11 +0330</pubDate>
            </item>
            </channel>
</rss>