مقدمهبا پیشرفت تکنولوژی و عرضه و تقاضای روزافزون موارد مرتبط با آن، اموری مانند توسعه نرمافزارها هر روز آسانتر میشود. قویتر شدن پردازندهها موجب این شد که برنامههای چندسکویی بسیار راحت اجرار شوند. بدین ترتیب تنها با فراگیری یک زبان برنامه نویسی سطح بالا، میتوان برنامههای خلاقانهای طراحی کرد. یکی از بهروزترین فریمورکهای ساختهشده برای توسعه نرمافزارهای دسکتاپ، فریمورک Native PHP است. استفاده از آن برای برنامه نویسان یک مزیت بزرگ خواهد بود؛ چرا که تنها با فراگیری زبانهای CSS، HTML، PHP و Javascript، قادر خواهند بود نرمافزارهای دسکتاپ را توسعه دهند. البته باید دید که این فریمورک کاربردی، در مقابل رقیبان خود همچون فریمورک فلاتر تا چه حد میتواند بازی را به نفع خود تغییر دهد. در ادامه به بررسی ساختار و مزایای فریمورک Native PHP میپردازیم. ساختار فریمورک Native PHP این فریمورک دقیقا همان PHP میباشد که بر روی سرور اجرا میگردید. با این فرق که به صورت زندهتر و مستقیم درون هسته برنامه اجرا میشود؛ درست مثل Java و Python که هم بر روی سرور اجرا میشوند و هم برای دسکتاپ دارای فریمورک UI هستند. به بیان دقیقتر، در Native PHP مجموعهای از کلاسها افزوده شده است که که برای نمایش پنجرهها و کنترل وضعیت برنامه در سیستم عامل استفاده میشود. البته این فریمورک یک بسته مکمل میباشد که بر روی فریمورکهای دیگر مانند الکترون و تاوری، نصب و اجرا میشود. Native PHP یک سکو بالاتر از فریمورکهای گفتهشده قرار میگیرد تا به جای آنها عمل کند و با پشتیبانی از هر دو، یک سری کلاس واحد را ایجاد نماید. این عمل کمک میکند تا برنامه بسیار سریعتر آماده شود. سوالی که مطرح میشود، این است که با وج, ...ادامه مطلب
مقدمه بارها شنیدهایم که میگویند، عصر، عصر تکنولوژی است. این روزها به دلیل گسترش روزافزون اینترنت، خیلی از مردم به یادگیری مباحث برنامه نویسی روی میآورند. از آنجایی که زبانهای بیشماری در برنامه نویسی وجود دارند، افراد برای یادگیری آنها از انتخابهای زیادی برخوردار میباشند. در صورتی که به تازگی وارد دنیای برنامه نویسی شدهاید، حتما نام زبان برنامه نویسی جاوا اسکریپت به گوشتان خورده است. اما آیا تا به حال نام زبان تایپ اسکریپت را شنیدید؟ این زبان به عنوان یک راه حل برای محدودیتهای جاوا اسکریپت توسعه یافته تا معایب و کاستیهای آن را پوشش دهد. در این مطلب، در رابطه با چیستی زبان تایپ اسکریپت و کاربردها و مزایای آن، اطلاعاتی را در اختیار شما میگذاریم. زبان برنامه نویسی تایپ اسکریپت (Typescript) اگر شما به عنوان یک توسعه دهنده، فرصتی برای کار بر روی یک پروژه توسعه وب را داشتید، طبیعتا باید نحوه کار با زبان برنامه نویسی جاوا اسکریپت را آموخته باشید. این زبان سالهای زیادی است که در بازار وجود دارد و یکی از زبانهای برنامه نویسی محبوب در بین توسعه دهندگان به شمار میآید. اما همانگونه که میدانید، در صورت پیشرفت و گسترش تکنولوژی، همواره یک جایگزین به وجود میآید که رقابت سختی را با بهترینها شروع میکند. رقیب جدید جاوا اسکریپت، تایپ اسکریپت Type Script)) است که با بیشتر شدن محبوبیت آن، میتوان آن را به عنوان نسخه پیشرفته جاوا اسکریپت در نظر گرفت. پس به نوعی میتوان گفت که تایپ اسکریپت، همان جاوا اسکریپت ولی با یکسری امکانات بیشتر است که مهمترین آنها، مشخص کردن نوع داده ذخیره شده هنگام تعریف متغیر میباشد. به این معنا که همانند زبانهای C++ و java میتوان ن, ...ادامه مطلب
مقدمه:اگر شما یک برنامه نویس ماهر باشید جالب است بدانید که میتوانید با مهارت خود، کسب درآمد دلاری داشته باشید. شما میتوانید از طریق راههای گوناگون از جمله گرفتن پروژه از سایتهای فریلنسری، توسعه و فروش نرمافزارها، آموزش برنامه نویسی و… درآمد بسیار زیادی را تجربه کنید. در ادامه این مقاله بهترین راههای کسب درآمد دلاری از طریق برنامه نویسی را به شما آموزش خواهیم داد. بهترین زبانهای برنامه نویسی برای کسب درآمد دلاری انتخاب زبان مناسب، یکی از رایجترین دغدغههای برنامه نویسان است. زبانهای برنامه نویسی بسیار متنوع و گسترده هستند و با استفاده از اغلب آنها میتوانید درآمد مناسبی داشته باشید؛ اما در این قسمت از مقاله، زبانهایی معرفی شدهاند که بیشترین تقاضای بیلالمللی را دارند. PHP: این زبان یکی از ابزارهای اصلی و پرکاربرد در توسعهی وب است. زبان PHP برای توسعه اپلیکیشنها و وبسایتهای وب به کار میرود. پایتون: پایتون یک زبان قدرتمند و همهمنظوره است که در حوزههای مختلف توسعه وب، هوش مصنوعی، تحلیل داده و اتوماسیون به کار میرود. این زبان برنامه نویسی، قواعد دستوری قابل فهم و سادهای دارد که باعث میشود برنامه نویسان با سرعت بیشتر برنامههای خود را ایجاد کنند و توسعه دهند. جاوا: یک زبان بسیار قوی و پراستفادهاست که جهت توسعه نرمافزارهای قابل حمل، وب و سرور به کار میرود. زبان برنامه نویسی جاوا میتواند روی سیستمعاملهای گوناگون و ماشینهای مجازی جاوا اجرا شود. جاوا اسکریپت: جاوا اسکریپت یکی از زبانهای پرکاربرد و متنباز است که معمولا برای افزودن عملکردهای تعاملی به صفحات وب استفاده میشود. این زبان در مرورگرهای وب نیز قابل اجرا است. زبان C: از ویژگیهای این زبان، ع, ...ادامه مطلب
از لحاظ تاریخی، Blazor به همراه دو حالت اصلی است: - Blazor Server، که در آن یک اتصال SignalR، بین مرورگر کاربر و سرور، برقرار شده و سرور حالات مختلف این جلسهی کاری را مدیریت میکند. آغاز این حالت، بسیار سریع است؛ اما وجود اتصال دائم SignalR در آن ضروری است. نیاز به وجود این اتصال دائم، با تعداد بالای کاربر میتواند کارآیی سرور را تحت تاثیر قرار دهد. - Blazor WASM: در این حالت کل برنامهی Blazor، درون مرورگر کاربر اجرا میشود و برای اینکار الزاما نیازی به سرور ندارد؛ اما آغاز اولیهی آن به علت نیاز به بارگذاری کل برنامه درون مرورگر کاربر، اندکی کند است. اتصال این روش با سرور، از طریق روشهای متداول کار با Web API صورت میگیرد و نیازی به اتصال دائم SignalR را ندارد. دات نت 8، دو تغییر اساسی را در اینجا ارائه میدهد: - در اینجا حالت جدیدی به نام SSR یا Static Server Rendering ارائه شدهاست (به آن Server-side rendering هم میگویند). در این حالت نه WASM ای درون مرورگر کاربر اجرا میشود و نه اتصال دائم SignalR ای برای کار با آن نیاز است! در این حالت برنامه تقریبا همانند یک MVC Razor application سنتی کار میکند؛ یعنی سرور، کار رندر نهایی HTML قابل ارائهی به کاربر را انجام داده و آنرا به سمت مرورگر، برای نمایش ارسال میکند و همچنین سرور، هیچ حالتی را هم از برنامه ذخیره نمیکند و بهعلاوه، کلاینت نیز نیازی به دریافت کل برنامه را در ابتدای کار ندارد (هم آغاز و نمایش سریعی را دارد و هم نیاز به منابع کمتری را در سمت سرور برای اجرا دارد). - تغییر مهم دیگری که در دات نت 8 صورت گرفته، امکان ترکیب کردن حالتهای مختلف رندر صفحات، در برنامههای Blazor است. یعنی میتوان یک صفحهی , ...ادامه مطلب
در قسمت قبل مشاهده کردیم که چگونه میتوان کل برنامه را به صورت سراسری، تعاملی کرد تا بتوان توسط آن، Blazor Server سنتی را شبیه سازی نمود؛ اما ... آیا واقعا نیاز است چنین کاری را انجام دهیم؟! چون در این صورت از قابلیتهای جدید SSR به همراه Blazor 8x محروم میشویم. اگر کل قابلیتهای تعاملی مورد نیاز ما در حد یک فرم و ارسال اطلاعات آن به سمت سرور است، میتوان در Blazor 8x هنوز هم در همان حالت SSR قرار گرفت و از فرمهای جدید تعاملی آن استفاده کرد تا برای پردازش چنین مواردی، نیازی به برقراری اتصال دائم SignalR نباشد. جزئیات نحوهی کار با اینگونه فرمها را در ادامه بررسی میکنیم. امکان تعریف HTML Forms استاندارد در Blazor 8x فرمهای استاندارد HTML، پیش از ظهور جاوااسکریپت و SPAها وجود داشتند (دقیقا همان زمانیکه که فقط مفهوم SSR وجود خارجی داشت) و هنوز هم جزء مهمی از اغلب برنامههای وب را تشکیل میدهند. با ارائهی دات نت 8 و قابلیت server side rendering آن، کامپوننتهای برنامه، فقط یکبار در سمت سرور رندر شده و HTML سادهی آنها به سمت مرورگر کاربر بازگشت داده میشود. در این حالت، فرمهای استاندارد HTML، امکان دریافت ورودیهای کاربر و ارسال دادههای آنها را به سمت سرور میسر میکنند (چون دیگر خبری از اتصال دائم SignalR نیست و باید اطلاعات را به همان نحو استاندارد پروتکل HTTP، به سمت سرور Post کرد). در دات نت 8، دو راهحل برای کار با فرمها در برنامههای Blazor وجود دارد: استفاده از EditForm خود Blazor و یا استفاده از HTML forms استاندارد و ساده، به همان نحوی که بوده و هست. روش کار با EditForm در برنامههای Blazor SSR البته ما قصد استفاده از فرمهای سادهی HTML, ...ادامه مطلب
Auto Render Mode، آخرین حالت رندری است که به Blazor 8x اضافه شدهاست. اگر از Blazor Server استفاده کنیم، به یک آغاز سریع در برنامه خواهیم رسید، به همراه مقداری تاخیر جزئی، برای به روز رسانی UI؛ از این جهت که تعاملات صورت گرفته باید از طریق اتصال وبسوکت SignalR به سرور ارسال شده و منتظر نتیجهی نهایی، برای اعمال آن به صفحه شد و یا باید به مقیاس پذیری این اتصالات همزمان با تعداد کاربران بالا هم اندیشید. اگر از Blazor WASM استفاده کنیم، آغاز آن، اندکی کند خواهد بود تا فایلهای فریمورک و برنامه، به درون مرورگر کاربر منتقل شوند. اما پس از آن همهچیز بسیار سریع است؛ از این جهت که تعاملات با DOM، توسط مرورگر و در همان سمت کاربر مدیریت میشود. اما ... چقدر خوب میشد که امکان ترکیب هردوی اینها با هم در یک برنامه وجود میداشت؛ یعنی داشتن یک آغاز سریع، به همراه تعاملات سریع با DOM. به همین جهت Auto Render Mode به Blazor 8x اضافه شدهاست. نحوهی عملکرد حالت رندر تعاملی خودکار در Blazor 8x زمانیکه از قرار است از Auto Render Mode استفاده شود، یعنی در نهایت به سراغ حالت رندر وباسمبلی رفتن؛ اما به شرطیکه که فریمورک، مطمئن شود میتواند تمام فایلهای مرتبط را خیلی سریع و در کمتر از 100 میلیثانیه تامین کند که عموما یک چنین حالتی به معنای از پیش دریافت کردن این فایلها و کش شده بودن آنها در مرورگر است. اما اگر یک چنین تضمینی وجود نداشته باشد، از همان ابتدای کار تصمیم میگیرد که باید کامپوننت را از طریق نگارش Blazor Server آن ارائه دهد، تا آغاز سریعی را سبب شود. در این بین هم در پشت صحنه (یعنی زمانیکه کاربر مشغول به کار با نگارش Blazor Server کامپوننت است)، شروع به دریافت ف, ...ادامه مطلب
مقدمه اگر شخص با سابقهای در دنیای فناوری اطلاعات و سیستمهای کامپیوتری باشید، زمانیکه کلمهی CodeBehind را میبینید یا میشونید، اولین نکتهای که به ذهن شما خطور میکند، صفحات Web-Form مایکروسافت در ASP.NET Standard است که دارای پسوند aspx هستند و بخش طراحی وب را از بخش کدهای سمت سرور جدا میکنند. مایکروسافت در گذشته اصرار زیادی به CodeBehind داشت (هرچند در حال حاضر، مایکروسافت الگوی MVC را پیشنهاد میکند). در JSP نیز امکان برنامه نویسی و طراحی وب با صفحات JSP با الگوی CodeBehind امکان پذیر بود؛ اما Web-Form مایکروسافت به صورت پیش فرض، مبتنی بر CodeBehind بود. البته باید این نکته را در نظر گرفت که CodeBehind یک الگوی برنامه نویسی هست و ربطی به Web-Form مایکروسافت یا JSP در جاوا ندارد و همچنان پرکاربرد هست. در این مقاله به MVC و همین طور صفحات aspx اشاره میکنیم اما به طور کامل به CodeBehind خواهیم پرداخت؛ البته یک CodeBehind دیگر! اگر ASP.NET Core را یک اسب قدرتمند وصف کنیم که بر روی زمین با غرور و افتخار میتازد، CodeBehind تحقق رویای یک سوارکار خردسال است که بر روی آن اسب سوار میشود و اسب را به پرواز در میآورد. CodeBehind جدید است، کوچک است، ساده است، بی نشان است؛ اما بسیار قدرتمند و منعطف است. ابایی از سرشاخ شدن با ساختار ASP.NET Core ندارد و خود را الماس دات نت مینامد. CodeBehind یک انقلاب در دات نت است که از صدای یک اعتراض حاصل شده؛ اعتراض به ساختار پیچیده، خشک و غیرقابل انعطاف ASP.NET Core و وضعیت آشفته و غیرقابل درک Controller آن (درک از باب چرایی وجود ساختار). نکته هایی قبل از خواندن مقاله: لطفا توجه داشته باشید که, ...ادامه مطلب
تابحال مطالب زیادی را در مورد تمیزکردن ورودیهای کاربران، توسط ابزارهای Anti-XSS مطالعه کردهاید: - «ایجاد یک ActionFilter جهت تمیز کردن اطلاعات ورودی در ASP.NET Core» هدف تمام آنها این است که اگر اطلاعاتی از کاربر دریافت شد، پس از تمیز شدن، مشکلی با نمایش آنها نداشته باشیم و به محض نمایش یک صفحه، قطعه کد جاوااسکریپتی موجود در ورودی اولیهی کاربر، در پشت صحنه به صورت خودکار اجرا نشود. اما ... هرچقدر هم سعی کنیم، به مواردی خواهیم رسید که ممکن است توسط این «تمیز کنندههای ورودی» پوشش داده نشوند و دست آخر، قابلیت اجرایی داشته باشند. در این حالت به مفهوم دیگری میرسیم به نام Content security policy headers و یا به اختصار CSP که اساسا اجرای هر نوع اسکریپت تزریق شدهای را در صفحه، ممنوع میکند: - «افزودن هدرهای Content Security Policy به برنامههای ASP.NET» - «تولید هدرهای Content Security Policy توسط ASP.NET Core برای برنامههای Angular» برای مثال زمانیکه تنظیم CSP ابتدایی زیر را داریم: Content-Security-Policy: default-src 'self' یعنی مرورگر فقط در این صفحه، اطلاعاتی را که متعلق به سایت و دومین جاری است، بارگذاری میکند. در این حالت دیگر ویدیوهای یوتیوب معرفی شده، فایلهای CSS و یا جاوااسکریپتی دریافتی از یک CDN دیگر اجرا نمیشوند؛ چون بارگذاری نخواهند شد. همچنین دیگر نمیتوان یک قطعهی اسکریپتی را هم داخل صفحه به صورت inline تعریف و اجرا کرد. یعنی حداقل اسکریپتهای داخل صفحهای Google analytics هم از کار خواهند افتاد. که این رفتار دقیقا مطلوب ما است؛ , ...ادامه مطلب
یکی از امکاناتی که Visual Studio 2022 به ما میدهد، یک REST CLIENT توکار است که با آن میتوانیم بدون Swagger، Post Man یا ابزارهای مشابه، Apiهای خود را تست کنیم. برای استفاده از آن، ابتدا یک پروژهی Api را داخل ویژوال استودیو با تنظیمات پیشفرض آن ایجاد میکنیم که شامل یک Controller به نام WeatherForecast است. سپس یک پوشه را درون آن با نامی دلخواه ایجاد میکنیم و داخل آن، یک فایل جدید را با پسوند http میسازیم. سپس این فایل http را باز میکنیم. اگر شروع به تایپ کردن کنیم، میتوانیم ببینیم که intellisense به ما http methodهای مختلف را نشان میدهد و میتوانیم از آنها استفاده کنیم. برای مثال یک درخواست Get را ایجاد میکنم: GET https://localhost:7092/WeatherForecast حال پروژه را اجرا میکنیم و بر روی فلش سبز رنگی که کنار درخواست ایجاد شده، کلیک میکنیم تا درخواست اجرا شود: در اینجا میتوانیم تعدادی متغیر را نیز تعریف کرده و از آنها استفاده کنیم: @hostname = localhost @port = 7092 @host = {{hostname}}:{{port}} GET https://{{host}}/WeatherForecast حال میخواهیم یک درخواست Post را ایجاد و ارسال کنیم. برای این منظور ابتدا داخل کنترلر WeatherForecast، یک اکشن متد Post را ایجاد میکنیم که در این مثال کاری با دیتای وارد شده نمیکند و فقط آنرا بازگشت میدهد: [HttpPost] public ActionResult Post(WeatherForecast weatherForecast) { //Code ... retu Ok(weatherForecast); } اکنون میتوانیم مانند زیر یک درخواست Post را با بدنهی json ایجاد کنیم: @hostname = localhost @port = 7092 @host = {{hostname}}:{{port}} @contentType = application/json POST https://{{host, ...ادامه مطلب
ASP.NET MVC از روش بکارگیری binding providerها برای تدارک زیرساخت model binding استفاده میکند که در این روش، دادههای پارامترهای یک action method از طریق هدرها، کوئری استرینگها، بدنهی درخواست و غیره تهیه میشوند. در حالت پیشفرض اگر این پارامترها از نوعهای سادهای مانند اعداد و یا DateTime تشکیل شده باشند و یا به همراه یک TypeConverter باشند که امکان تبدیل این رشته را به آن نوع خاص بدهد، به صورت خودکار bind خواهند شد و هر نوع دیگری، به صورت یک نوع پیچیده درنظر گرفته میشود. نوع پیچیده یعنی bind برای مثال اطلاعات بدنهی درخواست به تک تک خواص آن نوع. برای نمونه در کنترلر زیر: [Route("[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching", }; // /WeatherForecast/GetForecast2?from=1&to=3 [HttpGet("[action]")] public IEnumerable<WeatherForecast> GetForecast2(Duration days) { retu Enumerable.Range(days.From, days.To) .Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)], , ...ادامه مطلب
در C# 11، افزونهای به switch expressionها اضافه شدهاست که امکان بررسی توالی مقادیر آرایهها و مجموعهها را نیز میدهد که به آن list expressions هم میگویند. List Pattes امکان بررسی شکل یک لیست و یا آرایه را ممکن میکنند. برای مثال اگر نیاز است بررسی کنیم که آیا مجموعهای با یک مقدار خاص، شروع میشود، پایان مییابد و یا حاوی آن است، List Pattes مفید واقع خواهند شد. در اینجا List Pattes، با [] مشخص میشوند و در بین []ها، توالی مقادیری را که قرار است با اعضای مجموعهی مشخص شده، انطباق داده شوند، مشخص میکنیم. این افزونه به همراه ویژگی slice patte نیز هست که امکان انطباق با صفر و یا چند المان یک مجموعه را میسر میکند. در این حالت از دو نقطه برای نمایش آن در بین []ها استفاده میشود. برای مثال الگوی زیر: [1, 2, .., 10] با تمام آرایههای زیر انطباق دارد: int[] arr1 = { 1, 2, 10 }; int[] arr2 = { 1, 2, 5, 10 }; int[] arr3 = { 1, 2, 5, 6, 7, 8, 9, 10 }; بررسی چند مثال جهت آشنایی با مفهوم List Pattes ابتدا مجموعهی زیر را در نظر بگیرید: int[] collection = { 1, 2, 3, 4 }; الف) روش انطباق با یک توالی مشخص Console.WriteLine(collection is [1, 2, 3, 4]); // True Console.WriteLine(collection is [1, 2, 4]); // False توالی مشخص شدهی در الگوی اول، دقیقا با توالی عناصر آرایه انطباق دارد. اما در حالت دوم، چون توالی اعداد الگوی مشخص شده، با توالی اعداد آرایه یکی نیست، انطباقی رخ ندادهاست. ب) امکان استفاده از discard و همچنین لیستی از عناصر Console.WriteLine(collection is [_, 2, _, 4]); // True Console.WriteLine(collection is [.., 3, _]); // True - اگر نیاز به صرفن, ...ادامه مطلب
PowerShell یک ابزار task automation است که همزمان یک command-line shell، زبان اسکریپتی و یک فریمورک configuration management نیز میباشد. برخلاف دیگر shellها که مبتنی بر رشته هستند، ورودی و خروجی آن اشیاء داتنتی است و از آنجائیکه مبتنی بر CLR میباشد، امکان نوشتن توابع، کلاسها و ماژولها را به ما میدهد. همچنین به صورت توکار امکان کار با فرمتهایی از قبیل CSV, XML, JSON را در اختیارمان قرار میدهد. بخاطر extensible بودن، تعداد زیادی ماژول و افزونه برای نصب وجود دارند که کار با انواع تکنولوژیها را میسر میسازند: Azure Windows Exchange SQL AWS VMWare Google Cloud PowerShell در ابتدا در سال 2006 برای ویندوز XP به همراه 130 کامند ارائه شد. نسخههای بعدی آن نیز به ترتیب 2.0, 3.0, 4.0, 5.0 و در نهایت 5.1 به همراه تعداد بیشتری از Commandها ارائه شدند. تا اینجا فقط بر روی ویندوز استفاده بود، چون براساس Full .NET Framework توسعه داده شده بود، تا در نهایت در سال 2018 نسخه cross-platform آن یعنی نسخه 6.0 ارائه شد که مبتنی بر .NET Core 2 بود. در نسخه 6.2 تعداد Commandها به نصف تعداد نسخه 5.0 هم نمیرسید. در نهایت نسخه 7.0 ارائه شد که هم backward compatible بود و هم اینکه به صورت cross-platform نیز ارائه شد؛ لازم به ذکر است، این نسخه از PowerShell براساس .NET Core 3 توسعه یافت. PowerShell به صورت پیشفرض بر روی ویندوز ۷ (همچنین ویندوز ۲۰۰۸) به بعد، قابل نصب است. لازم به ذکر است که اسم پراسس PowerShell از نسخه ۷ به بعد از powershell.exe به pwsh.exe تغییر نام یافته است. بنابراین به صورت side-by-side در کنار PowerShell 5.1 قابل نصب است. ISE یا همان Integrated Scri, ...ادامه مطلب
در C# 11 ارائهی شدهی به همراه NET 7.0.، واژهی کلیدی جدید file، جهت تعریف نوعهای محدود به یک فایل «File Scoped Types» ارائه شدهاست. این واژهی کلیدی را میتوان به تعریف هر نوع دلخواهی مانند class, interface, record, struct, enum, delegate اضافه کرد (منهای خواص، فیلدها و رخدادها؛ البته تا C# 11)، تا آن نوع، دیگر در سایر کلاسهای فایلهای برنامه، قابل دسترسی نباشد و سطح دید استفادهی از آن، تنها محدود به فایل جاری محل قرار گیری آن شود. به این ترتیب میتوان در یک فضای نام مشخص، چندین کلاس همنام را تعریف کرد؛ کاری که در نگارشهای پیشین #C، میسر نبود. بدیهی دیگر نمیتوان یک چنین نوعهایی را با سطوح دسترسی متداول inteal و یا public، تعریف و ترکیب کرد. یک مثال: نمونهای از نحوهی تعریف و استفادهی از File Scoped Types فرض کنید دو فایل جدید را به نامهای File1.cs و File2.cs به پروژهی جاری اضافه کردهایم. محتوای فایل File1.cs به صورت زیر است: namespace CS11Tests; file static class Post { public static string GetTitle() => "Title from File1.cs"; } inteal static class IntealClassFromFile1 { public static string GetTitle() => Post.GetTitle(); } و محتوای فایل File2.cs به نحو زیر تعریف شدهاست: namespace CS11Tests; file static class Post { public static string GetTitle() => "Title from File2.cs"; } inteal static class IntealClassFromFile2 { public static string GetTitle() => Post.GetTitle(); } اگر دقت کنید، ذیل فضای نام مشخص و ثابت CS11Tests، دو کلاس هم نام Post را داریم که اینبار با واژهی کلیدی file، شروع, ...ادامه مطلب
Raw String Literals، روشی ساده جهت تعریف یک قطعهی متنی، بدون نیاز به escapeهای فراوان و یا تعریف ""های متعدد است؛ برای مثال نوشتن رشتههای تشکیل شدهی از محتوای XML و یا JSON. به این صورت تعریف رشتههای پیچیده، سادهتر شده و قابلیت نگهداری آنها، بهبود خواهد یافت. Raw String Literal با حداقل سه عدد " متوالی، شروع شده و با حداقل سه عدد " متوالی، خاتمه پیدا میکنند: string name = "Vahid", country = "Iran"; string jsonString = $$""" { "Name": {{name}}, "Country": {{country}} } """; Console.WriteLine(jsonString); بدون وجود این قابلیت، معادل واقعی رشتهی فوق را باید به صورت زیر تشکیل داد: "{ "Name": Vahid, "Country": Iran}" و یا امکان درج سادهتر عبارات XML، بدون نیاز به escape قسمتی از آن: string html = """ <body style="normal"> <div class="book-content"> This is information about the "C# 11" book. </body> <footer> This is information about the author of the "C# 11" book. </footer> </element> """; سؤال: اگر در محتوای Raw String Literal تعریف شده، نیاز به سه عدد " متوالی وجود داشت، چه باید کرد؟ اگر به توضیحات فوق دقت کنید، عنوان شد که شروع و پایان Raw String Literals، با «حداقل» سه عدد " همراه است و به این صورت پیاده سازی میشود: - اگر رشتهی شما نیاز به سه "" متوالی داشت، باید raw string literal را با حداقل چهار " شروع و خاتمه دهید. - اگر رشتهی شما نیاز به چهار "" متوال, ...ادامه مطلب
واژهی کلیدی جدید required در C# 11.0، همانند خواص init-only که پیشتر معرفی شدند، با هدف آغاز و نمونه سازی دقیقتر و سادهتر اشیایی است که برای اینکار، به تعاریف ویژهی سازندهی کلاسها وابسته نیستند. امکان نمونه سازی بدون قید و شرط کلاسها تعریف کلاس Article1 را به صورت زیر درنظر بگیرید: public class Article1 { public string Title { get; set; } public string? Subtitle { get; set; } public string Author { get; set; } public DateTime Published { get; set; } } ساختار پروژههای دات نت 7 نیز به صورت پیشفرض به صورت زیر است: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project> یعنی nullable reference types در آنها فعال است. با این فعال بودن، به اخطارهای زیر میرسیم: Non-nullable property 'Title' must contain a non-null value when exiting constructor. Consider declaring the property as nullable. [CS11Tests]csharp(CS8618) Non-nullable property 'Author' must contain a non-null value when exiting constructor. Consider declaring the property as nullable. [CS11Tests]csharp(CS8618) عنوان میکند که خاصیتهای Title و Author، به صورت غیرنالپذیر تعریف شدهاند (و همانند Subtitle نالپذیر نیستند)؛ اما تعریف این کلاس به نحوی است که این مساله را الزامی نمیکند. یعنی میتوان نمونهای از Article1 را ایجاد کرد که در, ...ادامه مطلب