آموزش C# و .Net
1.55K subscribers
427 photos
325 videos
19 files
2.79K links
تعرفه تبلیغات :
https://t.me/+w-o6dHW5O31jMWNk

آیدی ادمین:
@ma_limbs
Download Telegram
‏در توسعه وب با ASP.NET Core، استفاده از ViewModels نقش کلیدی در سازماندهی و انتقال امن داده‌ها بین کنترلر و نما (View) ایفا می‌کند. ViewModels اشیاء سفارشی هستند که برای نمایش یک نمای خاص طراحی شده‌اند و تنها اطلاعات مورد نیاز آن نما را در بر می‌گیرند. این رویکرد به جدا کردن منطق نمایش از منطق دامنه (Domain Logic) کمک کرده و کد را خواناتر و قابل نگهداری‌تر می‌سازد.

‏به عنوان مثال، فرض کنید برای نمایش جزئیات یک محصول نیاز به نمایش نام محصول، قیمت و نام دسته‌بندی آن دارید. به جای ارسال مستقیم یک مدل دامنه پیچیده که ممکن است شامل اطلاعات اضافی باشد، می‌توانید یک ViewModel تعریف کنید:

public class ProductDetailViewModel
{
public string ProductName { get; set; }
public decimal Price { get; set; }
public string CategoryName { get; set; }
}


‏سپس در کنترلر، داده‌های مورد نیاز را استخراج کرده و در این ViewModel قرار می‌دهید:

public IActionResult ProductDetails(int id)
{
‏ // فرض کنید این داده‌ها از دیتابیس یا سرویس دیگری دریافت می‌شوند
var product = GetProductById(id);
var category = GetCategoryById(product.CategoryId);

var viewModel = new ProductDetailViewModel
{
ProductName = product.Name,
Price = product.Price,
CategoryName = category.Name
};

return View(viewModel);
}


‏و در نهایت، در فایل Razor View مربوطه، از این ViewModel برای نمایش اطلاعات استفاده می‌کنید:

@model YourProject.ViewModels.ProductDetailViewModel

<h2>@Model.ProductName</h2>
<p>Price: @Model.Price.ToString("C")</p>
<p>Category: @Model.CategoryName</p>


‏استفاده از ViewModels به جلوگیری از مشکلات امنیتی مانند Over-posting (ارسال داده‌های ناخواسته از سمت کلاینت) نیز کمک می‌کند، زیرا شما دقیقاً مشخص می‌کنید چه داده‌هایی باید از کنترلر به نما منتقل شوند. 🚀

https://t.me/csharp7
🔵 با عضویت در لیست تلگرامی جامع آموزش زبان زیر عضو بی نظیرترین‌ و کامل ترین مجموعه آموزش زبان انگلیسی تلگرامی شوید:

🟢 پادکست، کوییز، گرامر، آیلتس، تافل، ویدیو، آموزش زبان به کودکان، اصطلاحات انگلیسی، زبان کنکور و ... :

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏ویژگی جالب C# 🛠️

‏با کلمه کلیدی `field`، در Propertyها مستقیماً به فیلد پشتیبان (backing field) دسترسی پیدا کنید. دیگه نیازی به تعریف فیلد جداگانه نیست!

```csharp
public string Name {
get => field ?? "N/A";
set => field = value;
}
```

‏اینطوری کدتون خواناتر میشه 👌

https://t.me/csharp7
‏Extension methods رو که بلدید؟ 😎

‏Extension properties و extension operators هم داریم!

‏با این دوتا، میشه بدون اینکه کلاس یا ساختار رو دست بزنید، property یا operator جدید بهش اضافه کنید. خیلی جاها کار رو راه میندازه. 👌

https://t.me/csharp7
‏در C#، متد Peek() در کلاس Queue<T> به شما امکان می‌دهد تا اولین عنصر موجود در صف را بدون حذف آن مشاهده کنید. این قابلیت زمانی مفید است که نیاز دارید به اطلاعات اولین آیتم دسترسی داشته باشید اما نمی‌خواهید آن را از صف خارج کنید.

using System;
using System.Collections.Generic;

public class Example
{
public static void Main(string[] args)
{
Queue<string> myQueue = new Queue<string>();
myQueue.Enqueue("Apple");
myQueue.Enqueue("Banana");
myQueue.Enqueue("Cherry");

‏ // دسترسی به اولین عنصر بدون حذف
string firstItem = myQueue.Peek();
‏ Console.WriteLine($"First item is: {firstItem}"); // خروجی: First item is: Apple

‏ // صف همچنان شامل همه عناصر است
‏ Console.WriteLine($"Queue count: {myQueue.Count}"); // خروجی: Queue count: 3
}
}

‏استفاده از Peek() یک روش کارآمد برای بررسی وضعیت صف است. 🍎📊

https://t.me/csharp7
🔵 دوست داری برنامه نویس حرفه ای بشی یا مهارت های کامپیوتری خودت رو افزایش بدی؟ با عضویت در لیست تلگرامی زیر در بی نظیر ترین کانال های برنامه نویسی ما عضو شوید:

🟢 پایتون، هوش مصنوعی، یادگیری ماشین، سی ++، سی شارپ، دات نت، نود جی اس، جاوا اسکریپت، شبکه، علم داده، پایگاه داده، sql، nosql ، مهارت های ICDL، سیستم عامل، لینوکس، فتوشاپ، گرافیک، اندروید، جاوا، ساخت اپلیکیشن موبایل، ری اکت، جی کوئری، php و laravel، دروس رشته کامپیوتر، کنکور کامپیوتر و ...

عضو لیست جامع شوید:

https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
‏در C#، عملیات فشرده‌سازی و استخراج فایل‌ها می‌تواند بسته به حجم داده و الگوریتم مورد استفاده، تاثیر قابل توجهی بر عملکرد برنامه داشته باشد. برای مدیریت این عملیات، کتابخانه‌های مختلفی وجود دارند، اما System.IO.Compression یکی از ابزارهای داخلی قدرتمند در .NET است.

‏برای فشرده‌سازی یک فایل، می‌توان از کلاس GZipStream یا DeflateStream استفاده کرد. این کلاس‌ها امکان نوشتن داده‌ها را به صورت فشرده در یک فایل یا استریم دیگر فراهم می‌کنند.

‏مثال ساده فشرده‌سازی:
using System.IO;
using System.IO.Compression;

// ...

string sourceFilePath = "original.txt";
string compressedFilePath = "compressed.gz";

using (FileStream originalFileStream = new FileStream(sourceFilePath, FileMode.Open))
using (FileStream compressedFileStream = new FileStream(compressedFilePath, FileMode.Create))
using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionLevel.Optimal))
{
originalFileStream.CopyTo(compressionStream);
}


‏برای استخراج فایل فشرده شده، فرآیند معکوس انجام می‌شود. با استفاده از GZipStream یا DeflateStream در حالت خواندن، می‌توان داده‌های فشرده را خوانده و به صورت اصلی در یک فایل دیگر نوشت.

‏مثال ساده استخراج:
using System.IO;
using System.IO.Compression;

// ...

string compressedFilePath = "compressed.gz";
string extractedFilePath = "extracted.txt";

using (FileStream compressedFileStream = new FileStream(compressedFilePath, FileMode.Open))
using (FileStream extractedFileStream = new FileStream(extractedFilePath, FileMode.Create))
using (GZipStream decompressionStream = new GZipStream(compressedFileStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(extractedFileStream);
}


‏نکات بهینه‌سازی:

انتخاب سطح فشرده‌سازی: کلاس `GZipStream` و `DeflateStream` پارامتری به نام `CompressionLevel` دارند که می‌تواند `NoCompression`، `FastestCompression`، `Optimal` یا مقادیر بین اینها باشد. `Optimal` بهترین فشرده‌سازی را ارائه می‌دهد اما کندتر است، در حالی که `FastestCompression` سریع‌تر است اما فشرده‌سازی کمتری دارد. انتخاب مناسب بر اساس نیاز برنامه (سرعت در مقابل حجم) مهم است.
مدیریت حافظه: برای فایل‌های بسیار بزرگ، استفاده از CopyTo که به صورت بافری عمل می‌کند، معمولاً کارآمدتر از خواندن و نوشتن تک به تک بایت‌ها یا قطعات کوچک است. اطمینان حاصل کنید که FileStream و استریم‌های فشرده‌سازی در بلوک‌های using قرار می‌گیرند تا منابع به درستی آزاد شوند.
استفاده از `MemoryStream`: در سناریوهایی که نیاز به فشرده‌سازی یا استخراج داده‌ها در حافظه دارید (بدون نیاز به فایل فیزیکی)، می‌توانید از `MemoryStream` به جای `FileStream` استفاده کنید.
الگوریتم‌های جایگزین: برای نیازهای خاص‌تر یا عملکرد بالاتر، ممکن است نیاز به بررسی کتابخانه‌های شخص ثالث مانند DotNetZip یا SharpZipLib باشد که الگوریتم‌های فشرده‌سازی بیشتری (مانند LZMA، BZip2) و قابلیت‌های پیشرفته‌تری را ارائه می‌دهند.

‏عملیات I/O، به خصوص فشرده‌سازی و استخراج، می‌تواند گلوگاه برنامه باشد. درک نحوه استفاده صحیح از ابزارهای موجود و انتخاب گزینه‌های بهینه، به بهبود کلی عملکرد کمک شایانی می‌کند. 💾⚙️

https://t.me/csharp7
‏TensorPrimitives مجموعه‌ای از APIهای سطح پایین برای انجام عملیات تانسوری در C# هستند. 🧮 این توابع، کارایی بالایی در پردازش داده‌های عددی ارائه می‌دهند و برای توسعه‌دهندگان حوزه‌های یادگیری ماشین، هوش مصنوعی و پردازش سیگنال بسیار مفیدند. با استفاده از TensorPrimitives، می‌توان محاسبات پیچیده را با سرعت بیشتری انجام داد. ⚡️

https://t.me/csharp7
‏.NET 10 یک قابلیت جذاب داره: Devirtualization بهبودیافته! 🚀

‏کامپایلر می‌تونه متدهای virtual رو که دیگه override نشدن، به صورت static صدا بزنه. این یعنی حذف سربار فراخوانی متد مجازی و افزایش سرعت اجرا. ⚡️

‏این بهینه‌سازی، بدون نیاز به تغییر کد، به صورت خودکار انجام میشه و عملکرد برنامه‌هاتون رو ارتقا میده. 😎

https://t.me/csharp7
🔵 با عضویت در لیست تلگرامی جامع آموزش زبان زیر عضو بی نظیرترین‌ و کامل ترین مجموعه آموزش زبان انگلیسی تلگرامی شوید:

🟢 پادکست، کوییز، گرامر، آیلتس، تافل، ویدیو، آموزش زبان به کودکان، اصطلاحات انگلیسی، زبان کنکور و ... :

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏دستور break در C# برای خروج فوری از حلقه استفاده می‌شود. با رسیدن به دستور break، اجرای حلقه متوقف شده و برنامه از اولین خط بعد از حلقه ادامه پیدا می‌کند.

‏مثال:
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
‏ break; // حلقه در اینجا متوقف می‌شود
}
Console.WriteLine(i);
}
‏// خروجی: 0 1 2 3 4


‏دستور continue برای رد کردن تکرار فعلی حلقه و رفتن به تکرار بعدی استفاده می‌شود. با رسیدن به دستور continue، بقیه کدهای داخل حلقه در آن تکرار اجرا نمی‌شوند و حلقه به سراغ شرط بعدی یا افزایش/کاهش شمارنده می‌رود.

‏مثال:
for (int i = 0; i < 10; i++)
{
if (i % 2 == 0)
{
‏ continue; // اگر عدد زوج بود، از این تکرار رد شو
}
Console.WriteLine(i);
}
‏// خروجی: 1 3 5 7 9


‏این دو دستور ابزارهای قدرتمندی برای کنترل دقیق جریان اجرای حلقه‌ها در C# هستند. 🚀💡

https://t.me/csharp7
‏در C# 11 قابلیتی اضافه شده به اسم File-local types. 📜

‏با استفاده از کلمه کلیدی `file` قبل از `class` یا `struct`، نوعی تعریف می‌کنید که فقط در همان فایل قابل دسترسی است. 🔒

‏این کار از تداخل نام‌ها جلوگیری می‌کند و کپسوله‌سازی بهتری را در فایل‌های بزرگ فراهم می‌سازد. 👌

https://t.me/csharp7
‏آرایه‌ها در #C ظرفیت ثابتی دارند.
‏اما گاهی تعداد آرگومان‌های ورودی تابع از قبل مشخص نیست.

‏کافیه از کلمه کلیدی `params` قبل از تعریف آرایه در پارامترهای ورودی تابع استفاده کنید.
‏به این شکل، هر تعداد آرگومان هم‌نوع رو میشه به تابع پاس داد.

‏مثال:
`void MyFunc(params int[] numbers)`
✔️
`MyFunc(1, 2, 3, 4, 5);`

‏این قابلیت برای پاس دادن کالکشن‌ها هم کاربرد داره. 🧰
‏فقط یادتون باشه `params` باید آخرین پارامتر ورودی تابع باشه. ⚙️

https://t.me/csharp7
🔵 با عضویت در لیست تلگرامی جامع آموزش زبان زیر عضو بی نظیرترین‌ و کامل ترین مجموعه آموزش زبان انگلیسی تلگرامی شوید:

🟢 پادکست، کوییز، گرامر، آیلتس، تافل، ویدیو، آموزش زبان به کودکان، اصطلاحات انگلیسی، زبان کنکور و ... :

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏در C#، هنگام مدیریت استثناها، گاهی لازم است استثنا را پرتاب مجدد کنیم اما اطلاعات اصلی آن را از دست ندهیم. برای این منظور می‌توانیم از دستور throw; استفاده کنیم. این دستور استثنای فعلی را بدون تغییر در اطلاعات آن (مانند stack trace) پرتاب می‌کند.

‏به عنوان مثال، در بلوک catch می‌توانید از این روش استفاده کنید:

try
{
‏ // کدی که ممکن است استثنا ایجاد کند
}
catch (Exception ex)
{
‏ // لاگ کردن استثنا یا انجام عملیات دیگر
‏ Console.WriteLine($"خطایی رخ داد: {ex.Message}");

‏ // پرتاب مجدد استثنای اصلی
throw;
}


‏استفاده از throw; تضمین می‌کند که stack trace اصلی استثنا حفظ می‌شود که برای اشکال‌زدایی بسیار حیاتی است. ⚠️💡

https://t.me/csharp7
💠 عضو جامع ترین کانال های توسعه فردی، روانشناسی و موفقیت شوید:

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0

شامل موضوعات آموزشی زیر:

توسعه و رشد فردی
افزایش ثروت
هدف گذاری و مدیریت زمان
مهارت های اجتماعی، ارتباطی و فن بیان
روانشناسی و خودیاری
موفقیت
عادات موثر
سلامت و تغذیه سالم
موفقیت شغلی
عبارات تاکیدی
مدیریت اضطراب و خشم
روان درمانی CBT و ACT
شخصیت شناسی و تحلیل روانشناسی
انگیزشی
کودک درون
تکنیک های NLP
یوگا
افزایش حافظه
مدیتیشن
موفقیت تحصیلی
مطالعه موثر
افزایش اعتماد به نفس
افزایش تمرکز
تفکر مثبت
افزایش خلاقیت
نقل قول های انگیزشی

با کلیک بر روی لینک زیر عضو تمامی این کانال ها شوید:

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0
🔵 کوییز #سی_شارپ

🟣 موضوع : ‏اصول برنامه‌نویسی تابعی در C#

🟢 سوال :

‏کدام یک از موارد زیر یک روش برای جلوگیری از تغییر حالت داده‌ها در برنامه‌نویسی تابعی است؟

گزینه ۱:
‏استفاده از متغیرهای سراسری

گزینه ۲:
‏استفاده از کلاس‌های mutable

گزینه ۳:
‏استفاده از کلاس‌های immutable

گزینه ۴:
‏استفاده از حلقه‌های for

🔵 گزینه صحیح: 3

🟢 توضیح :

‏کلاس‌های immutable پس از ایجاد، قابل تغییر نیستند.

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
💠 عضو جامع ترین کانال های توسعه فردی، روانشناسی و موفقیت شوید:

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0

شامل موضوعات آموزشی زیر:

توسعه و رشد فردی
افزایش ثروت
هدف گذاری و مدیریت زمان
مهارت های اجتماعی، ارتباطی و فن بیان
روانشناسی و خودیاری
موفقیت
عادات موثر
سلامت و تغذیه سالم
موفقیت شغلی
عبارات تاکیدی
مدیریت اضطراب و خشم
روان درمانی CBT و ACT
شخصیت شناسی و تحلیل روانشناسی
انگیزشی
کودک درون
تکنیک های NLP
یوگا
افزایش حافظه
مدیتیشن
موفقیت تحصیلی
مطالعه موثر
افزایش اعتماد به نفس
افزایش تمرکز
تفکر مثبت
افزایش خلاقیت
نقل قول های انگیزشی

با کلیک بر روی لینک زیر عضو تمامی این کانال ها شوید:

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0

➡️ https://t.me/addlist/AX8uaLK6gE1jNzg0
‏C# 5.0 با معرفی async و await انقلابی در برنامه‌نویسی ناهمگام ایجاد کرد و اجرای روان‌تر برنامه‌ها را ممکن ساخت.

‏در C# 6.0، شاهد ویژگی‌هایی چون expression-bodied members، string interpolation و null-conditional operators بودیم که کدنویسی را مختصرتر و خواناتر می‌کردند.

‏C# 7.0 با pattern matching و local functions انعطاف‌پذیری بیشتری به کد بخشید.

‏C# 8.0 نیز با معرفی nullable reference types، default interface methods و using declarations، گام‌های مهمی در جهت بهبود امنیت و قابلیت نگهداری کد برداشت. این تکامل مداوم، C# را به زبانی قدرتمند و منعطف تبدیل کرده است. 🚀💡

https://t.me/csharp7
‏در C# برای جلوگیری از تغییر لیست اصلی توسط توابع، دو راه وجود دارد:

‏`ReadOnlyCollection<T>` یک کلاس است که یک کپی فقط خواندنی از لیست اصلی می‌سازد. تغییرات در لیست اصلی، در این کپی اعمال نمی‌شود. 🛡️

‏متد `AsReadOnly()` یک wrapper ایجاد می‌کند که از تغییر لیست اصلی جلوگیری می‌کند. تغییرات در لیست اصلی، در این wrapper قابل مشاهده است. 👀

‏انتخاب بین این دو، بستگی به نیاز شما دارد.

https://t.me/csharp7
🔵 با عضویت در لیست تلگرامی جامع آموزش زبان زیر عضو بی نظیرترین‌ و کامل ترین مجموعه آموزش زبان انگلیسی تلگرامی شوید:

🟢 پادکست، کوییز، گرامر، آیلتس، تافل، ویدیو، آموزش زبان به کودکان، اصطلاحات انگلیسی، زبان کنکور و ... :

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0