مقایسه نکات مثبت و منفی ری اکت جی اس و ری اکت نیتیو مقدمه زبانهای زیادی در حوزه کار برنامه نویسان حرفهای وجود دارند و میدانیم که هر یک از آنها، دارای کتابخانهها و منابع مخصوص خود هستند. بین تمام زبانهای برنامه نویسی در جهان، زبان جاوا اسکریپت در حوزه وب و دیگر عرصههای برنامه نویسی پرکاربرد و مهم بوده و هست. یکی از دلایل کاربرد و محبوبیت آن، داشتن کتابخانههایی مانند Angular، Bootstrap، React، jQuery و… میباشد. بین تمام این کتابخانههای جاوا اسکریپت، ری اکت (React) در محبوبیت بین توسعهدهندگان وب برتری دارد. لازم به ذکر است که کتابخانه ری اکت، در دو نسخه React Js و React Native به کاربران سراسر دنیا ارائه میشود. تفاوتهای عمدهای میان این دو نسخه وجود دارد که در این مطلب به آنها خواهیم پرداخت. کتابخانه ری اکت جی اس چیست؟ کتابخانه ری اکت جی اس (React Js) برای اولین بار توسط یک مهندس نرمافزار به نام جردن واک در سال 2011 ارائه شد. ایده این طرح بدین صورت بود که از xhp که فریمورکی از html برای PHP بود، گرفته شد و در پخش خبری فیسبوک مورد استفاده قرار گرفت. این کتابخانه در سال 2012 در اینستاگرام استفاده شد و تا امروز نیز از آن پشتیبانی میشود. ری اکت جی اس یک کتابخانه منبع باز (open source) مختص به جارا اسکریپت میباشد که تحت لایسنس mit کار میکند. از ReactJs برای تولید رابط کاربری وب و اجزای صفحات آن بهرهگیری میشود. کمپانیهای معتبر زیادی از جمله نتفلیکس، فیسبوک، ایمجیر، فلیپ برد، پینترست و… برای توسعه خود از آن کمک گرفتهاند. این کتابخانه بین توسعهدهندگان وب، خصوصا توسعهدهندگان فرانت اند (front-end) محبوبیت دارد و در برنامه نویسی فرانت اند به شدت مورد استفاده قر, ...ادامه مطلب
مقدمهبا پیشرفت تکنولوژی و عرضه و تقاضای روزافزون موارد مرتبط با آن، اموری مانند توسعه نرمافزارها هر روز آسانتر میشود. قویتر شدن پردازندهها موجب این شد که برنامههای چندسکویی بسیار راحت اجرار شوند. بدین ترتیب تنها با فراگیری یک زبان برنامه نویسی سطح بالا، میتوان برنامههای خلاقانهای طراحی کرد. یکی از بهروزترین فریمورکهای ساختهشده برای توسعه نرمافزارهای دسکتاپ، فریمورک Native PHP است. استفاده از آن برای برنامه نویسان یک مزیت بزرگ خواهد بود؛ چرا که تنها با فراگیری زبانهای CSS، HTML، PHP و Javascript، قادر خواهند بود نرمافزارهای دسکتاپ را توسعه دهند. البته باید دید که این فریمورک کاربردی، در مقابل رقیبان خود همچون فریمورک فلاتر تا چه حد میتواند بازی را به نفع خود تغییر دهد. در ادامه به بررسی ساختار و مزایای فریمورک Native PHP میپردازیم. ساختار فریمورک Native PHP این فریمورک دقیقا همان PHP میباشد که بر روی سرور اجرا میگردید. با این فرق که به صورت زندهتر و مستقیم درون هسته برنامه اجرا میشود؛ درست مثل Java و Python که هم بر روی سرور اجرا میشوند و هم برای دسکتاپ دارای فریمورک UI هستند. به بیان دقیقتر، در Native PHP مجموعهای از کلاسها افزوده شده است که که برای نمایش پنجرهها و کنترل وضعیت برنامه در سیستم عامل استفاده میشود. البته این فریمورک یک بسته مکمل میباشد که بر روی فریمورکهای دیگر مانند الکترون و تاوری، نصب و اجرا میشود. Native PHP یک سکو بالاتر از فریمورکهای گفتهشده قرار میگیرد تا به جای آنها عمل کند و با پشتیبانی از هر دو، یک سری کلاس واحد را ایجاد نماید. این عمل کمک میکند تا برنامه بسیار سریعتر آماده شود. سوالی که مطرح میشود، این است که با وج, ...ادامه مطلب
بازیگری و رانندگی هر دو حرفهای هستند که نیازمند تمرین، تسلط بر تکنیکها و پیشرفت مداوم هستند. اینجا به تمرینات و تکنیکهایی که میتوانند در بهبود بازیگری و رانندگی کمک کنند، میپردازم: بهتر شدن در بازیگری: تمرین و تکنیک بازیگری: کلاس بازیگری در تهران: شرکت در کلاسهای بازیگری در شهرهای بزرگی مثل تهران توسط مربیان حرفهای میتواند به شما کمک کند تا نحوه عملکرد در صحنه و جلوه گذاری را بهبود بخشید. تحقیق و مطالعه: آشنایی با نقش، متن و فراهم آوردن زمینههای مختلف جهت بهتر اجرا کردن نقش از مهمترین قسمتهای بازیگری است. تمرینات فیزیکی: تمرینات استقامتی: حفظ استقامت بدنی […] نوشته تمرین و تکنیک های برای بهتر شدن درمهارت هایی مثل رانندگی و بازیگری اولین بار در آکادمی اکسیر. پدیدار شد. , ...ادامه مطلب
در قسمت قبل، با نحوهی رندر سمت سرور و روش فعالسازی قابلیتهای تعاملی در این حالت، آشنا شدیم. از این نکات میتوان جهت ارتقاء ساختار پروژههای قدیمی Blazor Server به Blazor Server 8x استفاده کرد. البته همانطور که پیشتر نیز عنوان شد، در دات نت 8 دیگر خبری از قالبهای قدیمی پروژههای blazor server و blazor wasm نیست و اگر دقیقا همین موارد مدنظر هستند، آنها را میتوان با تنظیم سطح رندر و میزان تعاملی که مدنظر است، شبیه سازی کرد و یا حتی هر دو را هم با هم در یک پروژه داشت. 1) بهروز رسانی شماره نگارش داتنت اولین قدم در جهت ارتقاء پروژههای قدیمی، تغییر شماره نگارش TargetFramework موجود در فایل csproj. به net8.0 است. پس از اینکار نیاز است تمام بستههای نیوگت موجود را نیز به نگارشهای جدیدتر آنها ارتقاء دهید. 2) فعالسازی حالت SSR تعاملی سمت سرور پایهی تمام تغییرات انجام شدهی در Blazor 8x، قابلیت SSR است و تمام امکانات دیگر برفراز آن اجرا میشوند. به همین جهت پس از ارتقاء شماره نگارش داتنت، نیاز است SSR را فعال کنیم و برای اینکار باید به هاست ASP.NET Core بگوئیم که درخواستهای رسیده را به کامپوننتهای Razor هدایت کند. بنابراین، به فایل Program.cs مراجعه کرده و دو تغییر زیر را به آن اعمال کنید: // ... builder.Services.AddRazorComponents().AddInteractiveServerComponents(); // ... app.MapRazorComponents<App>().AddInteractiveServerRenderMode(); یک نمونهی کامل از فایل Program.cs را در قسمت قبل مشاهده کردید و یا حتی میتوانید دستور dotnet new blazor --interactivity Server را جهت ساخت یک پروژهی آزمایشی جدید بر اساس SDK دات نت 8 و ایده گیری از, ...ادامه مطلب
در Blazor 8x میتوان صفحات SSR ای را به همراه Blazor server islands و یا Blazor WASM islands داشت؛ یعنی یک کامپوننت Blazor Server که داخل یک صفحهی معمولی SSR قرار گرفته و با سرور، ارتباط SiganlR برقرار میکند و یا یک کامپوننت Blazor WASM که در قسمتی از صفحهی SSR درج شده و درون مرورگر کاربر اجرا میشود. به هر کدام از اینها یک «جزیرهی تعاملی» گفته میشود (interactive island). در این قسمت، نکات مرتبط با جزایر تعاملی Blazor Server را بررسی میکنیم. بررسی یک مثال: تهیه یک برنامهی Blazor 8x برای نمایش لیست محصولات، به همراه جزئیات آنها به لطف وجود SSR در Blazor 8x، میتوان HTML نهایی کامپوننتها و صفحات Blazor را همانند صفحات MVC و یا Razor pages، در سمت سرور تهیه و بازگشت داد. این خروجی در نهایت یک static HTML بیشتر نیست و گاهی از اوقات ما به بیش از یک خروجی ساده HTML ای نیاز داریم. در این مثال که بر اساس قالب dotnet new blazor --interactivity Server تهیه میشود، قصد داریم موارد زیر را پیاده سازی کنیم: - صفحهای که یک لیست محصولات فرضی را نمایش میدهد : بر اساس SSR - صفحهای که جزئیات یک محصول را نمایش میدهد: بر اساس SSR - دکمهای در ذیل قسمت نمایش جزئیات یک محصول، برای دریافت و نمایش لیست محصولات مشابه و مرتبط: بر اساس Blazor server islands یعنی تا جائیکه ممکن است قصد نداریم تمام صفحات و تمام قسمتهای برنامه را با فعالسازی سراسری حالت تعاملی Blazor server که در قسمتهای قبل در مورد آن توضیح داده شد، پیاده سازی کنیم. میخواهیم فقط قسمت کوچکی از این سناریو را که واقعا نیاز به یک چنین قابلیتی را دارد، توسط یک جزیرهی تعاملی Blazor s, ...ادامه مطلب
درحال حاضر، باتوجه به خرده نداشتن مقادیر پولی در ایران، عموما از نوعهای int و bigint برای ذخیره سازی این مقادیر استفاده میشود؛ اما در آینده با احتمال حذف تعدادی از صفرها، نیاز به ثبت خردهها هم ضروری خواهد بود و در اینجا این سؤال مهم مطرح میشود که نوع دادهای مناسب برای انجام اینکار چیست؟ برای نمونه در SQL Server، نوعهای دادهای decimal، money، smallmoney و امثال آن وجود دارند که در این مطلب، تفاوتهای مهم آنها و روش صحیح انتخاب نوع دادهای مناسب مخصوص اینکار را بررسی خواهیم کرد. مشکل مهم نوع دادهای int جهت ذخیره سازی مقادیر پولی فرض کنید جدول سادهای را با دو فیلد Id و Price دارید که نوع مبلغ آنرا با توجه به عدم داشتن خرده در واحد پولی، int انتخاب کردهاید: CREATE TABLE [Test1]( [Id] [int] IDENTITY(1,1) NOT NULL, [Price] [int] NOT NULL, CONSTRAINT [PK_Test1] PRIMARY KEY CLUSTERED ( [Id] ASC )); اگر در این جدول فقط 7 رکورد زیر را ثبت کنیم: Insert into Test1 values (1000000000),(1000000000),(1000000000),(1000000000),(1000000000),(1000000000),(1000000000) به نظر شما خروجی کوئری سادهی زیر که جهت نمایش جمع مبالغ وارد شده تهیه شده، چیست؟ select sum(price) from Test1 خروجی آن فقط استثنای زیر است! Arithmetic overflow error converting expression to data type int. عنوان میکند که جمع آن از بازهی اعداد صحیح خارج شدهاست و در سیستمی که نوع مبالغ آنرا int انتخاب کردهاید، دیر یا زود به این مشکل خواهید رسید. فقط کافی است کاربران، یکسالی با آن برنامه کار کنند! برای حل این مشکل میتوان به صورت موقت، نوع دادهای را به bigint تبدیل کرد و مجددا جمع رکوردها را محاسب, ...ادامه مطلب
از نوع دادهای decimal در SQL Server، بیشتر برای انجام کارهای تجاری و ذخیرهی قیمتها و مبالغ استفاده میشود؛ جائیکه اعداد و ارقام خیلی سریع بزرگ میشوند و گاهی از اوقات ممکن است به همراه اعشار هم باشد. اما ... کار با آنها در SQL Server نیازمند نکات ویژهای است که اگر ندید گرفته شوند، محاسبات نادرستی را سبب خواهند شد! مفهوم تعریف نوع decimal پیشفرض در SQL Server فرض کنید از EF پیش از EF Core استفاده میکنید که به صورت پیشفرض، نوع System.Decimal را در مدلهای شما به همان decimal در SQL Server نگاشت میکند. فکر میکنید در این حالت خروجی کوئریهای زیر چه چیزی خواهد بود؟ select '0.4400' as Expected , cast(0.4400 as decimal) as Actual select '1.3200' as Expected, cast(1.3200 as decimal) as Actual select '1.7600' as Expected, cast(1.7600 as decimal) as Actual select '65.0000' as Expected, cast(65.0000 as decimal) as Actual select '99.50' as Expected, cast(99.50 as decimal) as Actual این خروجی را در تصویر ذیل مشاهده میکنید. در اینجا خصوصا به مورد صفر دقت کنید: علت اینجا است که از دیدگاه SQL Server، نوع decimal پیشفرض، دقیقا به معنای decimal(18,0) است که به آرگومان اول آن، precision و به آرگومان دوم آن، scale میگویند. یعنی حداکثر چه تعداد رقم دسیمال، پیش از ممیز و چه تعداد عدد دسیمال، پس از ممیز قرار است در این نوع داده ذخیره شوند. بنابراین باتوجه به اینکه در حالت پیشفرض، مقدار scale و یا همان تعداد ارقام مجاز پس از ممیز، صفر است، عدد ارائه شده، به نزدیکترین عدد صحیح ممکن، گرد خواهد شد. به همین جهت برای رفع این مشکل، باید دقیقا مشخص کرد , ...ادامه مطلب
مقدمه :از میان زبانهای متعددی که برای برنامه نویسی وجود دارند، جاوا یکی از همه منظورهترین زبانهای برنامه نویسی جهان میباشد که برای ساخت برنامههای موبایلی نظیر طراحی اپلیکیشن فروشگاهی از آن استفاده میشود. با استفاده از زبان برنامه نویسی جاوا میتوان انواع برنامهها را برای سیستم عاملها و دستگاههای مختلف از جمله موبایل، تبلت، لپتاپ، سیستم عامل اندروید و IOS ساخت. در نتیجه، به طور معمول اساس کار شرکتهای برنامه نویسی بزرگ، همین زبان جاوا میباشد. در این مقاله از سایت وب نگاه قصد داریم به معرفی این زبان برنامه نویسی، ویژگیها و کاربردهای آن بپردازیم. زبان برنامه نویسی جاوا چیست؟ جاوا (JAVA) یک زبان برنامه نویسی شیء گرا (OOP) میباشد که شباهت زیادی به زبان برنامه نویسی پایه C++ دارد، با این تفاوت که شیء گرایی آن از مدلهای آسانتری پیروی میکند و همچنین از دستور عملهای سطح پایین زبان C – که امروزه چندان مورد استفاده قرار نمیگیرند – پشتیبانی نمیکند. این زبان برنامه نویسی بسیار کاربردی، روی انواع پلتفرمها قابل اجرا است؛ در واقع برنامههای نوشته شده توسط زبان جاوا به صورت بایت کد میشوند و سپس ماشین مجازی جاوا (JVM) آنها را به کدهای ماشین تبدیل کرده و به اجرا در میآورد. به دلیل وجود JVM است که زبان جاوا به هیچ سیستم عامل خاصی وابسته نیست و برنامههای نوشته شده به زبان جاوا، بر روی هر نوع سیستم عاملی قابل اجرا میباشند. لازم به ذکر است که شعار زبان برنامه نویسی جاوا این است: “یک بار بنویس و همه جا اجرا کن!”به همین منظور است که پس از گذشت سالها از طراحی آن، هنوز هم بین سه زبان برتر برنامه نویسی جهان قرار دارد و محبوبیت خود را تا به امروز، پر قدرت حفظ کرده است. , ...ادامه مطلب
معرفی فریمورک React Nativeبه طور معمول بیشتر زبانهای برنامه نویسی دنیا، روی پلتفرمهای خاصی اجرا میشوند و برنامه نویسان بزرگ برای آنکه بتوانند کدهای مختلف با کاربردهای متنوع بنویسند و در اختیار مردم قرار دهند، باید به چندین زبان برنامه نویسی مسلط باشند. هر چند که در این بین، زبانها و فریمورکهایی هستند که طوری طراحی شدهاند که بتوانند در پلتفرمهای زیادی کار کنند. یکی از این نمونهها فریمورک react native میباشد، که میتوان در آن فقط با استفاده از زبان جاوا اسکریپت و کتابخانه React که توسط فیسبوک ارائه شده، هم برای سیستم عاملهای IOS و هم اندروید، اقدام به طراحی اپلیکیشن کرد. در این مقاله از وب نگاه به معرفی کامل فریمورک react native میپردازیم. – گذری کوتاه به دنیای جاوا اسکریپت زبان JavaScript یکی از کاملترین و پرکاربردترین زبانهای برنامه نویسی است که میان عمده مردم از محبوبیت بسیار بالایی برخوردار است. این زبان بسیار کامل و سطح بالا، از سبکهای مختلف برنامه نویسی پشتیبانی میکند و کاربردهای آن بیشمار است. با زبان جاوا اسکریپت میتوان انواع و اقسام برنامهها و بازیها را برای موبایل و دسکتاپ طراحی کرد. معرفی کتابخانه react کتابخانه react یک کتابخانه open source جاوا اسکریپت است، که خوراک برنامه نویسان موبایل میباشد! مهمترین ویژگی این کتابخانه که توسط فیسبوک و اینستاگرام مدیریت و بازرسی میشود، این است که برای دریافت اطلاعات با سرعت بسیار بالا، بسیار مناسب است و همین امر این کتابخانه را به یک محیط ایده آل برای نوشتن کد برنامههای موبایلی و تک صفحهای تبدیل میکند.در واقع یادگیری react.js بسیار ساده بوده و این قابلیت را نیز به برنامه نویسان میدهد تا ب, ...ادامه مطلب
خیلی از ابزارهای command line، براساس فلسفهی bash تهیه شدهاند؛ به این معنا که امکان استفادهی مستقیم از bash، درون دستورات وجود دارد. به عنوان مثال فرض کنید میخواهیم لیست branchهای یک مخزن گیت را با کمک دستور زیر در خروجی، به صورت JSON نمایش دهیم. برای اینکار با یک جستجو شاید به این نتیجه برسید که از پرچم format در دستور git branch استفاده کنید: PS /> git branch --format='{"name":"%(refname:lstrip=2)"}' --list در اینجا به گیت گفتهایم که یک فرمت سفارشی، برای خروجی در نظر بگیرد. میخواهیم خروجی، لیستی از آبجکتهایی باشد که شامل یک پراپرتی name با مقدار نام branch هستند. برای مقدار این پراپرتی، از یک placeholder مشخص استفاده شدهاست: %(refname:lstrip=2) refname در اینجا به نام کامل branch اشاره میکند؛ با این تفاوت که رشتهی refs/heads که در ابتدای آن وجود دارد، برای حذف آن از lstrip=2 استفاده کردهایم. در نهایت این چنین خروجیایی برایمان نمایش داده خواهد شد: {"name":"main"} {"name":"feature-branch-a"} {"name":"feature-branch-b"} ,... اما فرض کنید میخواهیم یک پراپرتی دیگر نیز با عنوان isMainBranch به این آبجکت اضافه کنیم. برای اینکار معمولاً از یک عبارت bash استفاده میشود: (با فرض اینکه main برنچ اصلیمان است) PS /> git branch --format='{"name":"%(refname:lstrip=2)","isMainBranch":'"$(if [[ $(git symbolic-ref --short HEAD) == "main" ]]; then echo true; else echo false; fi)"' }' --list اما اگر این دستور را در PowerShell وارد کنید، با خطای زیر مواجه خواهید شد: ParserErr, ...ادامه مطلب
علیرغم اینکه در Program.cs یا Startup.cs کد زیر وجود دارد، اما بازهم استثناءها در Blazor Server در قالب یک نوار زرد رنگ، پایین مرورگر نشان داده میشوند؛ حال در محیط توسعه باشد و یا در محیط تولید و پابلیش نهایی محصول! if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } برای آزمایش آن، کد فوق را به شکل زیر کامنت میکنیم تا در محیط توسعه نیز در صورتیکه استثنایی رخ داد، ما را به صفحهی Error.cshtml پیش فرض هدایت کند: //if (env.IsDevelopment()) //{ //app.UseDeveloperExceptionPage(); //} //else //{ app.UseExceptionHandler("/Error"); //} حال کامپوننت counter را به شکل زیر ویرایش میکنیم تا استثنایی به عمد رخ دهد: @page "/counter" <PageTitle>Counter</PageTitle> <h1>Counter</h1> <p role="status">Current count: @currentCount</p> <button @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; throw new Exception("This is my Exception !!"); } } با اجرای برنامه ملاحظه خواهید کرد که به صفحهی Error.cshtml هدایت نخواهید شد! حتی با اینکه استثنایی رخ داد، خط app.UseExceptionHandler("/Error") اصلا کاری به مدیریت استثن, ...ادامه مطلب
فرض کنید کدی مانند زیر را در یک کامپوننت داریم و انتظار این است که با کلیک بر روی Section2، به بخش مورد نظر اسکرول شویم: @page "/test" <nav> <!-- یک روش --> <a href="#section2">Section2</a> <!-- روش دیگر --> <NavLink href="#section2">Section2</NavLink> </nav> @* ... *@ <h2 id="section2">It's Section2.</h2> @* ... *@ اما متاسفانه در Blazor Server تا نسخه فعلی آن (نسخه هفت)، این کار ساده به راحتی امکانپذیر نیست. همانطور که ملاحظه میکنید، به دو روش، نویگیشن انجام شدهاست؛ اما هیچیک ما را به هدف نمیرسانند. دلیل این موضوع، رفتار Blazor Server در بارگذاری صفحات میباشد. در حقیقت المانها موقع بارگذاری، هنوز در صفحه وجود ندارند. در واقع ابتدا نیاز است که اتصال SignalR برقرار شود و سپس دادهها از سرور دریافت شوند (مگر در حالت pre-rendered که مشکلات خاص خود را در پی دارد). برای انجام این کار دو روش وجود دارد؛ یکی بر پایهی جاوااسکریپت است و دیگری توسط توابع داخلی Blazor JS. روش جاوااسکریپتی ابتدا یک کامپوننت را به نام AnchorNavigation ایجاد مینماییم: @inject IJSRuntime JSRuntime @inject NavigationManager NavigationManager @implements IDisposable @code { protected override void OnInitialized() { NavigationManager.LocationChanged += OnLocationChanged; } protected override async Task OnAfterRenderAsync(bool firstRender) { await ScrollToFragment(); } public void Dispose() { NavigationManager.LocationChanged -= OnLocationChanged, ...ادامه مطلب
در برنامههای Blazor Server، تنها از یک نخ رابط کاربری واحد ( single UI thread ) استفاده نمیشود؛ بلکه هر نخی که در دسترس باشد، میتواند در موقع رندر، استفاده شود. علاوه بر این اگر از عملیات نامتقارن استفاده شود، زمانیکه به کلمهی کلیدی await میرسیم، آنگاه نخ اختصاص داده شدهی برای ادامه پردازش متد، ممکن است لزوما همان چیزی نباشد که آن را شروع کرده است. برای نشان دادن این موضوع مثالی را در پیش میگیریم. کامپوننتی را با نام SynchronousInitComponent با کد زیر درنظر میگیریم. همانطور که از اسم آن مشخص است این کامپوننت به صورت متقارن یا همزمان پیادهسازی شده است: <p>Sync rendered by thread @IdOfRenderingThread</p> @code { int IdOfRenderingThread; protected override void OnInitialized() { base.OnInitialized(); IdOfRenderingThread = System.Threading.Thread.CurrentThread.ManagedThreadId; } } در حقیقت در متد OnInitialized آن، مقدار نخ جاری را توسط Thread.ManagedThreadId به دست میآوریم. بنابراین شماره نخ جاری پس از رندر شدن کامپوننت، در صفحه نمایش داده میشود. حال در کامپوننت دیگری برای مثال کامپوننت index، کامپوننت همزمان فوق را به شکل زیر فراخوانی میکنیم: @page "/" <h1>Components with synchronous OnInitialized()</h1> @for (int i = 0; i < 5; i++) { <SynchronousInitComponent /> } با این نتیجه: Components with synchronous OnInitialized() Sync rendered by thread 4 Sync rendered by thread 4 Sync rendered by thread 4 Sync rendered by thread 4 Sync rendered by thread 4 همانطور که ملاحظه مینمایید شناسه ن, ...ادامه مطلب
زمانیکه تصمیم میگیریم کدهای زده شده را بهینه کنیم، اکثرا دنبال راه حلهای جدید نمیگردیم. این مورد کاملا غریزی است؛ چرا که بهدنبال کمترین انرژی و بیشترین بازدهی هستیم؛ این طبیعت انسان است. صرفا کدهای قبلی را بازبینی میکنیم و سعی میکنیم نحوهی نوشتن منطقهای موجود را بهینه کنیم. در همین راستا درک عملکرد Task و ValueTask ها شاید قدمی مهم در مورد بهینه کردن کدها باشد؛ چرا استفاده درست و بجای این دو مورد میتواند تاثیر زیادی بر روی سرعت و استفاده از مصرف حافظه داشته باشد؟ در این مقاله سعی میکنیم تا درک درستی از این دو داشته باشیم. Task<T> چیست؟ Task یک کلاس در فضای نام System.Threading.Tasks است؛ بهطوریکه کمک میکند تا یک قسمت از برنامه به صورت مستقل از Thread اصلی اجرا شود. بهبیان دیگر میتواند یک Thread Pool را ایجاد و با توجه به روند کار، از یک مرحلهی اجرایی به مرحلهای دیگر منتقل میکند. همچنین هر Task میتواند یک مقدار برگشتی نیز داشته باشد. این درحالیاست که میتواند صرفا یک فرآیند را اجرا کند، بدون اینکه خروجی داشته باشد. بهعبارتی دیگر اگر فرآیندی داشته باشیم که در نهایت یک شناسه را برمیگرداند، از Task<int> و اگر فرآیندی داشته باشیم که صرفا فرآیند همگام سازی دادههای قدیمی به جدید را انجام میدهد، میتواند از نوع Task باشد. همانطور که اشاره شد، Task یک کلاس است که شامل متدها و فیلدهای مختلفی میباشد. با استفاده از این اعضا میتوان نحوهی اجرای کدها و وضعیتهای مختلف اجرای آن را مدیریت کرد، تا در نهایت اجرای آن کام, ...ادامه مطلب
بالاخره تفاوت کارآیی بین حلقههای for و foreach در دات نت 7 برطرف شدهاست که این مورد نیز یکی دیگر از دلایل بهبود کارآیی LINQ در دات نت 7 است. در این مطلب به همراه آزمایشی، این مورد را بررسی خواهیم کرد. تدارک یک آزمایش برای بررسی کارآیی حلقههای for و foreach در دات نت 7 یک برنامهی کنسول جدید را ایجاد کرده و سپس کتابخانهی BenchmarkDotNet را با TargetFramework دات نت 7 به صورت زیر به پروژه اضافه میکنیم: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="BenchmarkDotNet" Version="0.13.4" /> </ItemGroup> </Project> در ادامه به این پروژه، کلاس زیر را اضافه میکنیم: using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; namespace NET7Loops; [SimpleJob(RuntimeMoniker.Net60)] [SimpleJob(RuntimeMoniker.Net70)] [MemoryDiagnoser(false)] public class Benchmarks { private int[] ItemsArray; private List<int> ItemsList; [GlobalSetup] public void Setup() { var random = new Random(420); var randomItems = Enumerable.Range(0, 1000).Select(_ => random.Next()); ItemsArray = randomItems.ToArray(); ItemsList = randomItems.ToList(); } [Benchmark] public void For_Array() { for (var i =, ...ادامه مطلب