<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های فرشید عزیزی</title><link>https://virgool.ir/feed/@farshid.azizi</link><description>Software Engineer</description><language>fa</language><pubDate>2026-11-10 23:32:37</pubDate><image><url>https://files.virgool.ir/upload/users/1457143/avatar/P41tue.jpeg</url><title>فرشید عزیزی</title><link>https://virgool.ir/@farshid.azizi</link></image><item><title>دوره آموزشی #C-قسمت 25 - Abstract Class</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-25-abstract-class-nc1csros0sd2</link><description>دوره آموزشی #C-قسمت 24 - Type Castingمفهوم و هدف کلاس Abstractیک کلاس Abstract  محدود است. نمی توان از آن برای ایجاد اشیا استفاده کرد (برای دسترسی به آن باید از کلاس دیگری به ارث برده شود).یک کلاس انتزاعی کلاسی است که با کلمه کلیدی Abstract  به صورت زیر اعلام می شود:abstract class MyClass&#xA;{&#xA;}بر خلاف یک کلاس معمولی، شما نمی توانید هیچ نمونه ای از یک کلاس انتزاعی ایجاد کنید. به طور معمول، شما یک کلاس انتزاعی را برای زیر کلاس بندی توسط کلاس های دیگر تعریف می کنید.یک کلاس انتزاعی ممکن است شامل اعضای انتزاعی مانند متدها و پراپرتی های انتزاعی باشد.هدف یک کلاس انتزاعی ارائه یک طرح اولیه برای کلاس های مشتق شده و تعیین قوانینی است که کلاس های مشتق شده باید هنگام به ارث بردن یک کلاس انتزاعی پیاده سازی کنند. ما می توانیم از یک کلاس انتزاعی به عنوان کلاس پایه استفاده کنیم و همه کلاس های مشتق شده باید تعاریف (متدها و پراپرتی ها)انتزاعی را پیاده سازی کنند. یک متد انتزاعی باید در تمام کلاس‌های غیرانتزاعی با استفاده از کلمه کلیدی override پیاده‌سازی شود. هدف یک کلاس انتزاعی ارائه عملکرد پایه یا پیش فرض و همچنین عملکرد مشترک است که چندین کلاس مشتق شده می توانند به اشتراک بگذارند و آنها را overide کنند.متدهای Abstract :برای تعریف یک متد Abstract ، از کلمه کلیدی Abstract استفاده کنید. برخلاف یک متد معمولی، یک متد Abstract پیاده سازی ندارد.وقتی یک کلاس انتزاعی را که دارای متد انتزاعی است، زیر کلاس می‌دهید، باید متد انتزاعی را در زیر کلاس پیاده‌سازی کنید.یک متد Abstract بدنه ندارد. بدنه توسط کلاس مشتق شده (به ارث رسیده از) پیاده سازی می شود.مثال :abstract class MyClass&#xA;{&#xA;    public abstract string AbstractMethod();&#xA;}توجه داشته باشید که یک متد انتزاعی نمی تواند private باشد. به عبارت دیگر، سطح دسترسی آن باید یا public باشد یا protected.اگر کلاسی حاوی حداقل یک متد Abstract باشد، باید یک کلاس Abstract باشد.یک کلاس انتزاعی می تواند هم متدهای انتزاعی و هم متدهای معمولی داشته باشد.پراپرتی های Abstract :مانند یک متد انتزاعی، یک property انتزاعی از کلمه کلیدی Abstract تشکیل شده است و هیچ پیاده سازی برای get or set access modifierارائه نمی دهد.abstract class MyClass&#xA;{&#xA;    public abstract string AbstractProperty { get; set; }&#xA;    public abstract string AbstractMethod();    &#xA;}مثال :abstract class Shape&#xA;{&#xA;    public abstract double Area();&#xA;    public abstract int Side { get; }&#xA;}کلاس Shape یک متد انتزاعی ()Area دارد که مساحت shape را برمی گرداند. همچنین دارای propery انتزاعی Side است که تعداد اضلاع shape را برمی گرداند.در ادامه، کلاس Circle را که از کلاس Shape  ارث بری می‌کند :class Circle : Shape&#xA;{&#xA;    public double Radius { get; set; }&#xA;    public override int Side =&gt; 0;&#xA;    public Circle(double radius)&#xA;    {&#xA;        Radius = radius;&#xA;    }&#xA;    public override double Area()&#xA;    {&#xA;        return Math.PI * Radius * Radius;&#xA;    }&#xA;}در این کلاس Circle باید هم متد Area() و هم ویژگی Side را پیاده سازی کنیم.از آنجایی که یک دایره دارای ضلع صفر است، ویژگی Side 0 را برمی گرداند. همچنین، متد ()Area مساحت دایره را بر اساس شعاع (R) و PI آن با استفاده از فرمول PI * R2 برمی گرداند.در ادامه، کلاس Square را که از کلاس Shape به ارث می برد را تعریف کنید:class Square: Shape&#xA;{&#xA;    public double Length { get; set; }&#xA;    public override int Side =&gt; 4;&#xA;    public Square(double length)&#xA;    {&#xA;        Length = length;&#xA;    }&#xA;    public override double Area()&#xA;    {&#xA;        return Length * Length;&#xA;    }&#xA;}در این کلاس Square، پراپرتی Side مقدار 4 را برمی گرداند. همچنین، متد ()Area مساحت مربع را بر اساس طول آن برمی گرداند.در نهایت، یک آرایه از اشکال شامل یک دایره و یک مربع ایجاد کنید و مساحت آنها را محاسبه کنید:Shape[] shapes =&#xA;{&#xA;    new Square(10),&#xA;    new Circle(100)&#xA;};&#xA;foreach(Shape shape in shapes)&#xA;{&#xA;    Console.WriteLine($&#39;The area of the {shape} is {shape.Area():0.##}&#39;);&#xA;}خروجی :The area of the Square is 100&#xA;The area of the Circle is 31415.93چه موقع باید از کلاس های انتزاعی یا Abstract  استفاده کرد:نیاز به ایجاد چندین نسخه از کامپوننت خود دارید. شما می توانید ویژگی ها یا متدهایی را به یک کلاس انتزاعی بدون شکستن کد اضافه کنید و تمام کلاس های ارث بری به طور خودکار با تغییر به روز می شوند.(اصل Open Closed Principle (OCP))نیاز به ارائه رفتارهای پیش‌فرض و همچنین رفتارهای رایجی است که چندین کلاس مشتق شده می‌توانند به اشتراک بگذارند و آنها را override کنند.خلاصه :یک کلاس انتزاعی را نمی توان نمونه سازی کرد. می توان آن را زیر طبقه بندی کرد.یک کلاس انتزاعی ممکن است شامل اعضای انتزاعی از جمله متدها و ویژگی های انتزاعی باشد.متدهاو ویژگی‌های انتزاعی شامل پیاده‌سازی نیستند.زیر کلاس های یک کلاس انتزاعی باید تمام متدها و ویژگی های کلاس Abstract را پیاده سازی کنند.بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:33:31 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 24 - Type  Casting</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-24-type-casting-evuclu2fsor7</link><description>دوره آموزشی #C-قسمت 23 - virtual modifierمقدمه ای بر casting :سی شارپ یک زبان برنامه نویسی با statically-typed است. یعنی بعد از اینکه یک متغیر را اعلان کردید، نمی توانید آن را دوباره اعلان کنید. همچنین، نمی‌توانید مقدار دیگری را به متغیر اختصاص دهید، مگر اینکه آن نوع به طور ضمنی(implicitly) با نوع متغیر سازگار باشد.برای مثال، string را نمی توان به طور ضمنی به int تبدیل کرد. با توجه به مثال زیر، پس از اینکه i را به عنوان int اعلان کردید، نمی توانید رشته &#34;Hello&#34; را به آن اختصاص دهید،int i;&#xA;i = &#39;Hello&#39;  // error CS0029: Cannot implicitly convert type &#39;string&#39; to &#39;int&#39;به تبدیل انواع داده به یکدیگر  Type Casting می گویند.انواع type casting:تبدیل نوع Implicitly(upcast) تبدیل نوعExplicitly(downcast)  تبدیل نوع helper classesتبدیل نوع Implicitly(upcast) :هیچ syntax خاصی مورد نیاز نیست زیرا تبدیل همیشه با موفقیت انجام می شود و هیچ داده ای از بین نمی رود.برای built-in numeric types، زمانی می‌توان تبدیل ضمنی/Implicitly انجام داد که مقدار ذخیره‌سازی شده بتواند بدون بریده شدن یا گرد شدن در متغیر قرار گیرد. به عنوان مثال، یک متغیر از نوع long (عدد صحیح 64 بیتی) می تواند هر مقداری را که یک int (عدد صحیح 32 بیتی) می تواند ذخیره کند، ذخیره کند. تبدیل type  کوچکتر به type  بزرگتر را Implicitly(upcast) می گویند.برای reference types، تبدیل ضمنی /Implicitly  همیشه از یک کلاس به هر یک از کلاس ها یا اینترفیس های پایه مستقیم یا غیرمستقیم آن وجود دارد. هیچ نحو خاصی لازم نیست زیرا یک کلاس مشتق شده همیشه شامل تمام اعضای یک کلاس پایه است.Derived d = new Derived();&#xA;// Always OK.&#xA;Base b = d;تبدیل نوعExplicitly(downcast) : با این حال، اگر یک تبدیل با خطر از دست دادن اطلاعات انجام شود، کامپایلر از شما می خواهد که یک تبدیل صریح/Explicitly را انجام دهید. این نوع تبدیل راهی برای اطلاع صریح به کامپایلر است که قصد دارید تبدیل را انجام دهید و از اینکه ممکن است داده‌ها از بین برود یا در زمان اجرا شکست بخورد، آگاه هستید. برای انجام Cast، نوع ارسالی را در پرانتز در مقابل مقدار یا متغیری که باید تبدیل شود، مشخص کنید. (T)Eعبارت cast به صراحت نتیجه عبارت Eرا به نوع (T) تبدیل می کند. اگر هیچ تبدیل صریحی از نوع E به نوع T وجود نداشته باشد، کامپایلر یک خطا ایجاد می کند.مثال :class Test&#xA;{&#xA;    static void Main()&#xA;    {&#xA;        double x = 1234.7;&#xA;        int a;&#xA;        // Cast double to int.&#xA;        a = (int)x;&#xA;        System.Console.WriteLine(a);&#xA;    }&#xA;}&#xA;// Output: 1234برای reference types، در صورتی که نیاز به تبدیل از نوع پایه به نوع مشتق شده دارید، یک explicit cast مورد نیاز است:// Create a new derived type.&#xA;Giraffe g = new Giraffe();&#xA;// Implicit conversion to base type is safe.&#xA;Animal a = g;&#xA;// Explicit conversion is required to cast back&#xA;// to derived type. Note: This will compile but will&#xA;// throw an exception at run time if the right-side&#xA;// object is not in fact a Giraffe.&#xA;Giraffe g2 = (Giraffe)a;یک عملیات cast  بین reference typeها، run-time type شی زیرین را تغییر نمی دهد. فقط نوع مقداری را که به عنوان reference برای آن شیء استفاده می شود تغییر می دهد.در برخی از تبدیل‌های reference type، کامپایلر نمی‌تواند تعیین کند که آیا یک Cast معتبر خواهد بود یا خیر. ممکن است عملیات castی که به درستی کامپایل می شود در زمان اجرا با شکست مواجه شود. بنابراین بهتر است از قبل سازگاری را آزمایش کنید. سی شارپ عملگر is و as را برای آزمایش اینکه آیا یک مقدار از نوع خاصی است یا خیر ارائه می کند.عملگر as یک downcast را انجام می دهد که به جای اینکه در صورت شکست downcast یک استثنا ایجاد کند، null ارزیابی می شود. این به شما امکان می دهد متعاقباً بررسی کنید که آیا نتیجه downcast برابر null است یا خیر. مثلا:var employee = new Employee()&#xA;{&#xA;    Name = &#39;reza mohamadi&#39;,&#xA;    JobTitle = &#39;C# Developer&#39;&#xA;};&#xA;Person person = employee;// upcast&#xA;Candidate candidate = person as Candidate;&#xA;if (candidate != null)&#xA;{&#xA;    Console.WriteLine(candidate.Name);&#xA;}عملگر is، هم همانند عملگر as می باشد با این تفاوت که  اگر قابل تبدیل باشد، مقدار true و در غیر اینصورت مقدار false را بر میگرداند. خلاصه اینکه :یک object reference می تواند به طور implicitly به یک base class reference آپکست شود. یک upcast همیشه موفق است.یک object reference نیز می تواند به طور explicitly به یک subclass reference دانکست یابد. یک downcast فقط در صورتی موفق می شود که شی با type آن سازگار باشد.از عملگر as برای اجرای downcast استفاده می کنیم که به جای ایجاد یک throwing exception در زمان اجرا، به null ارزیابی می شود.تبدیل نوع helper classes : برای تبدیل بین انواع غیر سازگار، کلاسی در کتابخانه دات نت وجود دارد با نام Convert که به ما امکان تبدیل انواع داده به یکدیگر را می دهد. برای مثال در کد زیر بوسیله کلاس Convert، نوع رشته به نوع عددی int تبدیل می شود:string str = &#39;1234567890&#39; &#xA;var number = Convert.ToInt32(str); کلاس Convert بسته به مقدار base type در زمان اجرا و base type هدف، می تواند یکی از پنج نتیجه را ایجاد کند. این پنج نتیجه عبارتند از:بدون تبدیل(No conversion): این زمانی اتفاق می افتد که سعی شود از یک نوع به خودش تبدیل شود (مثلاً با فراخوانی Convert.ToInt32(Int32) در حالی که base type هدف همان Int32 است). یک InvalidCastException: این زمانی اتفاق می افتد که یک تبدیل خاص پشتیبانی نمی شود. یک InvalidCastException برای تبدیل‌های زیر ایجاد می‌شود:Conversions from Char to Boolean, Single, Double, Decimal, or DateTime.Conversions from Boolean, Single, Double, Decimal, or DateTime to Char.Conversions from DateTime to any other type except String.Conversions from any other type, except String, to DateTime.یک FormatException : این زمانی اتفاق می‌افتد که تلاش برای تبدیل یک مقدار string به هر نوع پایه دیگر با شکست مواجه شود زیرا رشته در قالب مناسب نیست. استثنا برای تبدیل های زیر ایجاد می شود:A string to be converted to a Boolean value does not equal Boolean.TrueString or Boolean.FalseString.A string to be converted to a Char value consists of multiple characters.A string to be converted to any numeric type is not recognized as a valid number.A string to be converted to a DateTime is not recognized as a valid date and time valueیک تبدیل موفق(successful conversion)  : برای تبدیل‌های بین دو نوع پایه مختلف  که منجر به از دست دادن داده‌ها نمی‌شوند  و متد مقداری از نوع پایه هدف را برمی‌گرداند.یک OverflowException : این زمانی اتفاق می‌افتد که یک تبدیل منجر به از دست رفتن داده شود. برای مثال، تلاش برای تبدیل یک نمونه Int32 که مقدار آن 10000 است به یک نوع بایت، یک OverflowException ایجاد می کند زیرا 10000 خارج از محدوده نوع داده بایت است.اگر تبدیل یک نوع عددی منجر به از دست دادن دقت شود (یعنی از دست دادن برخی از ارقام کم اهمیت) استثنایی ایجاد نخواهد شد. یکی دیگر از انواع helper classes برای تبدیل رشته به عدد فراخوانی متد فراخوانی متد Parse یا TryParse است.متد Parse عدد تبدیل شده را برمی گرداند. متد TryParse یک مقدار بولی برمی‌گرداند که نشان می‌دهد آیا تبدیل موفق بوده است یا خیر، و عدد تبدیل‌شده را در یک پارامتر out برمی‌گرداند.متدهای Parse و TryParse فضای سفید را در ابتدا و انتهای رشته نادیده می‌گیرند، اما همه کاراکترهای دیگر باید کاراکترهایی باشند که نوع عددی مناسب را تشکیل می‌دهند (int، long، ulong، float، decimal و غیره). هر فضای خالی در رشته ای که عدد را تشکیل می دهد باعث خطا می شود. برای مثال، می‌توانید از decimal.TryParse برای استخراج «10»، «10.3»، یا «10» استفاده کنید، اما نمی‌توانید از این متد برای استخراج 10 از «10X»، «1 0» استفاده کنید (به فضای تعبیه‌شده توجه کنید) ، &#34;10.3&#34; (به فضای تعبیه شده توجه کنید)، &#34;10e1&#34; (float.TryParse در اینجا کار می کند). شما می توانید  با فراخوانی متد String.IsNullOrEmpty، وجود یک رشته Empty یا Null را بررسی کنید.متد ()Parseقبل از استفاده از ()Parse، باید مطمئن شویم که تبدیل با موفقیت انجام می شود. در غیر این صورت برنامه از کار می افتد.برای تبدیل رشته به هر نوع داده ای، از syntax زیر استفاده می کنیم:data_type.Parse(string);مثال :string var_string = &#39;4.5&#39;  &#xA;Console.WriteLine(int.Parse(&#39;4&#39;) + 3); &#xA;Console.WriteLine(float.Parse(var_string) + 4.4f);&#xA;//output :&#xA;7 &#xA;8.9متد ()TryParse :متد ()TryParse نوع داده رشته را به نوع داده دیگری تبدیل می کند. مقدار True یا False را بر اساس تبدیل موفق یا ناموفق برمی گرداند. ()TryParse یک رویکرد امن تر است زیرا اجرای برنامه را خاتمه نمی دهد.data_type.TryParse(string, out output_variable);متد ()TryParse دو پارامتر دریافت می کند. اولین پارامتر رشته ای است که باید تبدیل شود. پارامتر دوم متغیری است که مقدار تبدیل شده را ذخیره می کند. کلمه کلیدی out قبل از پارامتر دوم استفاده می شود.بیشتر بخوانید : دوره آموزشی #C-قسمت 25 - Abstract Classبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:33:20 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 23 - virtual modifier</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-23-virtual-modifier-zsrpvyevy5zq</link><description>دوره آموزشی #C-قسمت 22 - sealed Modifierدر وراثت، یک کلاس (زیر کلاس) از کلاس دیگر (کلاس پایه) ارث می برد. اگر عضوی در زیر کلاس هم نامی در کلاس پایه داشته باشد، عضو در زیر کلاس جایگزین عضو در کلاس پایه می شود.برای مثال :class Person&#xA;{&#xA;    public string Name { get; set; }&#xA;    public string Introduce() =&gt; $&#39;Hi, I&#39;m {Name}.&#39;&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public string JobTitle { get; set; }&#xA;    public new string Introduce() =&gt; $&#39;Hi, I&#39;m {Name}. I&#39;m a {JobTitle}.&#39;&#xA;}در این مثال، متد ()Introduce در کلاس Employee متد ()Introduce همنام خود را در کلاس Person پنهان یا جایگزین می کند. new modifier  و به صراحت قصد ما را اعلام می کند.با این حال، اگر می خواهید عضوی در زیر کلاس ، عضوی با همان نام را در کلاس پایه override کند، باید:ابتدا از virtual modifier در اعلان عضو کلاس پایه استفاده کنید.دوم، از override modifier  در اعلان عضو در کلاس فرعی استفاده کنید.به مثال زیر توجه کنید :class Person&#xA;{    public string Name { get; set; }&#xA;    public virtual string Introduce() =&gt; $&#39;Hi, I&#39;m {Name}.&#39;;&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public string JobTitle { get; set; }&#xA;    public override string Introduce() =&gt; $&#39;Hi, I&#39;m {Name}. I&#39;m a {JobTitle}.&#39;;&#xA;}در این مثال:از کلمه کلیدی virtual برای تغییر اعلان متد ()Introduce در کلاس Person استفاده کنید.از کلمه کلیدی override برای تغییر اعلان متد ()Introduce در کلاس Employee استفاده کنید.تفاوت میان  new و override :بیایید با مثال تفاوت آن ها را بررسی کنیم متد override :خوب override modifier به کامپایلر #C دستور می دهد تا از آخرین پیاده سازی تعریف شده یک متد استفاده کند. حتی اگر متد را روی referenceای از کلاس پایه فراخوانی کنید. مثلا:class Person&#xA;{&#xA;    public string Name { get; set; }&#xA;    public virtual string Introduce() =&gt; $&#39;Hi, I&#39;m {Name}.&#39;;&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public string JobTitle { get; set; }&#xA;    public override string Introduce() =&gt; $&#39;Hi, I&#39;m {Name}. I&#39;m a {JobTitle}.&#39;;&#xA;}در ادامه :var employee = new Employee()&#xA;{&#xA;    Name = &#39;reza mohamadi&#39;,&#xA;    JobTitle = &#39;C# Developer&#39;&#xA;};&#xA;Console.WriteLine(employee.Introduce());&#xA;Person person = employee;&#xA;Console.WriteLine(person.Introduce()); خروجی به صورت زیر خواهد بود :Hi, I&#39;m &#39;reza mohamadi. I&#39;m a C# Developer.&#xA;Hi, I&#39;m &#39;reza mohamadi. I&#39;m a C# Developer.در این مثال، زمانی که متد ()Introduce را فراخوانی می کنیم، کامپایلر متدی تعریف شده در کلاس Employee را همانطور که انتظار می رود اجرا می کند.و وقتی متد ()Introduce را روی نمونه ای از کلاس Person فراخوانی می کنیم، کامپایلر متد ()Introduce تعریف شده در کلاس Employee را نیز اجرا می کند.متد new :خوب  new modifier به کامپایلر سی شارپ دستور می دهد تا از متد تعریف شده در زیر کلاس استفاده کند. با این حال، اگر متد را روی نمونه ای از کلاس پایه فراخوانی کنید، کامپایلر به جای آن از متدی تعریف شده در کلاس پایه استفاده می کند، نه از متدی که در زیر کلاس تعریف شده است. مثلا:class Person&#xA;{&#xA;    public string Name { get; set; }&#xA;    public string Introduce() =&gt; $&#39;Hi, I&#39;m {Name}.&#39;;&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public string JobTitle { get; set; }&#xA;    public new string Introduce() =&gt; $&#39;Hi, I&#39;m {Name}. I&#39;m a {JobTitle}.&#39;;&#xA;}در ادامه :var employee = new Employee()&#xA;{&#xA;     Name = &#39;reza mohamadi&#39;, &#xA;    JobTitle = &#39;C# Developer&#39;&#xA;};&#xA;Console.WriteLine(employee.Introduce());&#xA;Person person = employee;&#xA;Console.WriteLine(person.Introduce()); و خروجی :Hi, I&#39;m Jreza mohamadi. I&#39;m a C# Developer.&#xA;Hi, I&#39;m reza mohamadi.فراخوانی متد در کلاس پایه :برای فراخوانی صریح یک متد  کلاس پایه از یک زیر کلاس، از کلمه کلیدی base استفاده کنید.مثال زیر نحوه فراخوانی متد ()Introduce از کلاس Person را در متد ()Introduce از کلاس Employee نشان می دهد:class Person&#xA;{&#xA;    public string Name { get; set; }&#xA;    public virtual string Introduce() =&gt; $&#39;Hi, I&#39;m {Name}.&#39;;&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public string JobTitle { get; set; }&#xA;    public override string Introduce() =&gt; $&#39;{base.Introduce()} I&#39;m a {JobTitle}.&#39;;&#xA;}در این مثال، ما به متد ()Introduce از کلاس Person در متد ()Introduce از کلاس Employee با استفاده از کلمه کلیدی base اشاره می کنیم:base.Introduce()اگر این کار را نمی‌کردیم، یک متد بازگشتی خواهیم داشت زیرا متد ()Introduce خودش را فراخوانی می‌کرد.بیشتر بخوانید : دوره آموزشی #C-قسمت 24 - Type Castingبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:33:02 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 22 - sealed Modifier</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-22-sealed-modifier-k917qn74pjfl</link><description>دوره آموزشی #C-قسمت 21 - new Modifierجلوگیری از ارث بردن کلاس توسط سایر کلاس ها یا نادیده گرفتن یک عضو کلاس توسط یک عضو در زیر کلاس :هنگام ایجاد کلاس باید نکات زیر را در نظر بگیرید:مزایایی که سایر کلاس ها ممکن است با ارث بردن از کلاس شما به دست آورند.معایب جانبی که اگر کلاس های دیگر کلاس شما را به گونه ای گسترش دهند دیگر به درستی یا مطابق انتظار کار نکنند.کلاس های مهر و موم شده یا sealed class برای محدود کردن سایر کلاس ها از ارث بردن از آنها استفاده می شود. یک کلاس را می توان با استفاده از کلمه کلیدی sealed مهر و موم کرد. کلمه کلیدی به کامپایلر می گوید که کلاس مهر و موم شده است و بنابراین نمی توان آن را گسترش داد.اگر نکته دوم واضح است، می توانید با استفاده از  sealed Modifier از آن جلوگیری کنید.sealed class MyClass&#xA;{&#xA;}در این مثال، ما از sealed Modifier برای MyClass استفاده می کنیم تا کلاس های دیگر نتوانند از آن ارث ببرند. اگر بخواهید MyClass را به ارث ببرید، با خطایی مواجه خواهید شد. مثلا:class MySubclass: MyClass&#xA;{&#xA;}&#39;MySubclass&#39;: cannot derive from sealed type &#39;MyClass&#39;همچنین، می‌توانید sealed Modifier را روی یک پراپرتی یا متدی اعمال کنید. بیاید با مثالی آن را بررسی کنیم تا کاملا مفهوم را درک کنید:در مثال زیر،کلاس Z از Y ارث می برد، اما Z نمی تواند virtual function F را که در X اعلام شده و در Y مهر و موم شده است، override کند.class X&#xA;{&#xA;    protected virtual void F() { Console.WriteLine(&#39;X.F&#39;); }&#xA;    protected virtual void F2() { Console.WriteLine(&#39;X.F2&#39;); }&#xA;}&#xA;class Y : X&#xA;{&#xA;    sealed protected override void F() { Console.WriteLine(&#39;Y.F&#39;); }&#xA;    protected override void F2() { Console.WriteLine(&#39;Y.F2&#39;); }&#xA;}&#xA;class Z : Y&#xA;{&#xA;    // Attempting to override F causes compiler error CS0239.&#xA;    // protected override void F() { Console.WriteLine(&#39;Z.F&#39;); }&#xA;    // Overriding F2 is allowed.&#xA;    protected override void F2() { Console.WriteLine(&#39;Z.F2&#39;); }&#xA;}هدف اصلی استفاده از یک کلاس مهر و موم شده(sealed  class)هدف اصلی یک کلاس مهر و موم شده حذف ویژگی وراثت از کاربران کلاس است. یکی از بهترین کاربردهای کلاس های مهر و موم شده زمانی است که شما یک کلاس با اعضای ثابت دارید. برای مثال، کلاس های Pen و Brushes در فضای نام System.Drawing.کلاس Pen نشان دهنده قلم ها با رنگ های استاندارد است. این کلاس فقط اعضای ثابت دارد. به عنوان مثال، Pens.Blue نشان دهنده یک خودکار با رنگ آبی است. به طور مشابه، کلاس Brushes نشان دهنده براش های استاندارد است. Brushes.Blue نشان دهنده یک قلم مو با رنگ آبی است.بنابراین هنگامی که در حال طراحی یک class library هستید و می خواهید کلاس های خود را از استخراج توسط توسعه دهندگان محدود کنید، ممکن است بخواهید از کلاس های مهر و موم شده استفاده کنید.بیشتر بخوانید : دوره آموزشی #C-قسمت 23 - virtual modifierبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:32:46 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 21 - new Modifier</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-21-new-modifier-ozo6ub6edsrg</link><description>دوره آموزشی #C-قسمت 20 - Inheritance and Constructorمخفی کردن اعضای یک کلاس پایه :در وراثت، اگر یکی از اعضای یک sub Class همنام با عضو یک base Class باشد، کامپایلر سی شارپ یک هشدار صادر می کند. مثلا:class Person&#xA;{&#xA;    public string Name { get; set; }&#xA;    public string Introduce() =&gt; $Hi, I&#39;m {Name}.;&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public string JobTitle { get; set; }&#xA;    public string Introduce() =&gt; $Hi, I&#39;m {Name}. I&#39;m a {JobTitle}.;&#xA;}در این مثال:Person کلاس پایه و Employee یک زیر کلاس است که از کلاس Person ارث بری می کند.هر دو کلاس Person و Employee متد ()Introduce همنامی دارند که یک رشته را برمی گرداند.کامپایلر سی شارپ اخطار زیر را صادر می کند:&#39;Employee.Introduce()&#39; hides inherited member &#39;Person.Introduce()&#39;. Use the new keyword if hiding was intended.به وضوح نشان می دهد که متد ()Introduce از کلاس Employee متد ()Introduce از کلاس Person را پنهان می کند.هنگامی که یک متد در زیر کلاس عضوی را از کلاس پایه پنهان می کند، عضو زیر کلاس جایگزین عضو کلاس پایه می شود.به طور معمول، شما نمی خواهید متدی از کلاس پایه را مخفی کنید. معمولاً وقتی متدی را با همان نام متدی در زیر کلاس به کلاس پایه اضافه می کنید، به طور تصادفی این اتفاق می افتد. بنابراین، کامپایلر هشداری را صادر می کند تا به شما کمک کند زودتر یک پیامد ناخواسته را تشخیص دهید.با این حال، اگر واقعاً می خواهید متدی را از کلاس پایه پنهان کنید، می توانید از new Modifier برای آن عضو در زیر کلاس  استفاده کنید. مثلا:class Person&#xA;{&#xA;    public string Name { get; set; }&#xA;    public string Introduce() =&gt; $Hi, I&#39;m {Name}.;&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public string JobTitle { get; set; }&#xA;    public new string Introduce() =&gt; $Hi, I&#39;m {Name}. I&#39;m a {JobTitle}.;&#xA;}در این مثال، new Modifier  را به متد ()Introduce اضافه می کنیم.new Modifier قصد ما را به کامپایلر و سایر توسعه‌دهندگان اعلام می‌کند که متد ()Introduce تکراری تصادفی نیست. همچنین،new Modifier هشدار کامپایلر را دیگر نشان نخواهد داد.همچنین می‌توانید از new Modifier برای سایر اعضا مانند fields، properties و indexers نیز استفاده کنید.بیشتر بخوانید : دوره آموزشی #C-قسمت 22 - sealed Modifierبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:32:31 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت  20 - Inheritance &amp; Constructor</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-20-inheritance-constructor-a2q9ddbxheex</link><description>دوره آموزشی #C-قسمت 19 - Inheritanceترتیب فراخوانی constructor در Inheritance هنگامی که یک نمونه جدید از یک زیر کلاس ایجاد می کنید، #C ابتدا سازنده کلاس پایه و سپس سازنده کلاس فرعی را فراخوانی می کند. به عنوان مثال ابتدا یک کلاس Person با سازنده بدون پارامتر تعریف کنید:class Person{ &#xA;    public Person()&#xA;    {&#xA;        Console.WriteLine(Called the Person&#39;s constructor);&#xA;    }&#xA;}توجه داشته باشید که parameterless constructor یک کلاس سازنده ای است که هیچ پارامتری ندارد. اگر به صراحت سازنده بدون پارامتر را تعریف نکنید، کامپایلر #C به طور خودکار یک سازنده برای کلاس ایجاد می کند.دوم، یک کلاس Employee تعریف کنید که از کلاس Person ارث بری می کند:class Employee : Person&#xA;{&#xA;    public Employee()&#xA;    {&#xA;        Console.WriteLine(Called the Employee&#39;s constructor);&#xA;    }&#xA;}سوم، یک نمونه جدید از کلاس Employee ایجاد کنید:var employee = new Employee();و در نهایت خروجی :Called the Person&#39;s constructor&#xA; Called the Employee&#39;s constructorهمانطور که در خروجی مشاهده می کنید، #C ابتدا سازنده کلاس Person و سپس سازنده کلاس Employee را اجرا می کند.در واقع سی شارپ همیشه سازنده بدون پارامتر کلاس والد را فراخوانی می کند. مثال زیر را در نظر بگیرید.ابتدا یک سازنده با پارامتر name به هر دو کلاس Person و Employee اضافه کنید:class Person&#xA;{ &#xA;    public Person()&#xA;    {&#xA;        Console.WriteLine(Called the Person&#39;s constructor);&#xA;    }&#xA;    public Person(string name)&#xA;    {&#xA;        Console.WriteLine(Called the Person&#39;s constructor with a parameter);&#xA;    }&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public Employee()&#xA;    {&#xA;        Console.WriteLine(Called the Employee&#39;s constructor);&#xA;    }&#xA;    public Employee(string name)&#xA;    {&#xA;        Console.WriteLine(Called the Employee&#39;s constructor with a parameter);&#xA;    }&#xA;}سپس، یک نمونه جدید از کلاس Employee ایجاد کنید:var employee = new Employee(reza mohamadi);خروجی :Called the Person&#39;s constructor&#xA;Called the Employee&#39;s constructor with a parameterدر این حالت، سی شارپ ابتدا سازنده بدون پارامتر کلاس Person (کلاس پایه) و سپس سازنده را با پارامتری از کلاس Employee (زیر کلاس) اجرا می کند.اگر سازنده بدون پارامتر کلاس Person و/یا کلاس Employee را حذف کنید، با خطا مواجه خواهید شد. مثلا:class Person&#xA;{&#xA;    public Person(string name)&#xA;    {&#xA;        Console.WriteLine(Called the Person&#39;s constructor with a parameter);&#xA;    }&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public Employee(string name)&#xA;    {&#xA;        Console.WriteLine(Called the Employee&#39;s constructor with a parameter);&#xA;    }&#xA;}خطا :There is no argument given that corresponds to the required formal parameter &#39;name&#39; of &#39;Person.Person(string)&#39;در این مثال، کلاس Person سازنده بدون پارامتر ندارد. هنگامی که یک نمونه جدید از کلاس Employee ایجاد می کنید، C# سازنده بدون پارامتر کلاس Person را فراخوانی می کند.با این حال، نمی تواند سازنده بدون پارامتر را در کلاس Person پیدا کند. بنابراین خطا صادر می کند.تغییر ترتیب فراخوانی با استفاده از ()Base :برای رفع این مشکل،  به جای اینکه به #C اجازه دهید سازنده بدون پارامتر را فراخوانی کند، می‌توانید صریحاً یک سازنده خاص از یک کلاس والد را فراخوانی کنید.برای انجام این کار، از ()base پس از اعلان سازنده subclass به صورت زیر استفاده می کنید:class Person&#xA;{&#xA;    public Person(string name)&#xA;    {&#xA;        Console.WriteLine(Called the Person&#39;s constructor with a parameter);&#xA;    }&#xA;}&#xA;class Employee : Person&#xA;{&#xA;    public Employee(string name): base(name)&#xA;    {&#xA;        Console.WriteLine(Called the Employee&#39;s constructor with a parameter);&#xA;    }&#xA;}حال، اگر یک نمونه جدید از کلاس Employee ایجاد کنید:var employee = new Employee(reza mohamadi);خوب C# ابتدا سازنده کلاس Person و سپس سازنده کلاس Employee را فراخوانی می کند:Called the Person&#39;s constructor with a parameterCalled the Employee&#39;s constructor with a parameterبیایید یک مثال دیگر با هم بررسی کنیم :ابتدا کلاس Person را با سازنده ای که دارای سه پارامتر است تعریف کنید:class Person&#xA;{&#xA;    public string FirstName { get; set; }&#xA;    public string LastName { get; set; }&#xA;    public byte Age { get; set; }&#xA;    public string FullName =&gt; ${FirstName} {LastName};&#xA;    public Person(string firstName, string lastName, byte age)&#xA;    {&#xA;        FirstName = firstName;&#xA;        LastName = lastName;&#xA;        Age = age;&#xA;    }&#xA;    public string Introduce() =&gt; $Hi, I&#39;m {FullName}.;&#xA;}دوم، Employee را با سازنده ای تعریف کنید که دارای پنج پارامتر است:class Employee : Person&#xA;{&#xA;    public string JobTitle { get; set; }&#xA;    public decimal Salary { get; set; }&#xA;    public Employee(string firstName, string lastName, byte age, string jobTitle, decimal salary)&#xA;        : base(firstName, lastName, age)&#xA;    {&#xA;        JobTitle = jobTitle;&#xA;        Salary = salary;&#xA;    }&#xA;}در این کلاس، سازنده Employee سازنده Person را با استفاده از  ()base فراخوانی می کند.در وراثت، #C همیشه سازنده بدون پارامتر کلاس والد را فراخوانی می کند، مگر اینکه از ()base برای فراخوانی سازنده خاصی از کلاس والد استفاده کنید.بیشتر بخوانید : دوره آموزشی #C-قسمت 21 - new Modifierبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:32:19 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 19 - Inheritance</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-19-inheritance-nsiv0sjyqz7v</link><description>دوره آموزشی #C-قسمت 18 - Static Classesوراثت(Inheritance) :وراثت یکی از مفاهیم اصلی در برنامه نویسی شی گرا است. وراثت به یک کلاس اجازه می دهد تا از کلاس دیگر ارث ببرد.ارث بردن از یک کلاس به شما این امکان را می دهد که به جای ساختن آن از ابتدا، از عملکرد کلاس استفاده مجدد کنید.سی شارپ به یک کلاس اجازه می دهد فقط از یک کلاس ارث بری کند. به این single inheritance می گویند. سی شارپ از multiple inheritances  پشتیبانی نمی کند که یک کلاس بتواند از دو یا چند کلاس ارث بری کند. یک کلاس Person با ویژگی های FirstName، LastName، Age و FullName و متد ()Introduce را در نظر بگیرید:class Person&#xA;{&#xA;    public string FirstName { get; set; }&#xA;    public string LastName { get; set; }&#xA;    public byte Age { get; set; }&#xA;    public string FullName =&gt; ${FirstName} {LastName};&#xA;    public string Introduce() =&gt; $Hi, Im {FullName}.;&#xA;}و شما می خواهید یک کلاس Employee تعریف کنید که تمام خصوصیات را به عنوان کلاس Person و دو ویژگی دیگر JobTitle و Salary داشته باشد.به جای کپی کد از کلاس Person به کلاس Employee، می توانید از وراثت استفاده کنید.مثال پایین زیر کلاس Employee را که از کلاس Person به ارث می برد تعریف می کند:class Employee: Person&#xA;{&#xA;&#xA;}در این مثال:کلاس Person، کلاس والد(parent class)، کلاس پایه(base class) یا super class نامیده می شود.کلاس Employee یک کلاس فرزند(child class)، کلاس مشتق شده(derived class) یا زیر کلاس(subclass) نامیده می شود.همچنین می گوییم که کلاس Employee کلاس Person را گسترش(extends) می دهد.از آنجایی که کلاس Employee خصوصیات و متدهای کلاس Person را به ارث می برد، اشیاء آن مانند اشیاء کلاس Person رفتار می کنند. مثلا:var employee = new Employee&#xA;{&#xA;    FirstName = reza,&#xA;    LastName = mohamadi,&#xA;    Age = 25&#xA;};&#xA;Console.WriteLine(employee.Introduce());همانطور که می بینید، Employee مانند کلاس Person بدون تکرار کد رفتار می کند. ما می گوییم employee  یک Person  است و وراثت یک رابطه is-a است.رابطه بین کلاس ها در سی شارپ :رابطه IS-A رابطه  HAS-Aدرک مفهوم رابطه IS-A و HAS-A بین کلاس ها بسیار مهم است. اجازه دهید با یک مثال رابطه IS-A و HAS-A را در سی شارپ درک کنیم. class Rectangle{&#xA;          Some Data Members&#xA;          Some Member Functions&#xA;}این کلاسی به نام Rectangle است. اجازه دهید داده ها را فرض کنیم که در داخل این کلاس چند عضو داده و توابع عضو داریم. در مرحله بعد کلاسی به نام Cuboid داریم که از کلاس Rectangle فوق به صورت زیر ارث می برد:class Cuboid : Rectangle{&#xA;          Some Data Members&#xA;          Some Member Functions&#xA;} همچنین فرض کنید که این کلاس چند عضو داده و توابع عضو نیز در داخل خود دارد. حال اجازه دهید یک کلاس دیگر را به صورت زیر بنویسیم:class Table{&#xA;       Rectangle top;&#xA;       int legs;&#xA;}بنابراین ابتدا یک کلاس به نام Rectangle ایجاد کرده ایم. سپس کلاس دیگری به نام Cuboid ایجاد کردیم که از کلاس Rectangle به ارث رسیده است و سپس کلاس دیگری به نام Table ایجاد کردیم. در داخل کلاس Table یک متغیر از نوع Rectangle و همچنین متغیر دیگری از نوع عدد صحیح ایجاد کرده ایم.کلاس Cuboid از کلاس Rectangle  ارث بری می کند . بنابراین، آیا می توانیم بگوییم که یک Cuboid  یک Rectangle است؟ بله. بنابراین، رابطه بین کلاس Rectangle و کلاس Cuboid رابطه Is-A است. بنابراین، نکته ای که باید به خاطر بسپارید این است که هر زمان که ما رابطه Inheritance یا رابطه والد-فرزند را ایجاد می کنیم، می توانیم آن رابطه را به عنوان یک رابطه IS-A در زبان های برنامه نویسی شی گرا بگوییم.در ادامه بعد، کلاس Table ما، دارای یک متغیر به نام top است که از نوع Rectangle  است. یعنی کلاس Table دارای یک شی از کلاس Rectangle است. بنابراین، آیا می توانیم بگوییم که کلاس Table دارای یک Rectangle  است؟ بله، کلاس Table دارای یک Rectangle است. بنابراین، رابطه بین کلاس Table و کلاس Rectangle، رابطه Has A است.بنابراین، یک کلاس در سی شارپ به دو صورت قابل استفاده است. یک راه استفاده از رابطه Inheritance است، یعنی یک کلاس از آن کلاس ارث می برد. روش دوم این است که شما می توانید یک شی از آن کلاس ایجاد کنید و از آن استفاده کنید. مثالی برای درک رابطه IS-A در سی شارپ :به مثال زیر نگاهی بیندازید. در مثال زیر، رابطه بین Rectangle و Cuboid رابطه IS-A است، بنابراین می توان گفت که Cuboid IS-A Rectangle است :    public class Program&#xA;    {&#xA;        static void Main()&#xA;        {&#xA;            Cuboid cuboid = new Cuboid(3, 5, 7);&#xA;            Console.WriteLine($Volume is : {cuboid.Volume()});&#xA;            Console.WriteLine($Area is : {cuboid.Area()});&#xA;            Console.WriteLine($Perimeter is : {cuboid.Perimeter()});&#xA;            Console.ReadKey();&#xA;        }&#xA;    }&#xA;&#xA;    class Rectangle&#xA;    {&#xA;        //Data Members&#xA;        public int Length;&#xA;        public int Breadth;&#xA;&#xA;        //Member Functions&#xA;        public int Area()&#xA;        {&#xA;            return Length * Breadth;&#xA;        }&#xA;        public int Perimeter()&#xA;        {&#xA;            return 2 * (Length + Breadth);&#xA;        }&#xA;    }&#xA;&#xA;    class Cuboid : Rectangle&#xA;    {&#xA;        public int Height;&#xA;        public Cuboid(int l, int b, int h)&#xA;        {&#xA;            Length = l;&#xA;            Breadth = b;&#xA;            Height = h;&#xA;        }&#xA;        public int Volume()&#xA;        {&#xA;            return Length * Breadth * Height;&#xA;        }&#xA;    }مثالی برای درک رابطه HAS-A در سی شارپ :به مثال زیر نگاهی بیندازید. در مثال زیر، در کلاس Employee، یک متغیر از نوع Address ایجاد کرده‌ایم که چیزی جز یک رابطه HAS-A بین Employee و Address نیست. بنابراین، می توان گفت که Employee has-A Address.    public class Program&#xA;    {&#xA;        static void Main()&#xA;        {&#xA;            Address address = new Address(20, tehran, vanak);&#xA;            Employee employee = new Employee(10, reza mohamadi, address);&#xA;            employee.Display();&#xA;            Console.ReadKey();&#xA;        }&#xA;    }&#xA;    class Address&#xA;    {&#xA;        public string AddressLine, City, State;&#xA;        public Address(string addressLine, string city, string state)&#xA;        {&#xA;            AddressLine = addressLine;&#xA;            City = city;&#xA;            State = state;&#xA;        }&#xA;    }&#xA;    class Employee&#xA;    {&#xA;        public Address address; &#xA;        public int Id;&#xA;        public string Name;&#xA;        public Employee(int id, string name, Address adrs)&#xA;        {&#xA;            Id = id;&#xA;            Name = name;&#xA;            address = adrs;&#xA;        }&#xA;        public void Display()&#xA;        {&#xA;            Console.WriteLine($Employee Id: {Id});&#xA;            Console.WriteLine($Employee Name: {Name});&#xA;            Console.WriteLine($AddressLine: {address.AddressLine});&#xA;            Console.WriteLine($City: {address.City});&#xA;            Console.WriteLine($State: {address.State});&#xA;        }&#xA;    }در مثال بالا، اگر کلاس Employee را از کلاس Address به ارث ببریم، معنی ندارد. زیرا اگر ارث ببریم، یک رابطه IS-A بین کلاس های کارمند و آدرس برقرار می کند و گفتن Employee IS-A Address منطقی نیست، بلکه اگر رابطه HAS-A را پیاده سازی کنیم، منطقی است که بگوییم Employee HAS-A address.گسترش کلاس والد(Extending a parent class) :کد زیر ویژگی JobTitle و Salary را به کلاس Employee اضافه می کند:class Employee : Person&#xA;{&#xA;    public string JobTitle { get; set; }&#xA;    public decimal Salary { get; set; }&#xA;}اکنون کلاس Employee دارای ویژگی های خاص خود و ویژگی های ارثی از کلاس Person است. مثال زیر یک نمونه جدید از کلاس Employee با تمام ویژگی ها ایجاد می کند:var employee = new Employee&#xA;{&#xA;    FirstName = reza,&#xA;    LastName = mohamadi,&#xA;    Age = 18,&#xA;    JobTitle = C# Developer,&#xA;    Salary = 5000&#xA;};&#xA;Console.WriteLine(employee.Introduce());بیشتر بخوانید : دوره آموزشی #C-قسمت 20 - Inheritance &amp;amp;amp;amp;amp;amp; Constructorبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:32:05 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 18 - Static Classes</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-18-static-classes-sefdka6f5kgt</link><description>دوره آموزشی #C-قسمت 17 - Static Constructorsکلاس Static  :کلاس Static کلاسی است که قابل نمونه سازی نیست. به طور معمول، شما از یک کلاس Static برای گروه بندی اعضایی استفاده می کنید که مختص یک کلاس هستند، نه نمونه ای از کلاس.استفاده متداول از یک کلاس استاتیک، ایجاد یک کلاس کاربردی است که شامل مجموعه ای از متدها و مقادیر مانند Math library است.ویژگی های یک کلاس Static:یک کلاس Static باید کلمه کلیدی Static را داشته باشد.یک کلاس Static فقط دارای اعضای Static از جمله فیلدها، پراپرتی و متدهای Static است.یک کلاس Static نمی تواند سازنده instanceای داشته باشد اما می تواند سازنده Static داشته باشد.یک کلاس Static به طور ضمنی مهر و موم شده(sealed) است. بنابراین، شما نمی توانید  subclassای از آن داشته باشید.برای دسترسی به اعضای یک کلاس Static ، از نام کلاس و نام عضو استفاده کنید.بیایید مثالی از استفاده از یک کلاس Static  برای تعریف یک utility class ببینیم :ابتدا یک کلاس استاتیک LengthConverter را تعریف کنید:static class LengthConverter&#xA;{&#xA;    public static double FeetToMeters(double ft) =&gt; ft / 3.28084;&#xA;    public static double MetersToFeet(double m) =&gt; m * 3.28084;&#xA;}کلاس استاتیک LengthConverter دو متد استاتیک دارد که فوت را به متر و بالعکس تبدیل می کند.حالا از کلاس LengthConverter استفاده کنید:// Program.cs&#xA;double feet, meters;&#xA;// feet to meters&#xA;feet = 100;&#xA;meters = LengthConverter.FeetToMeters(feet);&#xA;Console.WriteLine($&#39;{feet}ft = {meters:0.##}m&#39;)&#xA;// meters to feet&#xA;meters = 10;&#xA;feet = LengthConverter.MetersToFeet(meters);&#xA;Console.WriteLine($&#39;{meters}m = {feet:0.##}ft&#39;);شما می توانید بدون ذکر نام کلاس به اعضای یک کلاس استاتیک دسترسی داشته باشید. مثلا:// Program.cs&#xA;using static LengthConverter;&#xA;double feet, meters;&#xA;// feet to meters&#xA;feet = 100;&#xA;meters = FeetToMeters(feet);&#xA;Console.WriteLine($&#39;{feet}ft = {meters:0.##}m&#39;);&#xA;// meters to feet&#xA;meters = 10;&#xA;feet = MetersToFeet(meters);&#xA;Console.WriteLine($&#39;{meters}m = {feet:0.##}ft&#39;); برخی از سناریوهایی وجود دارد که ممکن است بخواهیم از کلاس های استاتیک استفاده کنیم.آنها برای پیاده سازی utilities  Applications عالی هستند. به عنوان مثال، کلاس های داخلی مانند Math و System.Convert برخی از کلاس های استاتیک رایج هستند.کلاس های استاتیک منابع کمتری مصرف می کنند. آنها نیازی به نمونه سازی ندارند، از این رو، اشیاء تکراری فضای اضافی حافظه را اشغال نمی کنند. از نظر تئوری، کلاس های استاتیک عملکرد بهتری نسبت به همتایان غیر استاتیک خود ارائه می دهند. این معمولاً در کاربردهای عملی قابل توجه نیست.برای استفاده از extension methods در اپلیکیشن خود، باید از کلاس های استاتیک استفاده کنیم.البته استفاده از کلاس های استاتیک نیز معایبی دارد.کلاس های ایستا اصل برنامه نویسی شی گرا polymorphism را می شکنند. تغییر عملکرد یک کلاس استاتیک بدون تغییر آن دشوار است. برای مثال، ایجاد کلاس‌های فرزند از کلاس‌های غیراستاتیک به برنامه‌نویسان کمک می‌کند تا عملکردهای موجود را بدون ایجاد تغییرات در کلاس‌های والد گسترش دهند.(این آنها را برای استفاده در utility classes  که نیازی به تغییرات بیشتر ندارند، ایده آل می کند. از سوی دیگر، اگر ما نیاز به افزودن قابلیت‌ها به کلاس‌های خود داشته باشیم، کلاس‌های غیراستاتیک ایده‌آل‌تر از همتایان استاتیک خود خواهند بود.)کلاس های استاتیک را نمی توان از طریق اینترفیس ها تعریف کرد. هنگامی که ما نیاز به استفاده مجدد از آنها در هنگام پیاده سازی اینترفیس ها داشته باشیم، آنها غیر قابل پیاده سازی می شوند.همانطور که عملکرد یک متد استاتیک افزایش می یابد، می تواند منجر به استفاده از پارامترهایی شود که ممکن است مورد نیاز نباشد. این خزش پارامتر(parameter creep) نامیده می شود. راه‌حل این مشکل ایجاد کلاس‌های مشتق و method overriding برای پشتیبانی از عملکردهای اضافی است. با این حال، کلاس های استاتیک از ارث بری و method overriding پشتیبانی نمی کنند.بیشتر بخوانید : دوره آموزشی #C-قسمت 19 - Inheritanceبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:31:50 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 17 - Static Constructors</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-17-static-constructors-qdmvknuduuyg</link><description>دوره آموزشی #C-قسمت 16 - Static Methodsانواع constructor :هنگام ایجاد یک نمونه از یک کلاس، کامپایلر #C به طور خودکار سازنده را فراخوانی می کند. این سازنده instance constructor  نامیده می شود زیرا یک نمونه جدید ایجاد می کند و اعضای نمونه را مقداردهی اولیه می کند.اگر از کلمه کلیدی استاتیک برای تعریف سازنده استفاده کنید، سازنده به  static constructor تبدیل می شود. به طور کلی، یک سازنده استاتیک، فیلدها و پراپرای های استاتیک را مقداردهی اولیه می کند.یک static constructor با یک instance constructor  به صورت های زیر متفاوت است:سازنده استاتیک از کلمه کلیدی static در اعلان استفاده می کند.یک کلاس فقط می تواند یک سازنده استاتیک داشته باشد. و سازنده استاتیک نمی تواند هیچ پارامتری داشته باشد.یک سازنده استاتیک نمی تواند یک access modifier مانند  public یا private داشته باشد.مانند یک متد استاتیک، سازنده استاتیک نمی تواند به اعضای نمونه یک کلاس دسترسی داشته باشد.بنابراین شما نمی توانید از کلمه کلیدی this در کنار یک سازنده استاتیک استفاده کنید. توجه داشته باشید که یک کلاس ممکن است هم سازنده instance و هم سازنده static داشته باشد.مثال زیر کلاسی را تعریف می کند که حاوی سازنده static  است:class RandomNumber&#xA;{&#xA;    private static Random random;&#xA;    static RandomNumber()&#xA;    {&#xA;        random = new Random();&#xA;    }&#xA;    public int Get() =&gt; random.Next();&#xA;}کلاس RandomNumber حاوی یک فیلد static است که instanceای از کلاس Random است.سازنده استاتیک یک نمونه جدید از کلاس Random ایجاد می کند و آن را به فیلد استاتیک random اختصاص می دهد.مثال  زیر از کلاس RandomNumber برای تولید پنج عدد صحیح تصادفی استفاده می کند:RandomNumber random = new();&#xA;for (int i = 0; i &lt; 5; i++)&#xA;{&#xA;    Console.WriteLine(random.Get());&#xA;}برای مقداردهی اولیه اعضای استاتیک از سازنده های استاتیک استفاده کنید.بیشتر بخوانید : دوره آموزشی #C-قسمت 18 - Static Classesبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:31:35 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 16 - Static Methods</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-16-static-methods-u7xqjggt7cez</link><description>دوره آموزشی #C-قسمت 15- Static Field and Propertyتعریف static methods :برای تعریف یک متد static، از کلمه کلیدی static با syntax زیر استفاده کنید:class MyClass&#xA;{&#xA;    public static type MyStaticMethod(parameters)&#xA;    {&#xA;        // &#xA;    }&#xA;}در این syntax ، کلمه کلیدی static نشان می دهد که MyStaticMethod یک static method است.مانند فیلدهای استاتیک، متدهای استاتیک به یک کلاس محدود می شوند. آنها به هیچ نمونه ای از کلاس مقید نیستند. بنابراین، متدهای استاتیک نمی توانند به اعضای نمونه(instance) دسترسی داشته باشند. با این حال، آنها می توانند به سایر اعضای static دسترسی داشته باشند.برای فراخوانی یک متد استاتیک در داخل کلاس، از نام متد استاتیک استفاده کنید:MyStaticMethod(arguments);برای فراخوانی یک متد استاتیک در خارج از کلاس، از این syntax استفاده کنید:ClassName.MyStaticMethod();در عمل، از  متدهای استاتیک در یک utility class استفاده می کنید.مثال هایی از static method :ابتدا کلاس UnitConverter را تعریف کنید که دارای دو متد استاتیک است:class UnitConverter&#xA;{&#xA;    public static double KgToLbs(double weight) =&gt; weight * 2.20462262185;&#xA;    public static double LbsToKg(double weight) =&gt; weight * 0.45359237;&#xA;}متد استاتیک KgToLbs وزن را از کیلوگرم به پوند و متد LbsToKg وزن را از پوند به کیلوگرم تبدیل می کند.متد استاتیک ()KgToLbs را برای تبدیل وزن از کیلوگرم به پوند فراخوانی کنید:// kg -&gt; pound&#xA;double weight = UnitConverter.KgToLbs(100);&#xA;Console.WriteLine($&#39;100kg={weight:#.00}lbs&#39;);&#xA;// pound -&gt; kg&#xA;weight = UnitConverter.LbsToKg(100);&#xA;Console.WriteLine($&#39;100lbs={weight:#.00}kg&#39;);متدهای استاتیک به کلاس‌ها محدود می‌شوند، نه نمونه‌هایی از کلاس‌ها. این بدان معناست که آنها منابع کمتری مصرف می کنند و هیچ تکراری از همان کلاس یا عضو در حافظه مورد نیاز نیست.متدهای استاتیک مرتبط را در یک کلاس کاربردی گروه بندی کنید.یک متد استاتیک را می توان مستقیماً از سطح کلاس فراخوانی کردیک متد استاتیک به هیچ شیء کلاسی نیاز ندارد.هر متد ()main در کل محدوده کلاس به اشتراک گذاشته می شود بنابراین همیشه با کلمه کلیدی static ظاهر می شود.اعضای استاتیک(Static members)کد تمیزتری ارائه می دهد.در تئوری، یک عضو استاتیک باید عملکرد بهتری در مقایسه با یک نمونه داشته باشد. با این حال، غیر قابل توجه است.بیشتر بخوانید : دوره آموزشی #C-قسمت 17 - Static Constructorsبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:31:13 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 15- Static Field &amp; Property</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-15-static-field-property-bojjwq34lixj</link><description>دوره آموزشی #C-قسمت 14-Expression-Bodied Membersتعریف Field :همه چیز در سی شارپ با کلاس ها و اشیاء، همراه با ویژگی ها(attributes) و متدهای(methods) آن، مرتبط است. به عنوان مثال: در زندگی واقعی، Person یک شی است. Person دارای ویژگی هایی مانند وزن و رنگ، قد، نام و ... و متدهایی مانند غداخوردن، دویدن و ... است.یک کلاس مانند یک سازنده شی(object constructor) یا یک &#34;طرح&#34; برای ایجاد اشیا است.class Person &#xA;{&#xA;  string name= &#39;&#39;jane&#39;&#39;&#xA;}هنگامی که یک متغیر مستقیماً در یک کلاس اعلام می شود، اغلب به عنوان یک فیلد/fieldیا ( ویژگی/attribute) نامیده می شود.فیلد متغیری از هر نوع است که مستقیماً در یک class یا struct اعلان می شود.یک class یا struct ممکن است دارای instance fields، static fields یا هر دو باشد.کلاس زیر را در نظر بگیرید :class Person&#xA;{&#xA;    public string Name;&#xA;    public Person(string name)&#xA;    {&#xA;        Name = name;&#xA;    }&#xA;}تعریف instance field :در کلاس Person ویژگی Name یک instance field است که به نمونه ای از کلاس Person محدود شده است.این بدان معنی است که هر نمونه از کلاس Person دارای فیلد Name خاص خود با مقدار جداگانه است.حالا دو نمونه از کلاس Person ایجاد کنید:var p1 = new Person(&#39;&#39;John&#39;&#39;);&#xA;var p2 = new Person(&#39;&#39;Jane&#39;&#39;);&#xA;Console.WriteLine($&#39;&#39;p1 Name: {p1.Name}&#39;&#39;);&#xA;Console.WriteLine($&#39;&#39;p2 Name: {p2.Name}&#39;&#39;);همانطور که در تصویر می بینید ، p1 و p2 ارجاعی هستند که به اشیاء مجزای Person با فیلدها و مقادیر نام خود اشاره دارند.تعریف static fields :یک فیلد استاتیک به یک کلاس محدود می شود، نه نمونه ای از کلاس. برای اعلام یک فیلد static ، از کلمه کلیدی static استفاده می کنید. مثال زیر را در نظر بگیرید.در ادامه یک فیلد static Count به کلاس Person اضافه کنید و مقدار آن را صفر کنید:class Person&#xA;{&#xA;    public string Name;&#xA;    public static int Count = 0;&#xA;    public Person(string name)&#xA;    {&#xA;        Name = name;&#xA;    }&#xA;}بر خلاف یک instance field، کامپایلر یک مکان حافظه جداگانه برای ذخیره یک فیلد استاتیک ایجاد می کند:برای دسترسی به فیلد استاتیک Count در کلاس Person، مستقیماً به فیلد ارجاع می دهید:Countاز آنجایی که فیلد استاتیک Count به کلاس Person محدود شده است، نه نمونه ای از کلاس، نمی توانید از کلمه کلیدی this برای ارجاع به آن استفاده کنید. عبارت زیر منجر به خطا می شود:this.Countدر قدم بعدی بیایید مقدار فیلد استاتیک Count را یک عدد در سازنده افزایش دهید:class Person&#xA;{&#xA;    public string Name;&#xA;    public static int Count = 0;&#xA;    public Person(string name)&#xA;    {&#xA;        Name = name;&#xA;        Count++;&#xA;    }&#xA;}در ادامه با استفاده از ClassName.StaticField به یک فیلد ثابت خارج از کلاس دسترسی پیدا کنید:Console.WriteLine(Person.Count); // 0در نهایت دو نمونه از کلاس Person ایجاد کنید. هر عبارت به طور ضمنی سازنده Person را فراخوانی می کند که مقدار فیلد استاتیک Count را یک برابر افزایش می دهد:Console.WriteLine($&#39;&#39;Person count: {Person.Count}&#39;&#39;); // 0&#xA;var p1 = new Person(&#39;&#39;John&#39;&#39;);&#xA;var p2 = new Person(&#39;&#39;Jane&#39;&#39;);&#xA;Console.WriteLine($&#39;&#39;Person count: {Person.Count}&#39;&#39;); // 2خلاصه instance fields، static fieldsاز کلمه کلیدی static برای تعریف یک static field or property در یک کلاس استفاده کنید.یک static field or property به یک کلاس محدود شده است، نه یک نمونه خاص از کلاس.تعریف Property :طبق تعریف، یک Property عضوی از یک کلاس است که راهی انعطاف‌پذیر برای خواندن، نوشتن یا محاسبه مقدار یک فیلد خصوصی ارائه می‌کند.به عنوان مثال، شکل زیر کلاس Person را با سه فیلد خصوصی firstName، lastName و age تعریف می کند:class Person&#xA;{&#xA;    private string Name;&#xA;    private string Family;&#xA;    private int age;   &#xA;}برای تخصیص مقادیر و خواندن مقادیر از این فیلدهای خصوصی، از Property ها استفاده می کنید. قطعه کد زیر نحوه اضافه کردن سه Property به کلاس Person را نشان می دهد:class Person&#xA;{&#xA;    private string name;&#xA;    private string family;&#xA;    private int age;&#xA;    public string Name&#xA;    {&#xA;        get { return name; }&#xA;        set { name= value; }&#xA;    }&#xA;    public string Family&#xA;    {&#xA;        get { return family; }&#xA;        set { family= value; }&#xA;    }&#xA;    public int Age&#xA;    {&#xA;        get { return age; } &#xA;        set { age = value; }&#xA;    }&#xA;}در این مثال، یک Property مانند یک فیلد را با بلوک‌های get و set اعلام می‌کنیم. get و set را دسترسی های Property یا property accessors می نامند.وقتی از یک Property می خوانید، get accessor اجرا می شود. و وقتی مقداری را به یک Property اختصاص می دهید، set accessor اجرا می شود. مثلا:var p1 = new Person();&#xA;p1.Name = &#39;&#39;farshid&#39;&#39;&#xA;p1.Family= &#39;&#39;azizi&#39;&#39;&#xA;Console.WriteLine($&#39;&#39;{p1.Name} {p1.Family}&#39;&#39;);در این مثال:ابتدا یک نمونه از کلاس Person ایجاد کنید.دوم، مقادیر را به Property های Name و Family اختصاص دهید.سوم، خواندن مقادیر از Property های Name و Family.استفاده از C# Property برای اعتبارسنجی داده ها :از آنجایی که یک Property مکانی مرکزی برای تخصیص یک مقدار به یک فیلد خصوصی است، می‌توانید داده‌ها را اعتبارسنجی کنید و اگر داده‌ها معتبر نیستند، استثنا(exception) ایجاد کنید.فرض کنید می خواهید قوانین اعتبارسنجی زیر را پیاده سازی کنید:نام و نام خانوادگی پوچ یا خالی نیست.سن بین 1 تا 120 سال است.برای انجام این کار، می‌توانید منطق اعتبارسنجی را به set accessors اضافه کنید، همانطور که در مثال زیر نشان داده شده است:class Person&#xA;{&#xA;    private string name;&#xA;    private string family;&#xA;    private int age;&#xA;    public string Name&#xA;    {&#xA;        get&#xA;        {&#xA;            return name;&#xA;        }&#xA;        set&#xA;        {&#xA;            if (string.IsNullOrEmpty(value))&#xA;            {&#xA;                throw new ArgumentException(&#39;&#39;The name must not be empty or null&#39;&#39;);&#xA;            }&#xA;            name= value;&#xA;        }&#xA;    }&#xA;    public string Family&#xA;    {&#xA;        get&#xA;        {&#xA;            return family;&#xA;        }&#xA;        set&#xA;        {&#xA;            if (string.IsNullOrEmpty(value))&#xA;            {&#xA;                throw new ArgumentException(&#39;&#39;The family must not be empty or null&#39;&#39;);&#xA;            }&#xA;            fa,ily= value;&#xA;        }&#xA;    }&#xA;    public int Age&#xA;    {&#xA;        get&#xA;        {&#xA;            return age;&#xA;        }&#xA;        set&#xA;        {&#xA;            if (value &lt; 0 || value &gt; 120)&#xA;            {&#xA;                throw new ArgumentException(&#39;&#39;The age must be between 1 and 120&#39;&#39;);&#xA;            }&#xA;            age = value;&#xA;        }&#xA;    }&#xA;}ـ computed property :برای ایجاد یک property محاسبه‌شده، می‌توانید get accessor را پیاده‌سازی کنید. به عنوان مثال، می توانید یک پراپرتی FullName ایجاد کنید که الحاق Name و Family را برمی گرداند:class Person&#xA;{&#xA;    private string name;&#xA;    private string family;&#xA;    private int age;&#xA;    public string Name&#xA;    {&#xA;        get&#xA;        {&#xA;            return name;&#xA;        }&#xA;        set&#xA;        {&#xA;            if (string.IsNullOrEmpty(value))&#xA;            {&#xA;                throw new ArgumentException(&#39;&#39;The name must not be empty or null&#39;&#39;);&#xA;            }&#xA;            name= value;&#xA;        }&#xA;    }&#xA;    public string Family&#xA;    {&#xA;        get&#xA;        {&#xA;            return family;&#xA;        }&#xA;        set&#xA;        {&#xA;            if (string.IsNullOrEmpty(value))&#xA;            {&#xA;                throw new ArgumentException(&#39;&#39;The family must not be empty or null&#39;&#39;);&#xA;            }&#xA;            family= value;&#xA;        }&#xA;    }&#xA;    public int Age&#xA;    {&#xA;        get&#xA;        {&#xA;            return age;&#xA;        }&#xA;        set&#xA;        {&#xA;            if (value &lt; 0 || value &gt; 120)&#xA;            {&#xA;                throw new ArgumentException(&#39;&#39;The age must be between 1 and 120&#39;&#39;);&#xA;            }&#xA;            age = value;&#xA;        }&#xA;    }&#xA;    public string FullName&#xA;    {&#xA;        get &#xA;        {&#xA;            return $&#39;&#39;{Name} {Family}&#39;&#39;&#xA;        }&#xA;    }&#xA;}و می توانید از ویژگی FullName بخوانید:12345var p1 = new Person();&#xA;p1.Name= &#39;&#39;farshid&#39;&#39;&#xA;p1.Family= &#39;&#39;azizi&#39;&#39;&#xA;p1.Age = 25;&#xA;Console.WriteLine(p1.FullName);اگر بخواهید مقداری را به ویژگی FullName اختصاص دهید، با یک خطای کامپایل مواجه خواهید شد. مثلا:123456var p1 = new Person();&#xA;p1.Name= &#39;&#39;farshid&#39;&#39;&#xA;p1.Family= &#39;&#39;azizi&#39;&#39;&#xA;p1.Age = 25;&#xA;Console.WriteLine(p1.FullName);&#xA;p1.FullName = &#39;&#39;farshid azizi&#39;&#39;خطا :Property or indexer &#39;Person.FullName&#39; cannot be assigned to -- it is read onlyـ auto-implemented properties :اگر property دارید که نیازی به منطق اضافی در set or get accessors ندارد ، می‌توانید ازauto-implemented properties استفاده کنید.مثال زیر کلاس Skill را تعریف می کند که دارای دو فیلد خصوصی(private fields) نام(name) و رتبه بندی(rating) است:class Skill&#xA;{&#xA;    private string name;&#xA;    private sbyte rating;&#xA;    public string Name&#xA;    {&#xA;        get { return name; }&#xA;        set { name = value; }&#xA;    }&#xA;    public sbyte Rating&#xA;    {&#xA;        get { return rating; }&#xA;        set { rating = value; }&#xA;    }&#xA;}از آنجایی که accessors پراپرتی ها منطق اضافی به جز خواندن و نوشتن در فیلدهای خصوصی ندارند، می‌توانید از auto-implemented properties مانند این استفاده کنید:class Skill&#xA;{&#xA;    public string Name { get; set; }&#xA;    public sbyte Rating { get; set; }&#xA;}هنگامی که کامپایلر سی شارپ با یک auto-implemented properties مواجه می‌شود، یک فیلد خصوصی و anonymous ایجاد می‌کند که می‌توان از طریق set و get accessors به آن دسترسی پیدا کرد.همانطور که می بینید، auto-implemented properties کد را در این مورد مختصرتر می کند.class Skill&#xA;{    public string Name { get; set; }&#xA;    public sbyte Rating { get; set; } = 1;&#xA;}در مثال بالا، ویژگی Rating را مقداردهی اولیه می کنیم تا زمانی که یک نمونه جدید از کلاس Skill ایجادمی کنید، مقدار آن یک باشد.خوب بیایید یک خلاصه و جمع بندی از مطالب تا اینجا داشته باشیم :یک property عضوی از یک کلاس است که روشی انعطاف‌پذیر برای خواندن، نوشتن یا محاسبه مقدار یک فیلد خصوصی ارائه می‌کند.یک property حاوی set و get accessors است.هنگامی که شما مقدار را از property می خوانید، get accessors اجرا می شود، در حالی که وقتی مقداری را به ویژگی اختصاص می دهید، set accessors اجرا می شود.اگر set و get accessors منطق اضافی ای ندارند، از auto-implemented properties استفاده کنید.تعریف static property :مانند یک فیلد استاتیک، یک static property به یک کلاس محدود می شود، نه هر نمونه ای از کلاس. مثال زیر کلاس Person را با یک property استاتیک Count دوباره تعریف می کند:class Person&#xA;{&#xA;    public string Name;&#xA;    public static int Count { get; private set; }&#xA;    public Person(string name)&#xA;    {&#xA;        Name = name;&#xA;        Count++;&#xA;    }&#xA;}در این مثال، ویژگی Count دارای یک دسترسی عمومی get و یک دسترسی خصوصی set است. این بدان معناست که شما می توانید ویژگی Count را در داخل کلاس تغییر دهید و از داخل و خارج از کلاس به آن دسترسی داشته باشید.بیشتر بخوانید : دوره آموزشی #C-قسمت 16 - Static Methodsبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:30:52 +0330</pubDate></item><item><title>دوره آموزشی #C-قسمت 14-Expression-Bodied Members</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-14-expression-bodied-members-npsbjiupmr4s</link><description>دوره آموزشی #C - قسمت 13- Object Initializerمقدمه ای بر expression-bodied members :قبل از هرگونه تعریف اجازه بدهید با یک مثال از متدها(Methods)  مفهوم expression-bodied را دریابیم :تعریف expression-bodied در متدها(Methods) :فرض کنید یک متد یک عبارت(expression) دارد که مقداری را برمی‌گرداند و نوع آن با نوع برگشتی متد مطابقت دارد، شما می‌توانید از تعریف expression body استفاده کنید:class Person&#xA;{&#xA;    public string FirstName { get; set; }&#xA;    public string LastName { get; set; }   &#xA;    public byte Age { get; set; }&#xA;    public string GetFullName()&#xA;    {&#xA;        return $&#39;&#39;{FirstName} {LastName}&#39;&#39;;&#xA;    }&#xA;}در کلاس Person، متد ()GetFullName رشته‌ای را برمی‌گرداند که با نوع برگشتی عبارت مطابقت دارد:public string GetFullName()&#xA;{&#xA;    return $&#39;&#39;{FirstName} {LastName}&#39;&#39;;&#xA;}بنابراین، شما می توانید از یک expression-bodied method  به صورت زیر استفاده کنید:public string GetFullName() =&gt; $&#34;{FirstName} {LastName}&#34;خوب متوجه شدید ! تعاریف expression-bodied به شما امکان می دهد پیاده سازی یک عضو(member) را به شکلی بسیار مختصر و خوانا ارائه دهید. تعریف expression-bodied دارای نحو زیر است:member =&gt; expression;در این syntax  عضو یا  member  می تواند یک method، یک property، یک constructor، یک finalizer و یا یک indexer باشد.هدف از تعریف expression-bodied این است که کد را مختصر و خواناتر کند.این syntax اجازه می دهد تا از شر  {} و کلمه کلیدی return خلاص شوید.بیایید یک مثال دیگر از methodها را ببینیم :public class Person&#xA;{&#xA;   public Person(string firstName, string lastName)&#xA;   {&#xA;      fname = firstName;&#xA;      lname = lastName;&#xA;   }&#xA;   private string fname;&#xA;   private string lname;&#xA;   public override string ToString() =&gt; $&#39;&#39;{fname} {lname}&#39;&#39;.Trim();&#xA;   public void DisplayName() =&gt; Console.WriteLine(ToString());&#xA;}&#xA;class Example&#xA;{&#xA;   static void Main()&#xA;   {&#xA;      Person p = new Person(&#39;&#39;Mandy&#39;&#39;, &#39;&#39;Dejesus&#39;&#39;);&#xA;      Console.WriteLine(p);&#xA;      p.DisplayName();&#xA;   }&#xA;}گفتیم برای استفاده از expression body برای یک method باید نوع آن با نوع برگشتی متد مطابقت داشته باشد، که این موضوع برای متدهایی که void را برمی‌گردانند نیز صدق می کند :public void DisplayName() =&gt; Console.WriteLine(ToString());تعریف expression-bodied در Read-only properties :نحو زیر را در نظر بگیرید : PropertyType PropertyName =&gt; expression;مثال :class Person&#xA;{&#xA;    public string FirstName { get; set; }&#xA;    public string LastName { get; set; }&#xA;    public byte Age { get; set; }&#xA;    public bool CanVote&#xA;    {&#xA;        get&#xA;        {&#xA;            return Age &gt;= 18;&#xA;        }&#xA;    }&#xA;    public string GetFullName() =&gt; $&#34;{FirstName} {LastName}&#34;&#xA;}از آنجایی که پراپرتی CanVote فقط خواندنی است، می توانید از expression-bodied مانند زیر استفاده کنید:public bool CanVote =&gt; Age &gt;= 18;تعریف expression-bodied در  properties :شما می توانید از expression-bodied برای پیاده سازی accessorهای پراپرتی های get و set استفاده کنید. مثال زیر نحوه انجام این کار را نشان می دهد:public class Location&#xA;{&#xA;   private string locationName;&#xA;   public Location(string name) =&gt; Name = name;&#xA;   public string Name&#xA;   {&#xA;      get =&gt; locationName;&#xA;      set =&gt; locationName = value;&#xA;   }&#xA;}تعریف expression-bodied در  Constructors :مثال زیر کلاس Skill را تعریف می کند که سازنده آن expressionی دارد که نام مهارت را به پراپرتی Name اختصاص می دهد:  class Skill&#xA;    {&#xA;        public string Name { get; set; }&#xA;        public Skill(string name)&#xA;        {&#xA;            Name = name;&#xA;        }&#xA;    }بنابراین، می توانید از تعریف expression-bodied برای سازنده Skill به صورت زیر استفاده کنید: class Skill&#xA;    {&#xA;        public string Name { get; set; }&#xA;        public Skill(string name) =&gt; Name = name;&#xA;    }تعریف expression-bodied در  Indexers:مثال زیر کلاس Matrix را تعریف می کند که از یک indexبرای دسترسی به یک element در یک سطر و ستون استفاده می کند:   class Matrix&#xA;    {&#xA;        private double[,] data;&#xA;        public Matrix(int row, int column)&#xA;        {&#xA;            data = new double[row, column];&#xA;        }&#xA;        public double this[int row, int column]&#xA;        {&#xA;            get { return data[row, column]; }&#xA;            set { data[row, column] = value; }&#xA;        }&#xA;    }در این مثال، accessorهای get و set مربوط به indexer تنها یک عبارت دارند. بنابراین می توانید از تعریف بدنه عبارت به صورت زیر استفاده کنید:   class Matrix&#xA;    {&#xA;        private double[,] data;&#xA;        public Matrix(int row, int column) =&gt; data = new double[row, column];&#xA;        public double this[int row, int column]&#xA;        {&#xA;            get =&gt; data[row, column];&#xA;            set =&gt; data[row, column] = value;&#xA;        }&#xA;    }تعریف expression-bodied در  Finalizers:تعریف expression-bodied  برای finalizer  معمولاً حاوی عبارات پاکسازی است، مانند عباراتی که منابع مدیریت نشده را آزاد می کنند.مثال زیر finalizerای را تعریف می کند که از expression-bodied برای نشان دادن فراخوانی finalizer استفاده می کند.public class Destroyer&#xA;{&#xA;   public override string ToString() =&gt; GetType().Name;&#xA;   ~Destroyer() =&gt; Console.WriteLine($&#39;&#39;The {ToString()} finalizer is executing.&#39;&#39;);&#xA;}بیشتر بخوانید : دوره آموزشی #C-قسمت 15- Static Field &amp;amp;amp;amp;amp; Propertyبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:30:36 +0330</pubDate></item><item><title>دوره آموزشی #C - قسمت 13- Object Initializer</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-13-object-initializer-cgekmjwidtf9</link><description>دوره آموزشی #C - قسمت 12- Indexerمقدمه ای بر object initializer :خوب object initializer  به شما امکان می دهد تا فیلدهای قابل دسترسی و پراپرتی های یک شی از یک کلاس را مقداردهی اولیه کنید.ابتدا کلاس Person را با سه پراپرتی عمومی و دو سازنده تعریف کنید:class Person&#xA;{&#xA;    public string FirstName { get; set; }&#xA;    public string LastName { get; set; }&#xA;    public byte Age { get; set; }&#xA;    public Person() &#xA;    {&#xA;    }&#xA;    public Person(string firstName, string lastName)&#xA;    {&#xA;        FirstName = firstName;&#xA;        LastName = lastName;&#xA;    }&#xA;}در مرحله بعد، یک نمونه جدید از کلاس Person ایجاد کنید و مقادیری را به پراپرتی های Firstname، LastName و Age اختصاص دهید:var p1 = new Person();&#xA;p1.FirstName = &#39;reza&#39;;&#xA;p1.LastName = &#39;amiri&#39;;&#xA;p1.Age = 18;به جای انجام این کار، می توانید از یک object initializer برای ایجاد یک نمونه جدید از کلاس Person استفاده کنید و مقادیر را به property های شی اختصاص دهید:var p1 = new Person&#xA;{&#xA;    FirstName = &#34;reza&#34;,&#xA;    LastName = &#34;amiri&#34;,&#xA;    Age = 18&#xA;};همچنین، می توانید یک سازنده را با یک object initializer ترکیب کنید. مثال زیر سازنده دوم از کلاس person  را فراخوانی می کند و مقداری را به پراپرتی Age اختصاص می دهد:var p1 = new Person(&#39;reza&#39;, &#39;amiri&#39;) { Age = 18 };استفاده از object initializers بهمراه indexers :سی شارپ به شما این امکان را می دهد که از یک object initializer برای تنظیم یک indexer در یک شی استفاده کنید. به مثال زیر توجه کنید:ابتدا کلاس Matrix را تعریف می کند که از یک indexer برای دریافت و تنظیم عناصر در یک سطر و ستون مشخص استفاده می کند:class Matrix&#xA;{&#xA;    private double[,] data;&#xA;    public Matrix(int row, int column)&#xA;    {&#xA;        data = new double[row, column];&#xA;    }&#xA;    public double this[int row, int column]&#xA;    {&#xA;        get =&gt; data[row, column];&#xA;        set =&gt; data[row, column] = value;&#xA;    }&#xA;}در قدم بعد، یک نمونه جدید از کلاس Matrix ایجاد کنید و از یک  object initializer برای تخصیص عناصر استفاده کنید:var matrix = new Matrix(3, 3)&#xA;{&#xA;    [0, 0] = 1,&#xA;    [0, 1] = 2,&#xA;    [0, 2] = 3,&#xA;    [1, 0] = 4,&#xA;    [1, 1] = 5,&#xA;    [1, 2] = 6,&#xA;    [2, 0] = 7,&#xA;    [2, 1] = 8,&#xA;    [2, 2] = 9&#xA;};&#xA;for (int row = 0; row &lt; 3; row++)&#xA;{&#xA;    for (int column = 0; column &lt; 3; column++)&#xA;    {&#xA;        Console.Write($&#34;{matrix[row, column]} &#34;);&#xA;    }&#xA;    Console.WriteLine();&#xA;}خروجی : 1 2 34 5 67 8 9بیشتر بخوانید : دوره آموزشی #C-قسمت 14-Expression-Bodied Membersبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 17:30:12 +0330</pubDate></item><item><title>دوره آموزشی #C - قسمت 12- Indexer</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-12-indexer-rdnpmgx3amgw</link><description>دوره آموزشی #C - قسمت 11- Constantsمقدمه ای بر Indexer در سی شارپ :ایندکس به یک شی از کلاس اجازه می دهد تا مانند یک آرایه ایندکس شود. برای تعریف یک Indexer برای یک کلاس، از دستور زیر استفاده می کنید:class MyClass&#xA;{&#xA;    public type this[int index]&#xA;    {&#xA;        get { // return a value }&#xA;        set { // assing a value }&#xA;    }&#xA;}سینتکس یک Indexer مانند یک propery است با این تفاوت که accessor  آن یک پارامتر را می گیرد:ابتدا نوع مقدار بازگشتی را تعریف کنید.دوم، Indexer را با استفاده از  کلمه کلیدی this تعریف کنید.سوم، یک پارامتر از Indexer  را تعریف کنید. لازم نیست پارامتر یک عدد صحیح باشد. نوع پارامتر به نحوه طراحی مکانیسم جستجو بستگی دارد. همچنین یک Indexer  می تواند بیش از یک پارامتر داشته باشد.در نهایت، get و set accessors را تعریف کنید. get accessor یک مقدار را برمی‌گرداند در حالی که accessor set یک مقدار را اختصاص می‌دهد. اگر Indexer دسترسی set accessor را نداشته باشد، Indexer  فقط خواندنی است.توجه داشته باشید که Indexer ها می توانند چند overload داشته باشند. به عبارت دیگر، یک کلاس می تواند چندین Indexer  داشته باشد.اگر set accessor را حذف کنید، نمایه ساز فقط خواندنی می شود. در این مورد، می‌توانید از syntax زیر برای کوتاه کردن تعریف آن استفاده کنید:class MyClass&#xA;{&#xA;    public type this[int index] =&gt; returnValue;&#xA;}توجه داشته باشید که نیازی به استفاده از کلمه کلیدی get ندارید.اما با وجود set accessor هم می توانید از syntax زیر برای کوتاه کردن تعریف آن استفاده کنید :class MyClass&#xA;{&#xA;    public type this[int i]&#xA;    {&#xA;        get =&gt; member[i];&#xA;        set =&gt; member[i] = value;&#xA;    }&#xA;}مثالی از  readonly indexer :فرض کنید جمله ای مانند زیر دارید:&#34;Welcom to c#&#34;و می خواهید با استفاده از یک index به هر کلمه از جمله دسترسی داشته باشید. مثلا:sentence[0]باید اولین کلمه (Welcom) را برگرداند، نه اولین کاراکتر (W):برای انجام این کار، می توانید یک کلاس جدید تعریف کنید و از یک indexer استفاده کنید.ابتدا یک فایل جدید به نام Sentence.cs ایجاد کنید.دوم، کلاس Sentence را در فایل Sentence.cs تعریف کنید:class Sentence&#xA;{&#xA;    private string[] words;&#xA;    public Sentence(string s)&#xA;    {&#xA;        words = s.Split(&#39; &#39;);&#xA;    }&#xA;}سازنده ()Sentence یک رشته ورودی را با فاصله به کلمات تقسیم می کند و نتیجه را به فیلد words اختصاص می دهد.سوم، یک indexer  در کلاس جمله تعریف کنید:class Sentence&#xA;{&#xA;    private string[] words;&#xA;    public Sentence(string s)&#xA;    {&#xA;        words = s.Split(&#39; &#39;);&#xA;    }&#xA;    public string this[int index]&#xA;    {&#xA;        get&#xA;        {&#xA;            return words[index];&#xA;        }&#xA;    }&#xA;}در این مثال، indexer کلمه موجود در جمله را بر اساس یک index برمی گرداند.// Program.csvar sentence = new Sentence(&#39;Welcom to C#&#39;);&#xA;Console.WriteLine(sentence[0]);&#xA;Console.WriteLine(sentence[1]);&#xA;Console.WriteLine(sentence[2]);از آنجا که indexrer در کلاس Sentence فقط خواندنی است، می توانید آن را با استفاده از سینتکس زیر این کوتاه کنید:class Sentence&#xA;{&#xA;    private string[] words;&#xA;    public Sentence(string s)&#xA;    {&#xA;        words = s.Split(&#39; &#39;);&#xA;    }&#xA;    public string this[int index] =&gt; words[index];&#xA;}مثالی از indexer بهمراه set و get accessors :مثال زیر کلاس Matrix  را تعریف می کند که از یک آرایه چند بعدی به عنوان یک فیلد و یک indexer  برای دسترسی به عناصر آن استفاده می کند:class Matrix&#xA;{&#xA;    private double[,] data;&#xA;    public Matrix(int row, int column)&#xA;    {&#xA;        data = new double[row, column];&#xA;    }&#xA;    public double this[int row, int column]&#xA;    {&#xA;        get { return data[row, column]; }&#xA;        set { data[row, column] = value; }&#xA;    }&#xA;}اکنون می‌توانید از شیء Matrix  مانند آرایه‌ای مانند زیر استفاده کنید:// Program.csvar matrix = new Matrix(3,3);&#xA;for (int row = 0; row &lt; 3; row++)&#xA;{&#xA;    for (int column = 0; column &lt; 3; column++)&#xA;    {&#xA;        matrix[row, column] = row + column;&#xA;    }&#xA;}&#xA;for (int row = 0; row &lt; 3; row++)&#xA;{&#xA;    for (int column = 0; column &lt; 3; column++)&#xA;    {&#xA;        Console.Write($&#39;{matrix[row, column]} &#39;);&#xA;    }&#xA;    Console.WriteLine();&#xA;}خروجی :0 1 21 2 32 3 4بیشتر بخوانید : دوره آموزشی #C - قسمت 13- Object Initializerبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 11:46:19 +0330</pubDate></item><item><title>دوره آموزشی #C - قسمت 11- Constants</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-11-constants-ehcpogqywc7o</link><description>دوره آموزشی #C - قسمت 10- Propertyمقدمه ای بر ثابت ها(Constants) در سی شارپ یک ثابت(constant) مقداری را نگه می دارد که در زمان کامپایل مشخص است و در طول اجرای برنامه تغییر نمی کند.برای تعریف یک ثابت، از کلمه کلیدی const با syntax زیر استفاده می کنید:const type ConstantName = value;سی شارپ فقط به شما اجازه می دهد تا از built-in types به جز object به عنوان ثابت استفاده کنید.اگر ثابت ها را در یک متد تعریف کنید، ثابت ها فقط در متد قابل دسترسی هستند. با این حال، اگر ثابت‌هایی را در یک کلاس تعریف کنید، می‌توانید از access modifierهایی مانند public و private برای کنترل سطح دسترسی ثابت‌ها استفاده کنید.استفاده از ثابت ها در یک متد :مثال زیر یک کلاس Converter را با متد ()KgToPound تعریف می کند که وزن را از کیلوگرم به پوند تبدیل می کند:class Converter&#xA;{&#xA;    public decimal KgToPound(decimal weight) &#xA;    {&#xA;        const decimal factor = 2.205m;&#xA;        return weight * factor;&#xA;    }&#xA;}در این متد ()KgToPound ثابت فاکتور را با مقدار 2.205 تعریف می کنیم. از آنجایی که فاکتور برای متد ()KgToPound محلی است، شما فقط می توانید از آن در داخل متد استفاده کنید. به عبارت دیگر نمی توانید از ثابت ضریب در متد های دیگر استفاده کنید.استفاده از ثابت ها در یک کلاس:مثال زیر کلاس Converter فوق را که دارای ثابت Factor به عنوان عضو کلاس تعریف شده است، دوباره تعریف می کند:class Converter&#xA;{&#xA;    public const decimal Factor = 2.205m;&#xA;    public decimal KgToPound(decimal weight) &#xA;    {&#xA;        return weight * Factor;&#xA;    }&#xA;    public decimal PoundToKg(decimal weight)&#xA;    {&#xA;        return weight / Factor;&#xA;    }&#xA;}در این مثال، از آنجایی که ثابت Factor عمومی(public) است، هم از متدهای کلاس Converter و هم از خارج از کلاس قابل دسترسی است.مثال زیر از کلاس Converter برای تبدیل وزن از کیلوگرم به پوند استفاده می کند:decimal weightInKg, weightInLbs;&#xA;var converter = new Converter();&#xA;Console.WriteLine($&#39;Convert weight from kg to lbs (factor = {Converter.Factor})&#39;);&#xA;while(true)&#xA;{&#xA;    // Prompt to enter a weight in Kg:&#xA;    Console.Write(&#39;Enter a weight in Kg (0 to exit):&#39;);&#xA;    weightInKg = Convert.ToDecimal(Console.ReadLine());&#xA;       if(weightInKg == 0)&#xA;    {&#xA;        break;&#xA;    }&#xA;    // convert weight from kg to lbs&#xA;    weightInLbs = converter.KgToPound(weightInKg);&#xA;    Console.WriteLine($&#39;{weightInKg}kg = {weightInLbs}lbs&#39;);&#xA;}خروجی :Convert weight from kg to lbs (factor = 2.205)Enter a weight in Kg (0 to exit):11kg = 2.205lbsEnter a weight in Kg (0 to exit):22kg = 4.410lbsEnter a weight in Kg (0 to exit):2.52.5kg = 5.5125lbEnter a weight in Kg (0 to exit):0بیشتر بخوانید : دوره آموزشی #C - قسمت 12- Indexerبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 10:33:49 +0330</pubDate></item><item><title>دوره آموزشی #C - قسمت 10- Property</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-10-property-kh7saqhqaadz</link><description>دوره آموزشی #C - قسمت نهم- Constructorsمقدمه ای بر propertyها سی شارپ :طبق تعریف، یک property عضوی از یک کلاس است که روشی انعطاف‌پذیر برای خواندن، نوشتن یا محاسبه مقدار یک فیلد خصوصی ارائه می‌کند.مثال  زیر کلاس Person را با سه فیلد خصوصی firstName، lastName و age تعریف می‌کند:class Person&#xA;{&#xA;    private string firstName;&#xA;    private string lastName;&#xA;    private int age;   &#xA;}برای تخصیص مقادیر و خواندن مقادیر از این فیلدهای خصوصی، از پراپرتی ها استفاده می کنید. مثال زیر نحوه اضافه کردن سه پراپرتی به کلاس Person را نشان می دهد:class Person{    private string firstName;&#xA;    private string lastName;&#xA;    private int age;&#xA;    public string FirstName&#xA;    {&#xA;        get { return firstName; }&#xA;        set { firstName = value; }&#xA;    }&#xA;    public string LastName&#xA;    {&#xA;        get { return lastName; }&#xA;        set { lastName = value; }&#xA;    }&#xA;    public int Age&#xA;    {&#xA;        get { return age; } &#xA;        set { age = value; }&#xA;    }&#xA;}در این مثال، یک پراپرتی مانند یک فیلد را با بلوک‌های get و set اعلان می‌کنیم. get و set را property accessors می‌گویند.وقتی از یک property می خوانید، get accessor اجرا می شود. و وقتی مقداری را به یک property اختصاص می دهید، set accessor اجرا می شود. مثلا:var p1 = new Person();&#xA;p1.FirstName = &#34;reza&#34;&#xA;p1.LastName  = &#34;amiri&#34;&#xA;Console.WriteLine($&#34;{p1.FirstName} {p1.LastName}&#34;);در این مثال:ابتدا یک نمونه از کلاس Person ایجاد کنید.دوم، مقادیر را به property های FirstName و LastName اختصاص دهید.سوم، خواندن مقادیر از property های FirstName و LastName.استفاده از property برای اعتبارسنجی داده ها :از آنجایی که یک property مکانی مرکزی برای تخصیص یک مقدار به یک فیلد خصوصی است، می‌توانید داده‌ها را اعتبارسنجی کنید و اگر داده‌ها معتبر نیستند، استثنا (throw exception)ایجاد کنید.فرض کنید می خواهید قوانین اعتبارسنجی زیر را پیاده سازی کنید:نام و نام خانوادگی null یا empty نباشد.سن بین 18 تا 120 سال است.برای انجام این کار، می‌توانید منطق اعتبارسنجی را به set accessors پراپرتی ها اضافه کنید، همانطور که در مثال زیر نشان داده شده است:class Person&#xA;{&#xA;    private string firstName;&#xA;    private string lastName;&#xA;    private int age;&#xA;    public string FirstName&#xA;    {&#xA;        get&#xA;        {&#xA;            return firstName;&#xA;        }&#xA;        set&#xA;        {&#xA;            if (string.IsNullOrEmpty(value))&#xA;            {&#xA;                throw new ArgumentException(&#34;The first name must not be empty or null&#34;);&#xA;            }&#xA;            firstName = value;&#xA;        }&#xA;    }&#xA;    public string LastName&#xA;    {&#xA;        get&#xA;        {&#xA;            return lastName;&#xA;        }&#xA;        set&#xA;        {&#xA;            if (string.IsNullOrEmpty(value))&#xA;            {&#xA;                throw new ArgumentException(&#34;The last name must not be empty or null&#34;);&#xA;            }&#xA;            lastName = value;&#xA;        }&#xA;    }&#xA;    public int Age&#xA;    {&#xA;        get&#xA;        {&#xA;            return age;&#xA;        }&#xA;        set&#xA;        {&#xA;            if (value &lt; 18 || value &gt; 120)&#xA;            {&#xA;                throw new ArgumentException(&#34;The age must be between 18 and 120&#34;);&#xA;            }&#xA;            age = value;&#xA;        }&#xA;    }&#xA;}مثال  زیر یک استثنا ایجاد می کند زیرا سن خارج از محدوده معتبر است (18-120)var p1 = new Person();&#xA;p1.FirstName = &#34;reza&#34;&#xA;p1.LastName  = &#34;amiri&#34;&#xA;p1.Age = 17; // cause an exceptionکه منجبر به استثنا زیر می شود :Unhandled exception. System.ArgumentException: The age must be between 18 and 120ایجاد  computed property :برای ایجاد یک computed property، می‌توانید get accessor را پیاده‌سازی کنید. به عنوان مثال، می توانید یک پراپرتی FullName ایجاد کنید که الحاق نام و نام خانوادگی را برمی گرداند:class Person&#xA;{&#xA;    private string firstName;&#xA;    private string lastName;&#xA;    private int age;&#xA;    public string FirstName&#xA;    {&#xA;        get&#xA;        {&#xA;            return firstName;&#xA;        }&#xA;        set&#xA;        {&#xA;            firstName = value;&#xA;        }&#xA;    }&#xA;    public string LastName&#xA;    {&#xA;        get&#xA;        {&#xA;            return lastName;&#xA;        }&#xA;        set&#xA;        {&#xA;            lastName = value;&#xA;        }&#xA;    }&#xA;    public int Age&#xA;    {&#xA;        get&#xA;        {&#xA;            return age;&#xA;        }&#xA;        set&#xA;        {&#xA;            age = value;&#xA;        }&#xA;    }&#xA;    public string FullName&#xA;    {&#xA;        get &#xA;        {&#xA;            return $&#34;{FirstName} {LastName}&#34;&#xA;        }&#xA;    }&#xA;}و می توانید از پراپرتی FullName بخوانید:var p1 = new Person();&#xA;p1.FirstName = &#34;reza&#34;&#xA;p1.LastName  = &#34;amiri&#34;&#xA;p1.Age = 20;&#xA;Console.WriteLine(p1.FullName);اگر بخواهید مقداری را به پراپرتی  FullName اختصاص دهید، با یک خطای کامپایل مواجه خواهید شد. مثلا:p1.FullName = &#34;Jane Smith&#34;;Property or indexer &#39;Person.FullName&#39; cannot be assigned to -- it is read onlyپراپرتی های auto-implemented :اگر پراپرتی دارید که نیازی به منطق اضافی در set یا get accessors ندارد ، می‌توانید از  auto-implemented property استفاده کنید.مثال زیر را درنظر بگیرید :class Person&#xA;{&#xA;    private string firstName;&#xA;    private string lastName;&#xA;    private int age;&#xA;    public string FirstName&#xA;    {&#xA;        get&#xA;        {&#xA;            return firstName;&#xA;        }&#xA;        set&#xA;        {&#xA;            firstName = value;&#xA;        }&#xA;    }&#xA;    public string LastName&#xA;    {&#xA;        get&#xA;        {&#xA;            return lastName;&#xA;        }&#xA;        set&#xA;        {&#xA;            lastName = value;&#xA;        }&#xA;    }&#xA;}از آنجایی که accessor های پراپرتی ها منطق اضافی به جز خواندن و نوشتن در فیلدهای خصوصی ندارند، می‌توانید از auto-implemented property مانند مثال زیر استفاده کنید:class Person&#xA;{&#xA;    public string FirstName { get; set; }&#xA;    public string LastName { get; set; }&#xA;}هنگامی که کامپایلر سی شارپ با یک auto-implemented property مواجه می‌شود، یک فیلد خصوصی و ناشناس(private, anonymous field) ایجاد می‌کند که می‌توان از طریق set و get accessors به آن دسترسی پیدا کرد.همانطور که می بینید، auto-implemented property  کد را مختصرتر می کند.همچنین می توانیم یک پراپرتی را مقداردهی اولیه کنیم تا زمانی که یک نمونه جدید از کلاس ایجاد می کنید، مقدار اولیه به آن تخصیص یابد.class Person &#xA;{     &#xA;     public string Name { get; set; }  &#xA;     public byte Rating{ get; set; }  = 10&#xA;}بیشتر بخوانید : دوره آموزشی #C - قسمت 11- Constantsبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 10:33:30 +0330</pubDate></item><item><title>دوره آموزشی #C - قسمت هشتم- Access Modifiers</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-هشتم-access-modifiers-hope0ydw3jys</link><description>دوره آموزشی #C - قسمت هفتم - C# thisخلاصه: در این پست با access modifierها و تفاوت های بین آنها آشنا می شوید.مقدمه ای بر سطح دسترسی(access modifierها) در سی شارپ :سطح دسترسی کنترل می کند(عمدتاً برای محدود کردن دستکاری ناخواسته داده‌ها) که آیا آنها(فیلدها، متدها، کلاسها) می توانند از کدهای دیگر در اسمبلی شما یا سایر اسمبلی  ها استفاده شوند.اسمبلی یک dll یا exe است که با کامپایل کردن یک یا چند فایل cs. در یک کامپایل ایجاد می شود.برای کنترل دید(visibility) اعضای کلاس (سطح امنیت هر کلاس و عضو کلاس)هنگام اعلان یک فیلد یا یک متد در یک کلاس، می توانید سطح دسترسی را مشخص کنید. publicprivateprotectedinternalprotected internalprivate protectedسطح دسترسی public :هنگام استفاده از کلمه کلیدی public برای یک فیلد یا یک متد، می توانید به فیلد و متد از داخل و خارج یک کلاس دسترسی داشته باشید.برای مثال، کلاس Person را با دو فیلد عمومی Name و Family و یک متد عمومی ()GetFullName در نظر بگیرید:class Person&#xA;{&#xA;    public string Name;&#xA;    public string Family;&#xA;    public string GetFullName()&#xA;    {&#xA;        return $&#34;{this.Name} {this.Family}&#34;&#xA;    }&#xA;} از آنجایی که فیلدها و متدهای کلاس Person عمومی هستند، می توانید از خارج از کلاس به آنها دسترسی داشته باشید:Person p1 = new();&#xA;p1.Name = &#34;reza&#34;&#xA;p1.Family = &#34;amiri&#34;&#xA;Console.WriteLine(p1.GetFullName());سطح دسترسی private :هنگام استفاده از کلمه کلیدی private برای یک فیلد یا متد، فقط می توانید به آنها داخل همان کلاس دسترسی داشته باشید. یعنی شما نمی توانید به فیلد خصوصی یا متد خارج از کلاس دسترسی داشته باشید.به طور معمول، شما از private access modifier برای جلوگیری از دسترسی مستقیم به فیلدهای یک کلاس استفاده می کنید. همچنین، زمانی که می خواهید از آن متد فقط در کلاس استفاده کنید، از متد private استفاده می کنید.برای دستیابی به &#34;Encapsulation&#34; - که فرآیند اطمینان از پنهان شدن داده های &#34;حساس&#34; از کاربران است. این کار با اعلام فیلدها به عنوان private انجام می شود.اگر یکaccess modifier برای یک عضو مشخص نکنید، آن عضو private خواهد بود.مثال زیر از شما می خواهد که نام و نام خانوادگی خود را وارد کنید و مقادیری را به فیلدهای Name و Family شی Person اختصاص می دهد:Person p1 = new();&#xA;Console.WriteLine(&#34;Enter the  name and family :&#34;);&#xA;string? name = Console.ReadLine();&#xA;string? family = Console.ReadLine();&#xA;if (!string.IsNullOrEmpty(name))&#xA;{&#xA;    p1.Name= name;&#xA;}&#xA;if (!string.IsNullOrEmpty(family))&#xA;{&#xA;    p1.Family = family;&#xA;}&#xA;Console.WriteLine(p1.GetFullName());در این مثال، قبل از اختصاص متغیرهای name و family به فیلدهای Name و Family، بررسی می کنیم که آیا رشته های ورودی Null یا Empty نیستند.با این حال، اگر لازم باشد این کار را در چندین مکان در برنامه انجام دهیم، باید کد را کپی کنیم. همچنین اگر بخواهیم منطق اعتبارسنجی را تغییر دهیم، باید آن را در جاهای مختلف تغییر دهیم. بنابراین نگهداری کد بسیار دشوار می شود. و اصل DRY (Don’t Repeat Yourself) را در برنامه نویسی نقض می کند.برای رفع این مشکل، می توانید این مراحل را دنبال کنید:ابتدا منطق بررسی را به عنوان یک متد خصوصی در کلاس Person قرار دهید:private bool isValidName(string? name)&#xA;{&#xA;    return !string.IsNullOrEmpty(name);&#xA;}دوم، فیلدهای name و family را private کنید:private string name;&#xA;private string family;طبق قرارداد، فیلدهای خصوصی camelCase هستند پس آنها را  به تبعیت از community تغییر نام می دهیم.private string firstName;&#xA;private string lastName;از آنجایی که فیلدهای firstName و lastName خصوصی هستند، نمی‌توانیم خارج از کلاس Person به آنها دسترسی داشته باشیم. بنابراین، برای تخصیص مقادیر به این فیلدها، می‌توانیم دو متد عمومی ()SetFirstName و ()SetLastName تعریف کنیم.public Person SetFirstName(string? firstName)&#xA;{&#xA;    if (isValidName(firstName))&#xA;    {&#xA;        this.firstName = firstName;&#xA;    }&#xA;    return this;&#xA;}&#xA;public Person SetLastName(string? lastName)&#xA;{&#xA;    if (isValidName(lastName))&#xA;    {&#xA;        this.lastName = lastName;&#xA;    }&#xA;    return this;&#xA;}در داخل این متدها، ما متد ()isValidNameرا فراخوانی می کنیم تا نام را قبل از تخصیص آن به فیلد خصوصی مربوطه، اعتبارسنجی کنیم.توجه داشته باشید که بعداً یاد خواهید گرفت که چگونه با استفاده از یک property با getters و setters این کار را زیباتر انجام دهید.اکنون می توانید شی Person را ایجاد کنید و متدهای عمومی ()SetFirstName و ()SetLastName را فراخوانی کنید تا فیلدهای خصوصی نام و نام خانوادگی را تنظیم کنید:Person p1 = new();&#xA;Console.WriteLine(&#34;Enter the first name and last name:&#34;);&#xA;string? firstName = Console.ReadLine();&#xA;string? lastName = Console.ReadLine();&#xA;string name = p1.SetFirstName(firstName)&#xA;                .SetLastName(lastName)&#xA;                .GetFullName();&#xA;Console.WriteLine(name);سطح دسترسی protected :هنگام استفاده از کلمه کلیدی protected برای یک فیلد یا متد،  اجازه دسترسی متغیرها و متدها از کلاس و زیرکلاس را می دهد. بدین معنا که type یا member می توانند از داخل کلاس و کلاسی که از آن ارث بری کرده است قابل دسترسی باشند.در مثال زیر ، کلاس DerivedPoint از Point مشتق شده است. بنابراین، می توانید مستقیماً از کلاس مشتق شده به اعضای محافظت شده کلاس پایه دسترسی داشته باشید.class Point&#xA;{&#xA;    protected int x;&#xA;    protected int y;&#xA;}&#xA;class DerivedPoint: Point&#xA;{&#xA;    static void Main()&#xA;    {&#xA;        var dpoint = new DerivedPoint();&#xA;        // Direct access to protected members.&#xA;        dpoint.x = 10;&#xA;        dpoint.y = 15;&#xA;        Console.WriteLine($&#34;x = {dpoint.x}, y = {dpoint.y}&#34;);&#xA;    }&#xA;}&#xA;// Output: x = 10, y = 15اگر سطوح دسترسی x و y را به private تغییر دهید، کامپایلر پیام های خطا را صادر می کند:&#39;Point.y&#39; is inaccessible due to its protection level.&#39;Point.x&#39; is inaccessible due to its protection level.سطح دسترسی internal :هنگام استفاده از کلمه کلیدی internal  برای یک فیلد یا متد،type یا member توسط هر کدی در همان اسمبلی قابل دسترسی است، اما از اسمبلی دیگر نه. به عبارت دیگر، انواع یا اعضای داخلی از کدهایی که بخشی از همان کامپایل است قابل دسترسی هستند. مثال زیر شامل دو فایل Assembly1.cs و Assembly1_a.cs است. فایل اول شامل یک کلاس پایه داخلی، BaseClass است. در فایل دوم، تلاش برای نمونه سازی BaseClass یک خطا ایجاد می کند.// Assembly1.cs  &#xA;// Compile with: /target:library  &#xA;internal class BaseClass&#xA;{  &#xA;   public static int intM = 0;  &#xA;}و :// Assembly1_a.cs  &#xA;// Compile with: /reference:Assembly1.dll  &#xA;class TestAccess&#xA;{  &#xA;   static void Main()&#xA;   {  &#xA;      var myBase = new BaseClass();   // CS0122  &#xA;   }  &#xA;}در مثال زیر ، از همان فایل هایی که در مثال قبل استفاده کردید استفاده کنید و سطح دسترسی BaseClass را به public تغییر دهید. همچنین سطح دسترسی عضو intM را به internal تغییر دهید. در این حالت، می توانید کلاس را نمونه سازی کنید، اما نمی توانید به عضو داخلی دسترسی پیدا کنید.// Assembly2.cs  &#xA;// Compile with: /target:library  &#xA;public class BaseClass&#xA;{  &#xA;   internal static int intM = 0;  &#xA;}در ادامه :// Assembly2_a.cs  &#xA;// Compile with: /reference:Assembly2.dll  &#xA;public class TestAccess&#xA;{  &#xA;   static void Main()&#xA;   {  &#xA;      var myBase = new BaseClass();   // Ok.  &#xA;      BaseClass.intM = 444;    // CS0117  &#xA;   }  &#xA;}access modifiersبیشتر بخوانید : دوره آموزشی #C - قسمت نهم- Constructorsبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 10:33:09 +0330</pubDate></item><item><title>دوره آموزشی #C - قسمت نهم- Constructors</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-نهم-constructors-fx4c0b5odrva</link><description>دوره آموزشی #C - قسمت هشتم- Access Modifiersخلاصه : در این پست ، با سازنده های C# و نحوه استفاده از آنها برای مقداردهی اولیه اشیا آشنا خواهید شد.مفهوم سازنده ها(constructors) در سی شارپ :سازنده متد خاصی است که نام آن با نام کلاس یکی است. سازنده به دلایل زیر خاص است:سازنده نوع بازگشتی را ندارد.هنگام ایجاد یک شی جدید، کامپایلر #C، به طور خودکار سازنده را فراخوانی می کند.به طور معمول، شما از یک سازنده برای مقداردهی اولیه شی جدید با تخصیص مقادیر به پراپرتی های شی استفاده می کنید.کامپایلر C#  هنگام تعریف کلاس به طور ضمنی یک سازنده بدون هیچ پارامتری(parameterless constructor) ایجاد می کند. برای درک این موضوع  مثال زیر را در نظر بگیرید :// Person.cs&#xA; class Person&#xA;{ &#xA;}سی شارپ به طور ضمنی یک سازنده بدون هیچ پارامتری مانند زیر ایجاد می کند:// Person.cs&#xA; class Person&#xA;{&#xA;     public Person()&#xA;     {&#xA;     }&#xA; }مثال زیر نشان می دهد که چگونه #C به طور ضمنی سازنده را هنگام ایجاد یک شی جدید فراخوانی می کند:// Program.cs&#xA; Person p1 = new();Output:Create a new Person objectتعریف یک constructor :مثال زیر یک سازنده با سه پارامتر برای کلاس Person تعریف می کند:// Person.cs&#xA;class Person&#xA;{&#xA;    private string firstName;&#xA;    private string lastName;&#xA;    private byte age;&#xA;    public Person(string firstName, string lastName, byte age)&#xA;    {&#xA;        this.firstName = firstName;&#xA;        this.lastName = lastName;&#xA;        this.age = age;&#xA;    }&#xA;    public string GetFullName()&#xA;    {&#xA;        return $&#34;{this.firstName} {this.lastName}&#34;&#xA;    }&#xA;}در این مثال سازنده سه آرگومان را می پذیرد و private پراپرتی های firstName، lastName و age را مقداردهی اولیه می کند.هنگامی که به طور صریح یک سازنده تعریف می کنید، کامپایلر #C دیگر به صورت ضمنی سازنده بدون پارامتر را به کلاس اضافه نمی کند.بنابراین، برای ایجاد یک شیء جدید Person، باید سه آرگومان مانند زیر را ارسال کنید// Program.cs&#xA; var p1 = new Person(&#34;John&#34;, &#34;Doe&#34;, 25);و یا :Person p2 = new(&#34;John&#34;, &#34;Doe&#34;, 25);تعریف چند constructor  برای یک کلاس:سی شارپ به شما امکان می دهد چندین سازنده با پارامترهای مختلف برای یک کلاس تعریف کنید. مثلا:// Person.cs&#xA;class Person&#xA;{&#xA;    private string firstName;&#xA;    private string lastName;&#xA;    private byte age;&#xA;    public Person()&#xA;    {&#xA;    }&#xA;    public Person(string firstName, string lastName)&#xA;    {&#xA;        this.firstName = firstName;&#xA;        this.lastName = lastName;&#xA;    }&#xA;    public Person(string firstName, string lastName, byte age)&#xA;    {&#xA;        this.firstName = firstName;&#xA;        this.lastName = lastName;&#xA;        this.age = age;&#xA;    }&#xA;}در این مثال، کلاس Person دارای سه سازنده است.سازنده اول یک سازنده بدون پارامتر است که هیچ پارامتری را نمی پذیرد.سازنده دوم دو پارامتر را می پذیرد و خصوصیات firstName و lastName را مقداردهی اولیه می کند.سازنده سوم سه پارامتر را می پذیرد و ویژگی های firstName، lastName و age را مقداردهی اولیه می کند.با انجام این کار، می توانید با ارسال هیچ پارامتر، دو پارامتر یا سه پارامتر به سازنده های مربوطه، یک Personobject جدید ایجاد کنید:// Program.cs&#xA;var p1 = new Person();&#xA;var p2 = new Person(&#34;John&#34;, &#34;Doe&#34;);&#xA;var p3 = new Person(&#34;John&#34;, &#34;Doe&#34;, 25);برای انعطاف پذیری بیشتر برای مقداردهی اولیه یک شی جدید  می‌توانید یک سازنده را در سازنده دیگری فراخوانی کنید، همانطور که در مثال زیر نشان داده شده است:// Person.cs&#xA;    class Person&#xA;    {&#xA;        private string firstName;&#xA;        private string lastName;&#xA;        private byte age;&#xA;        public Person()&#xA;        {&#xA;            Console.WriteLine(&#34;Initialized the object&#34;);&#xA;        }&#xA;        public Person(string firstName, string lastName) : this()&#xA;        {&#xA;            this.firstName = firstName;&#xA;            this.lastName = lastName;&#xA;            Console.WriteLine(&#34;Initialized the first name &amp; last name properties&#34;);&#xA;        }&#xA;        public Person(string firstName, string lastName, byte age) : this(firstName, lastName)&#xA;        {&#xA;            this.age = age;&#xA;            Console.WriteLine(&#34;Initialized the age property&#34;);&#xA;        }&#xA;    }در این مثال، سازنده دوم، سازنده اول را از طریق این کلمه کلیدی this فراخوانی می کند:public Person(string firstName, string lastName) : this()هنگامی که یک شی با دو پارامتر ایجاد می کنید، این سازنده سازنده بدون پارامتر  را قبل از اجرای بدنه آن فراخوانی می کند.  سازنده سوم سازنده دوم را از طریق این کلمه کلیدی با آرگومان های firstName و lastName فراخوانی می کند:public Person(string firstName, string lastName, byte age) : this(firstName, lastName)اگر یک شی جدید با سه آرگومان ایجاد کنید، سازنده سوم سازنده دوم را فراخوانی می کند که سازنده اول را فراخوانی می کند.  بنابراین، سازنده ها به ترتیب زیر اجرا می شوند:public Person()&#xA;public Person(string firstName, string lastName) : this()&#xA;public Person(string firstName, string lastName, byte age) : this(firstName, lastName)با انجام این کار، می توانید از منطق سازنده های دیگر هنگام مقداردهی اولیه اشیاء استفاده مجدد کنید.لازم نیست همه پراپرتی ها دارای پارامترهای سازنده باشند. به عنوان مثال کلاس person می تواند دارای propertyای باشد که توسط هیچ پارامتر سازنده ای تنظیم نشده است، بنابراین EF Core آن را پس از فراخوانی سازنده به روش عادی تنظیم می کند.توجه داشته باشید EF Core نمی تواند ویژگی های ناوبری (navigation properties) را با استفاده از سازنده تنظیم کند.خلاصه :سازنده سی شارپ متد خاصی است که نام آن با نام کلاس یکی است.کامپایلر سی شارپ به طور خودکار سازنده را هنگام ایجاد یک شی جدید فراخوانی می کند.از سازنده ها برای مقداردهی اولیه اشیا استفاده کنید.از سازنده های متعدد در یک کلاس برای انعطاف پذیری بیشتر برای مقداردهی اولیه یک شی جدید استفاده کنید.بیشتر بخوانید : دوره آموزشی #C - قسمت 10- Propertyبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 10:32:46 +0330</pubDate></item><item><title>دوره آموزشی #C - قسمت هفتم -  this</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-قسمت-هفتم-this-bhizppkgbaql</link><description>دوره آموزشی #C - قسمت ششم - Class و Objectخلاصه: در این آموزش، با  کلمه کلیدی this و نحوه استفاده از آن آشنا خواهید شد.کلمه کلیدی this  در سی شارپ چیست؟ برای ارجاع به شی فعلی در داخل کلاس، از این کلمه کلیدی استفاده می کنید. بنابراین، کلمه کلیدی this به نمونه فعلی کلاس اشاره دارد.برای ارجاع صریح به یک فیلد در داخل متد یک کلاس، از کلمه کلیدی this و به دنبال آن عملگر نقطه (.) و نام فیلد مانند زیر استفاده می کنید:this.FieldNameبه همین ترتیب، می توانید از کلمه کلیدی this برای فراخوانی صریح یک متد در متد دیگری از کلاس استفاده کنید:this.MethodName(arguments)در این مثال زیر، از کلمه کلیدی this برای ارجاع به فیلدهای FirstName و LastName در متد ()GetFullName استفاده می کنیم. همچنین از این کلمه کلیدی برای فراخوانی متد ()GetFullName در متد ()SayHello استفاده می کنیم.class Person&#xA;{&#xA;    public string FirstName;&#xA;    public string LastName;&#xA;    public string GetFullName()&#xA;    {&#xA;        return $&#34;{this.FirstName} {this.LastName}&#34;&#xA;    }&#xA;    public string SayHello()&#xA;    {&#xA;        return $&#34;Hello, I&#39;m {this.GetFullName()}.&#34;&#xA;    }&#xA;} مثال زیر یک نمونه جدید از کلاس Person ایجاد می کند و متد ()SayHello را فراخوانی می کند:// Create a new instance of the Person class&#xA;Person p1 = new();&#xA;p1.FirstName = &#34;reze&#34;&#xA;p1.LastName = &#34;amiri&#34;&#xA;// Show the fullname&#xA;Console.WriteLine(p1.GetFullName());&#xA;// Display the greeting&#xA;Console.WriteLine(p1.SayHello());هنگام فراخوانی متد ()p1.GetFullName، کلمه کلیدی this به شیء p1 ارجاع می دهد. بنابراین فیلدهای FirstName و LastName به ترتیب &#34;reza&#34; و &#34;amiri&#34; هستند.متد ()SayHello متد ()GetFullName را از طریق  کلمه کلیدی this فراخوانی می کند. بنابراین، متد ()p1.GetFullName رشته &#34;reza amiri&#34; را برمی گرداند. از این رو، متد ()SayHello رشته &#34;Hello, i&#39;m reza amiri&#34; را برمی گرداند.در برخی موارد، استفاده از کلمه کلیدی &#34;this&#34; به صراحت ضروری نیست. مانند(مثال بالا) زمانی که متد کلاس فعلی را فراخوانی می کنیم، می توانیم مستقیماً متد را بدون استفاده از کلمه کلیدی &#34;this&#34; فراخوانی کنیم و در آن شرایط، کلمه کلیدی &#34;this&#34; به طور خودکار توسط کامپایلر اضافه می شود. اما استفاده از کلمه کلیدی this در موارد زیر ضروری است:To qualify members hidden by similar nameTo have an object pass itself as a parameter to other methodsTo have an object return itself from a methodTo declare indexersTo declare extension methodsTo pass parameters between constructorsTo internally reassign value type (struct) value.To invoke an extension method on the current instanceTo cast itself to another typeTo chain constructors defined in the same classدر ادامه تعدادی از موارد را بررسی خواهیم کرد.تمایز بین پارامترهای متد و فیلدهای کلاس همنام :کلاس زیر دارای پنج فیلد private hidden است. سازنده کلاس پنج آرگومان را می گیرد که هم نام فیلدهای خصوصی هستند. برای تمایز آرگومان های متد با فیلدهای کلاس، می توانیم از اشاره گر “this” استفاده کنیم:public class Book&#xA;    {&#xA;        private string author;&#xA;        private string title;&#xA;        private string publisher;&#xA;        private DateTime publishedOn;&#xA;        private decimal price;&#xA;        public Book(string author, string title, string publisher,&#xA;        DateTime pubdate, decimal price)&#xA;        {&#xA;            this.author = author;&#xA;            this.title = title;&#xA;            this.publisher = publisher;&#xA;            this.publishedOn = pubdate;&#xA;            this.price = price;&#xA;        }&#xA;        public decimal Price { get =&gt; price; }&#xA;    }ارسال یک نمونه از کلاس  فعلی به کلاس‌های خارجی و متدهای آن‌ها  :اگر می خواهید نمونه کلاسی را از داخل کلاس به خارج از کلاس منتقل کنید، می توانید از اشاره گر &#34;this&#34; استفاده کنید. به عنوان مثال، متد زیر، اشیاء کلاس فعلی را به متد کلاس دیگر، BookPrice.FinalPrice، ارسال می کند. public decimal CalculateSalePrice()&#xA;    {&#xA;        return (this.Price + BookPrice.FinalPrice(this));&#xA;    }متد ()BookPrice.FinalPrice مانند مثال زیر است که شی Book را به عنوان آرگومان می گیرد. public class BookPrice&#xA;    {&#xA;        public static decimal FinalPrice(Book book)&#xA;        {&#xA;            return book.Price * 0.03;&#xA;        }&#xA;    }استفاده از  کلمه کلیدی this برای method chaining :مثال زیر دو متد جدید ()SetName و ()SetFamily را به کلاس Person اضافه می کند:class Person&#xA;{&#xA;    public string Name;&#xA;    public string Family;&#xA;    public string GetFullName()&#xA;    {&#xA;        return $&#34;{this.Name} {this.Family}&#34;&#xA;    }&#xA;    public string SayHello()&#xA;    {&#xA;        return $&#34;Hello, I&#39;m {this.GetFullName()}.&#34;&#xA;    }&#xA;    public Person SetName(string name)&#xA;    {&#xA;        this.Name= name;&#xA;        return this;&#xA;    }&#xA;    public Person SetFamily(string family)&#xA;    {&#xA;        this.Family = family;&#xA;        return this;&#xA;    }&#xA;}در این مثال، متدهای ()SetName و ()SetFamily آرگومان های خود را به فیلدهای Name و Family اختصاص می دهند و نمونه فعلی کلاس Person را برمی گرداند.مثال زیر یک شی Person جدید ایجاد می کند، متدهای ()SetName و ()SetFamily  و ()SayHello را فراخوانی می کند:Person p1 = new();&#xA;p1.SetName (&#34;reza&#34;);&#xA;p1.SetFamily  (&#34;amiri&#34;);&#xA;string greeting = p1.SayHello();&#xA;Console.WriteLine(greeting);از آنجایی که هر دو متد ()SetName و ()SetFamily شیء Person فعلی را برمی گرداند، می توانید سه عبارت را با یک عبارت به صورت زیر جایگزین کنید:Person p1 = new();&#xA;string greeting = p1.SetName (&#34;reza&#34;)&#xA;                    .SetFamily (&#34;amiri&#34;)&#xA;                    .SayHello();&#xA;Console.WriteLine(greeting);این تکنیک method chaining نامیده می‌شود.استفاده از method chaining  کد را مختصرتر می کند.بیشتر بخوانید : دوره آموزشی #C - قسمت هشتم- Access Modifiersبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 10:32:26 +0330</pubDate></item><item><title>دوره آموزشی #C - مقدمه</title><link>https://virgool.ir/@farshid.azizi/دوره-آموزشی-c-مقدمه-uilgszgkcxbt</link><description>سی شارپ(#C) چیست؟ سی شارپ (#see sharp/c) یک زبان برنامه نویسی همه منظوره، ایمن و شی گرا است که توسط مایکروسافت توسعه یافته است.سی شارپ به شما اجازه می دهد تا برنامه های زیر را توسعه دهید:برنامه‌ها و سرویس‌های وب(Web apps, web APIs, microservices)برنامه‌های اینترنت اشیا (IoT/ Internet of Things)برنامه های تلفن همراه (mobile backends)برنامه های desktopیادگیری ماشین(machine learning)بازیهای کامپیوتریبرنامه های Consoleسرویس های Windowsاز ابزارهای توسعه (development tools) مورد علاقه خود در Windows، macOSو Linux استفاده کنید.سی شارپ اولین بار در سال 2000 با معرفی .NET Framework 1.0 ظاهر شد. در سال 2016، مایکروسافت NET Core 1.0. را منتشر کرد، نسخه ای چند پلتفرمی از دات نت، که به شما امکان می داد برنامه هایی را توسعه دهید که در پلتفرم های مختلف از جمله ویندوز، macOS و لینوکس اجرا شوند.سی شارپ open Source است. چرا #C : زبان های برنامه نویسی فقط ابزارهایی هستند که به شما در ساخت برنامه های کاربردی کمک می کنند. بنابراین، انتخاب ابزار مناسب به شما کمک می کند تا سرعت توسعه را افزایش دهید.سی شارپ به شما کمک می کند تا برنامه های کاربردی با کیفیت بالا را سریعتر توسعه دهید.سی شارپ سادگی و عملکرد را متعادل می کند. هدف سی شارپ کمک به شما در ساخت سریع برنامه هاست.و اما Net. چیست؟دات نت یک developer platform است که از ابزارها، زبان های برنامه نویسی و کتابخانه ها برای ساخت انواع مختلف برنامه ها تشکیل شده است.پیاده سازی های مختلفی از دات نت وجود دارد. هر پیاده سازی اجازه می دهد تا کد دات نت در مکان های مختلف اجرا شود - لینوکس، macOS، ویندوز، iOS، اندروید و بسیاری موارد دیگر:دات نت فریم ورک/NET Framework.  :پیاده سازی اصلی دات نت است. از پیاده سازی وب سایت ها، سرویس ها، برنامه های دسکتاپ و موارد دیگر در ویندوز پشتیبانی می کند.دات نت/NET. : یک پیاده سازی چند پلتفرمی(cross-platform) برای پیاده سازی websiteها، serviceها و برنامه های console در ویندوز، لینوکس و macOS است. دات نت در GitHub منبع باز است. دات نت قبلاً NET Core. نامیده می شد.(در نوامبر 2021، مایکروسافت یک پلت فرم یکپارچه دات نت را معرفی کرد. آنها .NET Core را به .NET تغییر نام دادند.)و Xamarin/Mono :یک پیاده سازی دات نت برای اجرای برنامه ها در تمام سیستم عامل های اصلی موبایل، از جمله iOS و Android است.می توانید برنامه های دات نت را به زبان های #C#، F یا Visual Basic بنویسید.توضیح Cross platform : شما می توانید برنامه های دات نت را برای بسیاری از سیستم عامل ها ایجاد کنید، از جمله: Windows / macOS / Linux /Android / iOS / tvOS / watchOSبرای ساخت برنامه های مدرن(modern)، cloud-enable و متصل به اینترنت(Internet-connected) است.توضیح cloud-enabled : معمولاً به برنامه‌هایی اطلاق می‌شود که به‌طور سنتی (traditionally)ساخته شده و سپس به فضای ابری(cloud) منتقل شده‌اند. این برنامه ها در ابتدا به صورت یکپارچه(monolithic) طراحی شده اند و به منابع و سخت افزار محلی وابستگی دارند.دات نت سریع است. واقعا سریع! این بدان معناست که برنامه ها زمان پاسخگویی بهتری را ارائه می دهند و به توان محاسباتی کمتری نیاز دارند.Data sourced from official tests available at TechEmpower Round 21.نسخه‌های دات‌نت (NET versions.) :نسخه‌های دات‌نت یا LTS releases هستند یا STS releases :نسخه های LTS(Long Term Support) پایدار هستند و به روز رسانی های کمتری در طول عمر خود دارند. نسخه‌های LTS انتخاب خوبی برای برنامه‌هایی هستند که نمی‌خواهید مرتباً به‌روزرسانی شوند. مایکروسافت نسخه های LTS را به مدت سه سال پس از در دسترس بودن عمومی و 1 سال پس از عرضه نسخه بعدی LTS پشتیبانی می کند.نسخه‌های STS (Standard Term Support)شامل ویژگی‌هایی است که شامل تغییرات مکرر بر اساس بازخوردها می‌شود. بنابراین، نسخه های فعلی شامل آخرین پیشرفت ها هستند. آنها برای برنامه هایی که شما فعالانه در حال توسعه آنها هستید مناسب هستند. مایکروسافت از STS releases به مدت شش ماه پس از انتشار STS  بعدی یا LTS پشتیبانی می کند. از آنجایی که انتشار هر 12 ماه یکبار انجام می شود، دوره پشتیبانی برای نسخه STS  به مدت 18 ماه است.تنها تفاوت LTS releases و STS  releases در طول مدت زمان پشتیبانی از آنها است.نسخه های STS قبلاً به عنوان نسخه های جاری (Current releases) شناخته می شدند.معماری NET Framework. : دو جزء اصلی NET Framework. عبارتند از :Common Language Runtime(CLR).NET Framework Class Library.خوب Common Language Runtime (CLR) موتور اجرایی است که برنامه های در حال اجرا را مدیریت می کند. خدماتی مانند thread management، garbage collection، type-safety, exception handling و غیره را ارائه می‌دهد.و اما Class Library مجموعه ای از APIها و typeها را برای عملکردهای رایج فراهم می کند. مانند strings, dates, numbers و غیره را ارائه می دهد. Class Library شامل API هایی برای خواندن و نوشتن فایل ها، اتصال به پایگاه داده، drawing و غیره است.گفتیم می توانید برنامه های دات نت را به زبان های #C#، F یا Visual Basic بنویسید. کد به یک زبان میانی مشترک CIL/Common Intermediate Language کامپایل می شود. کد کامپایل شده در اسمبلی ها - فایل هایی با پسوند فایل dll. یا exe. ذخیره می شود.هنگامی که یک برنامه اجرا می شود، CLR اسمبلی را می گیرد و از یک just-in-time compiler   (JIT) برای تبدیل آن به کد ماشین استفاده می کند که می تواند بر روی معماری خاص رایانه ای که روی آن است اجرا شود.محیط های توسعه یکپارچه (Integrated Development Environments (IDEs)) برای دات نت عبارتند از:یک : Visual Studio فقط روی ویندوز اجرا میشه دارای عملکرد داخلی گسترده ای است که برای کار با دات نت طراحی شده است. نسخه Community برای دانش آموزان، مشارکت کنندگان متن باز(open-source contributors) و اشخاص حقیقی رایگان است.دو : Visual Studio Code قابل اجرا بر روی ویندوز، macOS و لینوکس. رایگان و متن بازاست و برنامه های افزودنی(Extensions) برای کار با زبان های دات نت در دسترس هستند.سه : Visual Studio for Mac فقط روی macOS اجرا می شود. برای توسعه برنامه‌ها و بازی‌های دات نت برای iOS، Android و وب.چهار : GitHub Codespaces یک محیط کد آنلاین ویژوال استودیو، که در حال حاضر در نسخه بتا است.برای دانلود و انتخاب گزینه مناسب خود سری به لینک زیر بزنید :https://visualstudio.microsoft.com/downloads/بیشتر بخوانید : دوره آموزشی #C - قسمت اولبیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Corehttps://zarinp.al/farshidazizi</description><category>فرشید عزیزی</category><author>فرشید عزیزی</author><pubDate>Tue, 24 Sep 2024 10:32:00 +0330</pubDate></item></channel></rss>