<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های زهرا دشتی</title>
        <link>https://virgool.io/feed/@ZahraDashti</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-04-14 00:54:49</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/83330/avatar/aP2KON.png?height=120&amp;width=120</url>
            <title>زهرا دشتی</title>
            <link>https://virgool.io/@ZahraDashti</link>
        </image>

                    <item>
                <title>توابع محلی یا local function در C#</title>
                <link>https://virgool.io/@ZahraDashti/%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D9%85%D8%AD%D9%84%DB%8C-%DB%8C%D8%A7-local-function-%D8%AF%D8%B1-c-wcgujixqi7xb</link>
                <description>خوب C# از نسخه 7 خودش پشتیبانی از Local functions رو شروع کرد. خوب حالا این ویژگی چی هست و چه کاربردی داره؟Local function ها متدهای خصوصی (private) هستند که در داخل یک عضو دیگه به صورت nested تعریف می شن، و فقط همون عضو یا بهتره بگیم container شون می تونه اونها رو صدا بزنه.اما خوب، شاید بپرسین کاربردش چیه؟ کاربردش اینه که کد رو تمیزتر می کنه، هر کسی کد رو ببینه می فهمه این متد فقط باید داخل این عضو استفاده بشه، از طرفی اگر یک دولوپر دیگه خواست کد بزنه به اشتباه این متد رو در جای نادرست استفاده نمی کنه.متدهای محلی به متغیرها و سایر متدهای محلی که در container شون هست دسترسی دارن و این تقریبا چاقوی دو طرفه است. یعنی اگرچه کاربردیه ولی ممکنه باعث مشکلاتی هم بشه. برای اینکه در صورت عدم نیاز، بشه جلوی این دسترسی رو گرفت، C# در نسخه 8، این امکان رو فراهم کرد که متدهای محلی بتونن به صورت static تعریف بشن که در نتیجه مانع دستیابی اون متد به سایر متغیرها و متدهای محلی دیگه container اش می شد و از coupling و ارجاع اشتباه و تصادفی به متغییرهای container جلوگیری بشه.خوب گفتم که متدهای محلی می تونن داخل سایر اعضا تعریف بشن. اما دقیقا یعنی چی؟ یعنی موارد زیر:· متدها، به ویژه iteratorمتدها و async متدها· سازنده ها (Constructors)· پروپرتی ها (Property accessors)· رویدادها (Event accessors)· متدهای Anonymous· عبارات Lambda· فاینالایزها (Finalizers)· سایر توابع محلیتوابع محلی می تونن modifier زیر رو داشته باشن:· از async· از unsafe· از static (از نسخه 8 به بعد)· از extern (از نسخه 9 به بعد) که البته باید static هم باشند.نکته: قبلا در بحث top-level statement گفته بودیم که هر متدی که در top-level statement تعریف بشه به صورت متد محلی رفتار می کنه.نکته: توابع محلی نمی تونن Overload بشن.نکته : یک متد محلی نمی تونه access modifier داشته باشه چون به ذات خودش private هست.خوب من اینجا خیلی مثال و نمونه نیاوردم، در بیشتر حالاتش خیلی سینتکس پیچیده ای نداره، اما خوب در جاهایی مثل عبارات lambda کمی متفاوته. اگر دوست داشتین و براتون کاربرد داشت توصیه می کنم به مستندات خود ماکروسافت مراجعه کنید که یکی از منابع همین مطلب هم هست.من برای نوشتن این مطلب از دو منبع زیر استفاده کردم :1. C# 9.0 in a Nutshell The Definitive Reference by Joseph Albahari - O&#x27;Reilly2. Local functions</description>
                <category>زهرا دشتی</category>
                <author>زهرا دشتی</author>
                <pubDate>Fri, 18 Jun 2021 15:09:03 +0430</pubDate>
            </item>
                    <item>
                <title>فرق بین Readonly و Constants در C# (سوالات مصاحبه)</title>
                <link>https://virgool.io/@ZahraDashti/%D9%81%D8%B1%D9%82-%D8%A8%DB%8C%D9%86-readonly-%D9%88-constants-%D8%AF%D8%B1-c-%D8%B3%D9%88%D8%A7%D9%84%D8%A7%D8%AA-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-nh3k2txsvi1x</link>
                <description>یکی از سوالاتی در مصاحبه های C# و .Net می پرسن، فرق بین فیلدهای Readonly و Constants چیه؟وقتی modifier یک فیلد readonly هست، مقدار اون فیلد بعد از ساخته شدن نمی تونه تغییر کنه. یعنی یا هنگام declaration می شه بهش مقدار داد یا در سازنده (constructor) اون نوع (type)  و کلاس می شه آن رو مقدار دهی کرد. هر نوع تایپی رو می شه به صورت readonly تعریف کرد.وقتی modifier یک فیلد constant هست، اون فیلد در زمان کامپایل به صورت استاتیک در زمان کامپایل ارزیابی می شه و کامپایلر به معنی واقعی کلمه، هر جا اون رو ببینه با مقدارش جایگزین می کنه (شبیه ماکرو ها در C++). هر نوع تایپ عددی built-in، bool، char، string، و enum ها رو می شه به صورت constant تعریف کرد و با کلمه کلیدی const مشخص می شن.اما فرق و شباهتشون چیه؟ constant می تونه نقش static readonly بازی کنه اما محدودیت های بیشتری داره. اما تفاوتش همون جایگزینی constant با مقدارش در زمان کامپایل هست. همون طور که در شکل می بینید بالایی به پایینی تبدیل می شه. در مثال زیر مقدار عدد Pi همیشه ثابته پس مناسبه که از const استفاده کنیم.کد بالا در زمان کامپایل به کد زیر تبدیل می شه:در مقابل static readonly هربار که برنامه اجرا بشه مقدار می گیره. به کد زیر دقت کنید، StartupTime در هر بار اجرای برنامه مقدار جدید می گیره.از مزایای static readonly زمانهایی هست که می خوایم به سایر assembly مقداری رو بدیم که در هر نسخه عوض می شه. در مثال زیر فرض کنید که این فیلد در assembly با نام X اومده و چون public  هست، در سایر assembly ها که از X استفاده می کنند قابل دستیابیه.حالا فرض کنید assembly با نام Y به X رفرنس داده و از این constant استفاده می کنه، در نتیجه مقدار 2.3 در Y هنگام کامپایل جایگزین می شه. خوب حالا فرض کنید در X تغییراتی می دیم و مقدار ProgramVersion به 2.4 تبدیل می شه و X  مجددا کامپایل می شه. اما Y هنوز همون مقدار 2.3 رو استفاده می کنه! چون هنگام کامپایل اون مقدار جایگزین شده در کدش. در نتیجه مجبوریم دوباره Y رو با نسخه جدید X کامپایل کنیم. اما راه حل این مشکل چیه؟ استفاده از  static readonly این مشکل رو برطرف می کنه.به عبارت دیگه، اگر مقداری در آینده ممکنه تغییر کنه (یعنی در ذات خودش ثابت نباشه) نباید به صورت constant تعریف بشه.خوب امیدوارم این مطلب براتون مفید باشه. اگر اشکالی در این مطلب می بینید یا چیزی بد بیان شده خوشحال می شم به من بگین :)</description>
                <category>زهرا دشتی</category>
                <author>زهرا دشتی</author>
                <pubDate>Thu, 17 Jun 2021 20:26:42 +0430</pubDate>
            </item>
                    <item>
                <title>سوالات مصاحبه c# : پرش در بلاک finally</title>
                <link>https://virgool.io/@ZahraDashti/%D8%B3%D9%88%D8%A7%D9%84%D8%A7%D8%AA-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-c-%D9%BE%D8%B1%D8%B4-%D8%AF%D8%B1-%D8%A8%D9%84%D8%A7%DA%A9-finally-sttl2odlemna</link>
                <description>گاهی در مصاحبه ها، سوالاتی می پرسن که اگرچه ساده هستند ولی ممکنه به دلیل اینکه باهاش برخورد نکردیم نتونیم جواب بدیم. بعضی وقتها از قابلیت هایی از زبان سوال می شه که استفاده ازش نادر یا خاص منظوره است و ممکنه آدم ازش بی خبر باشه. خوب یک راهش اینه که کتب رفرنس زبان یا مستندات زبان رو کامل بخونیم ولی گاهی به خصوص بین تازه کارها، این راه، راه ساده ای نیست. اغلب تجربی یا با فیلم ها و دوره ها شروع کردن و خیلی از ویژگی های زبان رو نمی دونن یا حتی سوال پیش نمی آد، و خوب به خاطر همین ندانستن مواردی باعث بشه مصاحبه رو خراب کنند یا اعتماد به نفسشون بیاد پایین. ولی خوب اغلب سوالات مشخصی پرسیده می شه، مگرمواردی که مصاحبه کننده خیلی جدی، در مورد نیازمندی های پروژه خودش بپرسه که خوب کمتر و بیشتر از نیروی های سینیور اینجور سوال و جواب می شه.اگر از سوالات خاص منظوره بگذریم، معمولا یک سری سوالات تکراری هستن! امروز می خوام یکی از ویژگی های زبان C#  رو بگم که خیلی وقتها در مصاحبه ها پرسیده می شه:عبارات Jump یا پرش در بلاک try از قوانین reliability (قابلیت اطمینان) این بلاک پیروی می کنه. خوب یعنی چی؟1 – هر پرشی به بیرون از بلاک try قبل از رسیدن به هدفش، حتما بلاک finally مربوط به بلاک try رو (در صورت وجود) اجرا می کنه و بعد به نقطه هدف پرش می ره.2- در بلاک finally هیچ دستور Jump(پرشی) از داخل بلاک به بیرون، جز دستور throw مجاز نیست، در واقع اصلا نمی تونید بذارین چون خطای کامپایل می گیرین!دستورهای jump  چی هستن؟ break, continue, goto, return و throw.البته این سوال معمولا اینجور پرسیده می شه: اگر داخل بلاک finallyدستور return  باشه چه اتفاقی می افته؟ که خوب جواب اینه که اصلا نمی شه این کار رو کرد! چون خطای کامپایل می گیریم.</description>
                <category>زهرا دشتی</category>
                <author>زهرا دشتی</author>
                <pubDate>Wed, 16 Jun 2021 19:58:44 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با Top-Level Statements قابلیت C# 9.0</title>
                <link>https://virgool.io/@ZahraDashti/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-top-level-statements-%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-c-90-q0ey7vafpi0r</link>
                <description>قابلیت Top-Level Statements، ویژگی جدیدی هست که در C# 9.0 اضافه شده. اما این ویژگی جدید چی هست و چه کاربردی داره؟بیاین با هم ببینیم.فرض کنید می خواین دو خط برنامه بنویسین که عبارت معروف Hello World رو چاپ کنه. در زبان C# حداقل کدی که زده می شه چیزی در حد کد زیر هست:using System;class Program{    static void Main() // Program entry point    {        Console.WriteLine(&quot;Hello, world&quot;);    }}گفتم در زبان C# باید اینقدر کد بزنیم؟ خوب حرف نادقیقی بود. درستش اینه که بگم در زبان C# نسخه های 8 و کمتر. چون در نسخه 9.0 ما این قابلیت رو داریم که به جای چند خط بالا، سه خط زیر رو بنویسیم و کار کنه:using System;Console.WriteLine (&quot;Hello, world&quot;);این دو خط رو می نویسین و بعد با دستور زیر برنامه رو اجرا می کنید و می بینید که به راحتی کار می کنه&gt;&gt; dotnet runنیاز به آرگومان های ورودی دارین؟ این قابلیت هم به راحتی در اختیار شماست! کافیه داخل کد از args استفاده کنید مثل مثال زیر:using System;foreach (var s in args){    Console.Write(s);    Console.Write(&#x27; &#x27;);}و بعد به صورت زیر آرگومان های مد نظرتون رو بهش پاس بدین:&gt;&gt; dotnet run -- hello everybodyhello everybodyاما در واقع چه اتفاقی داره می افته؟ بیاین یکم بیشتر با این ویژگی آشنا بشیم.یک فایل با Top-Level Statements به ترتیب شامل سه بخش زیر می شه (دقت کنید دو بخش اختیاری هست) :1- (اختیاری) عبارات using2- یک سری از عبارات (Statements) که به دلخواه یا در صورت نیاز با declaration توابع ترکیب می شوند.3- (اختیاری) declaration نوع ها (Type) و namespace هامثلاusing System; // Part 1Console.WriteLine (&quot;Hello, world&quot;); // Part 2void SomeMethod1() { ... } // Part 2Console.WriteLine (&quot;Hello again!&quot;); // Part 2void SomeMethod2() { ... } // Part 2class SomeClass { ... } // Part 3namespace SomeNamespace { ... } // Part 3اما در زمان کامپایل چه اتفاقی می افته؟ چون CLR این عبارات رو به همین شکل پشتیبانی نمی کنه، کامپایلر، این کد رو به چیزی شبیه کدهای زیر تبدیل می کنه:using System; // Part 1static class Program$ // Special compiler-generated name{    static void Main$() // Special compiler-generated name{        Console.WriteLine(&quot;Hello, world&quot;); // Part 2        void SomeMethod1() { ... } // Part 2        Console.WriteLine(&quot;Hello again!&quot;); // Part 2        void SomeMethod2() { ... } // Part 2    }}class SomeClass { ... } // Part 3namespace SomeNamespace { ... } // Part 3دقت کنید که هر چیزی که در بخش 2 هست داخل متد main قرار می گیره. پس در نتیجه متدهایی مثل SomeMethod1 و SomeMethod2 مثل متدهای محلی (local methods) رفتار می کنند. که خوب این مسئله یعنی اینکه اولا، این متدهای محلی می تونند به متغیرهای تعریف شده، در متدی که اونها تعریف شده اند، دسترسی داشته باشن،int x = 3;LocalMethod();void LocalMethod() { Console.WriteLine (x); } // We can access xثانیا این متدهای محلی از طریق سایر کلاس ها و typeها قابل دستیابی نیستند.در انتها دو نکته دیگه در مورد Top-Level Statements می شه گفت یکی اینکه این عبارات می تونند به دلخواه یک مقدار Integer رو به کسی آنها رو فراخوانی کرده برگردونند و دوم اینکه از اونجایی که هر برنامه فقط یک نقطه شروع داره، پس حداکثر در یک فایل در یک پروژه می شه از Top-Level Statements استفاده کرد.امیدوارم که این مطلب براتون مفید بوده باشه و اگر مشکل یا خطایی در اون می بینید خوشحال می شم که به من اطلاع بدین.من برای نوشتن این مطلب از دو منبع زیر استفاده کردم:1- C# 9.0 in a Nutshell The Definitive Reference by Joseph Albahari - O&#x27;Reilly2- Tutorial: Explore ideas using top-level statements to build code as you learn</description>
                <category>زهرا دشتی</category>
                <author>زهرا دشتی</author>
                <pubDate>Tue, 15 Jun 2021 15:16:47 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی کتاب Head First Design Patterns</title>
                <link>https://virgool.io/@ZahraDashti/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%DA%A9%D8%AA%D8%A7%D8%A8-head-first-design-patterns-fjfxjptnhy1y</link>
                <description>Head First Design Patternsوقتی صحبت از کتابی جهت یادگیری الگوهای طراحی ( نرم افزار ) می‌شه، یکی از کتابهایی که اغلب توصیه می شه  کتاب  Head First Design Patterns هست که در سال گذشته، ویراست دومش هم اومد. اگر با سری  Head First آشنا باشین تم کتاب رو می دونید و اگرنه باید بگم که کتاب به شکلی داستانی، یک مسئله رو طرح می کنه و گام به گام برای حلش جلو می ره و به راه حل می رسه، البته گاهی هم مستقیم تر می ره سر الگو. فلسفه و دلیل استفاده از الگو رو بیان می‌کنه، معایب و تخطی های احتمالی از قوانین solid# یا پیچیدگی های ایجاد شده رو شرح می ده و بعد هم پیاده سازی کامل مسئله با الگو البته به زبان جاوا رو می نویسه و تقریبا خط به خط توضیح می ده. نکته ای که ضمنی گفتم اینه که کدهای کتاب به زبان جاواست. خوب طبیعتا می تونه هم حسن باشه هم عیب. برای جاوا کارها حسنه، برای کسانی که با جاوا آشنایی مختصری دارن (مثل من) یا با زبان های سی بیس مثل سی شارپ و c++ کار کردن هم تقریبا بدون مشکله، اما سایر دوستان ممکنه کمی از این جهت نیاز به مراجعه به منابع دیگه برای پیاده سازی داشته باشند. البته یک حسن ویژه برای جاوا کارها داره و اونم اینه که بعضی الگوها رو با قابلیت های زبان یا فریم ورک های مطرحش هم پیاده سازی کرده. برای من کتاب خوش خوان و قابل فهم بود. البته من خیلی برای قضاوت مناسب نیستم چون قبلا دوره ای برای یادگیری الگوهای طراحی رو گذرونده بودم اما با این همه به نظرم کتاب به خوبی مفهوم رو رسونده. باید متذکر بشم که کتاب همه ۲۳ الگو رو در ۱۴ فصل نیاورده، هرچند به باقی مونده الگوها در ضمیمه به صورت مختصر آورده، مسئله ای که حل می کنند و معایب و مزایا رو لیست کرده، کلاس دیاگرام رو ترسیم کرده اما وارد جزییات پیاده سازی نشده. تقریبا برای هر الگوی مانده (و به قول خودش کم کاربرد) دو صفحه اختصاص داده. در مجموع کتاب جذابیه و اگر علاقه دارین با الگوهای طراحی بیشتر  (یا اگر اصلا آشنا نیستین، تازه) آشنا بشین، این کتاب رو به عنوان گام اول توصیه می کنم. قطعا گامهای بعدی  GoF و بعد منبعی در زبانی هست که با اون کد می زنید هست.</description>
                <category>زهرا دشتی</category>
                <author>زهرا دشتی</author>
                <pubDate>Wed, 09 Jun 2021 11:00:48 +0430</pubDate>
            </item>
                    <item>
                <title>تفاوت  max-width و width</title>
                <link>https://virgool.io/@ZahraDashti/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-max-width-%D9%88-width-mkmurb2padpm</link>
                <description>این روزها کتاب Responsive Web Design with HTML5 and CSS3 نوشته‌ی Ben Frain رو می خونم. در فصل اول نکته‌ی جالبی گفته بود که نمی‌دونستم. در مورد تفاوت دو style زیر می گه:.img{max-width:100%} با.img{width:100%} وقتی max-width:100% را برای تصویر می‌گذاریم، تصویر تا ماکزیمم سایز خود می‌تواند رشد کند. اگر container آن تصویر کوچکتر از اندازه واقعی تصویر باشد، تصویر اندازه خود را متناسب با ظرفش بزرگ می‌کند و از محدوده اندازه container تجاوز نمی‌کند. اما اگر اندازه تصویر کوچکتر از container خود باشد، وقتی به اندازه واقعی خود رسید، دیگر از آن بزرگتر نمی‌شود، حتی اگر container خیلی بزرگ شود.در مقابل اما، اگر width:100% را برای تصویر بگذاریم، تصویر خود را به اندازه‌ای بزرگ می‌کند که ۱۰۰% container خود را بپوشاند. حتی اگر این اندازه بزرگتر از اندازه واقعی تصویر باشد و باعث دفرمه شدن تصویر شود.این مطلب در صفحه ۱۴ کتاب ذکر شده. اگر برداشت من اشتباهه، ممنون می‌شم اطلاع بدین.</description>
                <category>زهرا دشتی</category>
                <author>زهرا دشتی</author>
                <pubDate>Mon, 21 Dec 2020 22:07:29 +0330</pubDate>
            </item>
            </channel>
</rss>