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

آیدی ادمین:
@ma_limbs
Download Telegram
‏ویژگی NRT در C#، خطای null reference را در زمان کامپایل کاهش می‌دهد. 🛡️

‏در رکوردها (records)، این ویژگی به شکل زیر در پراپرتی‌ها اعمال می‌شود:

```csharp
public record Person(string FirstName, string? LastName);
```

‏علامت سوال `?` بعد از `string` نشان می‌دهد `LastName` می‌تواند null باشد. در غیر این صورت، کامپایلر مطمئن می‌شود که مقدار null به پراپرتی غیرnullable اختصاص داده نشود.

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

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

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏در C#، متغیرهایی که به عنوان پارامتر به یک متد (تابع) ارسال می‌شوند، مانند متغیرهای محلی، دارای محدوده (scope) و عمر (lifetime) مشخصی هستند.

‏محدوده این پارامترها فقط داخل خود متد تعریف شده است. به محض اینکه اجرای متد به پایان برسد، این پارامترها از حافظه پاک شده و دیگر قابل دسترسی نخواهند بود. این بدان معناست که شما نمی‌توانید خارج از متد به مقادیر یا حتی وجود این پارامترها دسترسی داشته باشید.

‏این رفتار برای جلوگیری از تداخل داده‌ها بین بخش‌های مختلف برنامه و حفظ نظم در اجرای کد بسیار حیاتی است. 💡

‏void PrintMessage(string message) // 'message' یک پارامتر متد است
{
‏ Console.WriteLine(message); // 'message' فقط در اینجا قابل دسترسی است
}

‏// در خارج از این متد، 'message' دیگر وجود ندارد.


‏این اصل، مدیریت حافظه و جلوگیری از خطاهای احتمالی را در برنامه‌های پیچیده C# تسهیل می‌کند.

https://t.me/csharp7
‏در C#، انتخاب نوع مجموعه داده مناسب برای عملیات مختلف می‌تواند تأثیر قابل توجهی بر عملکرد داشته باشد. برای مثال، در سناریوهایی که نیاز به دسترسی مکرر به عناصر یا افزودن/حذف سریع دارید، List<T> معمولاً انتخاب خوبی است. اما وقتی صحبت از داده‌های بزرگ و عملیات موازی می‌شود، گزینه‌های دیگری نیز مطرح می‌شوند.

ConcurrentBag<T> یکی از این گزینه‌هاست که برای سناریوهای چندنخی (multi-threaded) طراحی شده و امکان افزودن و حذف ایمن عناصر را بدون نیاز به قفل‌گذاری صریح فراهم می‌کند. در مقایسه با List<T> در محیط‌های موازی، ConcurrentBag<T> می‌تواند سربار کمتری داشته باشد.

‏برای درک بهتر تفاوت عملکرد، می‌توان زمان‌بندی اجرای عملیات مختلف مانند افزودن، حذف و پیمایش را در List<T> و ConcurrentBag<T> تحت بار موازی اندازه‌گیری کرد. نتایج معمولاً نشان می‌دهند که ConcurrentBag<T> در سناریوهای با دسترسی همزمان بالا، کارایی بهتری از خود نشان می‌دهد. 📊⏱️

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

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

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
📌 در #C، کلاس `Random` دو روش برای تولید اعداد تصادفی داره.

‏`Random.Shared` یک نمونه استاتیک و سراسری از `Random` رو برمی‌گردونه که برای کل برنامه به اشتراک گذاشته می‌شه. این روش سریع‌تره و برای تولید اعداد تصادفی در threadهای مختلف مناسبه.

‏اما `new Random()` هر بار یک نمونه جدید از `Random` ایجاد می‌کنه. اگه این نمونه‌ها خیلی سریع پشت سر هم ایجاد بشن، ممکنه اعداد تصادفی یکسانی تولید کنن. 🎲

‏به طور خلاصه: برای عملکرد بهتر و جلوگیری از تکرار، `Random.Shared` رو انتخاب کن. ⚙️

https://t.me/csharp7
🔍🧹

‏آنالیزورهای #C به شما کمک می‌کنند کدهای بهتری بنویسید. اما گاهی هشدارهای غیرضروری می‌دهند.

‏می‌توانید با استفاده از فایل `.editorconfig` سطح سخت‌گیری یک قانون (Rule) خاص را تغییر دهید. مثلاً یک هشدار را به یک پیشنهاد تبدیل کنید یا کلاً غیرفعالش کنید.

‏به این ترتیب، هم از مزایای آنالیز کد بهره‌مند می‌شوید و هم از هشدارهای اضافی خلاص می‌شوید. 👌

https://t.me/csharp7
‏برای جلوگیری از حلقه‌های for بی‌نهایت در C#، اطمینان حاصل کنید که شرط خروج حلقه در هر تکرار به سمت false شدن پیش می‌رود.

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

‏// حلقه for بی‌نهایت
for (int i = 0; i > -10; i++)
{
‏ // کد شما
Console.WriteLine(i);
}


‏در این مثال، i همیشه بزرگتر از -10 باقی می‌ماند. برای اصلاح، یا شرط خروج را تغییر دهید یا جهت شمارنده را معکوس کنید:

‏// حلقه for صحیح
for (int i = 0; i < 10; i++)
{
‏ // کد شما
Console.WriteLine(i);
}


‏یا

‏// حلقه for صحیح با شمارنده معکوس
for (int i = 0; i > -10; i--)
{
‏ // کد شما
Console.WriteLine(i);
}


‏همیشه منطق شرط خروج حلقه را با دقت بررسی کنید. 🔄💡

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

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

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏در توسعه وب با ASP.NET Core، تعریف مدل‌های داده (Entities) اولین گام برای تعامل با پایگاه داده است. این مدل‌ها کلاس‌هایی هستند که ساختار داده‌های شما را منعکس می‌کنند و معمولاً با جداول پایگاه داده نگاشت می‌شوند.

‏برای مثال، فرض کنید می‌خواهیم یک مدل برای "محصول" تعریف کنیم:

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
}


‏در این مثال:
`Id` به عنوان کلید اصلی (Primary Key) جدول `Products` در پایگاه داده عمل خواهد کرد.
Name، Price و Description ستون‌های دیگر جدول را نشان می‌دهند.

‏هنگام استفاده از Entity Framework Core، این کلاس‌ها به طور خودکار به جداول پایگاه داده نگاشت می‌شوند. شما می‌توانید با استفاده از Data Annotations یا Fluent API، قوانین و تنظیمات بیشتری برای نگاشت و اعتبارسنجی اعمال کنید.

‏به عنوان مثال، برای مشخص کردن اینکه Id یک کلید اصلی است و نیاز به تولید خودکار مقدار دارد، نیازی به کد اضافی در این حالت نیست، زیرا Entity Framework Core به طور پیش‌فرض آن را تشخیص می‌دهد. اما برای فیلدهایی که نیاز به محدودیت دارند، می‌توان از Data Annotations استفاده کرد:

using System.ComponentModel.DataAnnotations;

public class Product
{
public int Id { get; set; }

‏ [Required] // این فیلد نباید خالی باشد
‏ [StringLength(100)] // حداکثر طول رشته 100 کاراکتر است
public string Name { get; set; }

‏ [Range(0.01, 10000.00)] // قیمت باید بین 0.01 و 10000.00 باشد
public decimal Price { get; set; }

public string Description { get; set; }
}


‏این مدل‌ها ستون فقرات ساختار داده‌ای برنامه شما را تشکیل می‌دهند و پایه و اساس عملیات CRUD (Create, Read, Update, Delete) را فراهم می‌کنند. 🏗️📊

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

https://t.me/csharp7
This media is not supported in your browser
VIEW IN TELEGRAM
🔵 آموزش گیت (Git) - Stashing

🟢 کیفیت : متوسط

🔴 توجه کنید این ویدیو با کیفیت متوسط می باشد. طی روزهای آینده نسخه های متفاوت با کیفیت بالاتر یا کم حجم تر از این نسخه در کانال قرار داده خواهد شد.

🟣 آموزش گیت (Git)

🟢 زبان آموزش: فارسی


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

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

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

آدرس وبسایت:
https://Tutorial24.ir
‏حلقه‌های for در C# قابلیت انعطاف‌پذیری بالایی دارند و می‌توانند با استفاده از شمارنده‌های دوگانه، شروط پیچیده‌تری را مدیریت کنند. این تکنیک به شما اجازه می‌دهد تا همزمان دو متغیر را در حلقه کنترل کنید، که برای سناریوهایی مانند پیمایش یک آرایه از ابتدا به انتها و همزمان از انتها به ابتدا، یا مقایسه عناصر با فواصل مختلف، بسیار مفید است.

‏مثال ساده‌ای از استفاده از دو شمارنده در حلقه for:

for (int i = 0, j = 10; i < j; i++, j--)
{
Console.WriteLine($"i: {i}, j: {j}");
}


‏در این مثال، i از صفر شروع شده و افزایش می‌یابد، در حالی که j از ده شروع شده و کاهش می‌یابد. حلقه تا زمانی که i کوچکتر از j باشد ادامه پیدا می‌کند. این روش امکان پیاده‌سازی الگوریتم‌های کارآمدی مانند جستجوی دو طرفه یا مرتب‌سازی‌های خاص را فراهم می‌سازد. 💡⚙️

https://t.me/csharp7
‏در ASP.NET Core، صفات (Attributes) ابزاری قدرتمند برای اعمال مجوزدهی (Authorization) در سطح کنترلرها و اکشن‌ها هستند. با استفاده از صفت [Authorize]، می‌توانید دسترسی به بخش‌های مختلف برنامه خود را محدود کنید.

‏برای مثال، اگر می‌خواهید یک اکشن فقط برای کاربران احراز هویت شده (Authenticated) قابل دسترسی باشد، کافیست صفت [Authorize] را بالای آن قرار دهید:

[HttpGet]
[Authorize]
public IActionResult MySecureAction()
{
return Ok("This is a secure action.");
}


‏همچنین می‌توانید با مشخص کردن نقش‌ها یا سیاست‌های مجوزدهی، دسترسی را دقیق‌تر کنترل کنید. برای مثال، برای محدود کردن دسترسی به کاربران با نقش "Admin":

[HttpGet]
[Authorize(Roles = "Admin")]
public IActionResult AdminAction()
{
return Ok("This action is only for Admins.");
}


‏یا با استفاده از سیاست‌های مجوزدهی تعریف شده در Startup.cs:

[HttpGet]
[Authorize(Policy = "RequireElevatedPrivileges")]
public IActionResult ElevatedAction()
{
return Ok("This action requires elevated privileges.");
}


‏این صفات به طور خودکار قبل از اجرای اکشن، منطق مجوزدهی را اجرا می‌کنند و در صورت عدم موفقیت، پاسخ مناسب (معمولاً 401 Unauthorized یا 403 Forbidden) را برمی‌گردانند. 🛡️🔒

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

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

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏در #C شارپ، `ISourceGenerator` و `IIncrementalGenerator` هر دو برای تولید کد در زمان کامپایل استفاده می‌شوند. ⚙️

‏تفاوت کلیدی این است که `IIncrementalGenerator` خروجی را به‌صورت افزایشی (incremental) تولید می‌کند. این یعنی فقط زمانی دوباره اجرا می‌شود که ورودی‌ها تغییر کرده باشند، در نتیجه سرعت کامپایل افزایش می‌یابد. 🚀

‏`ISourceGenerator` در هر بار کامپایل از نو اجرا می‌شود. 🔄

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
‏حلقه while در C# ابزاری قدرتمند برای تکرار عملیات تا زمانی که شرط مشخصی برقرار باشد، است. این حلقه به ویژه در پردازش رشته‌ها و کاراکترها کاربرد فراوانی دارد.

‏برای مثال، اگر بخواهید تمام کاراکترهای یک رشته را تا زمانی که به کاراکتر خاصی (مانند نقطه) نرسیده‌اید، بخوانید، می‌توانید از while استفاده کنید:

‏string text = "این یک مثال است. پایان.";
int index = 0;

while (index < text.Length && text[index] != '.')
{
Console.Write(text[index]);
index++;
}
‏// خروجی: این یک مثال است


‏این روش به شما امکان می‌دهد تا به صورت پویا با داده‌های متنی کار کرده و عملیات را بر اساس شرایط در حال تغییر انجام دهید. 🧐

https://t.me/csharp7
‏در C#، اعضای یک کلاس (متغیرها و متدها) دارای محدوده دسترسی مشخصی هستند که تعیین می‌کند از کجا قابل دسترسی باشند. این محدوده دسترسی با استفاده از کلمات کلیدی مانند public، private، protected و internal مشخص می‌شود.

`public`: اعضای `public` از هر کجای برنامه قابل دسترسی هستند.
private: اعضای private فقط در داخل همان کلاسی که تعریف شده‌اند، قابل دسترسی هستند. این نوع دسترسی پیش‌فرض برای اعضای کلاس است.
`protected`: اعضای `protected` در داخل همان کلاس و همچنین در کلاس‌های مشتق شده (کلاس‌هایی که از این کلاس ارث می‌برند) قابل دسترسی هستند.
internal: اعضای internal فقط در داخل همان اسمبلی (پروژه) که تعریف شده‌اند، قابل دسترسی هستند.

‏برای دسترسی به اعضای یک کلاس از خارج آن کلاس، ابتدا باید یک شیء (Object) از آن کلاس ایجاد کنید. سپس با استفاده از عملگر نقطه (.) می‌توانید به اعضای public آن شیء دسترسی پیدا کنید.

‏به عنوان مثال:

public class MyClass
{
public int publicVariable = 10;
private string privateVariable = "Hello";

public void PublicMethod()
{
Console.WriteLine("This is a public method.");
‏ PrivateMethod(); // دسترسی به متد private از داخل کلاس مجاز است
}

private void PrivateMethod()
{
Console.WriteLine("This is a private method.");
}
}

‏// در جای دیگر از برنامه:
MyClass myObject = new MyClass();
‏Console.WriteLine(myObject.publicVariable); // دسترسی مجاز به متغیر public
‏myObject.PublicMethod(); // دسترسی مجاز به متد public

‏// Console.WriteLine(myObject.privateVariable); // خطا: دسترسی مجاز نیست
‏// myObject.PrivateMethod(); // خطا: دسترسی مجاز نیست


‏دسترسی به اعضای کلاس، کپسوله‌سازی (Encapsulation) را تضمین می‌کند و به شما اجازه می‌دهد تا جزئیات پیاده‌سازی را از دید کاربران کلاس پنهان نگه دارید. 🔒 encapsulation 캡슐화

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
‏گاهی در مدیریت خطا، نیاز داریم استثنایی را که دریافت کرده‌ایم، دوباره پرتاب کنیم. این کار به لایه‌های بالاتر برنامه اجازه می‌دهد تا استثنا را مدیریت کنند یا اطلاعات بیشتری به آن اضافه کنند.

‏سناریوی ۱: پرتاب مجدد استثنا با حفظ اطلاعات اصلی

‏فرض کنید تابعی داریم که داده‌ای را از فایل می‌خواند و در صورت بروز خطا در خواندن فایل، استثنایی پرتاب می‌کند. اگر این تابع بخواهد استثنا را دوباره پرتاب کند، می‌تواند از throw; استفاده کند. این دستور استثنای فعلی را بدون تغییر به لایه‌های بالاتر منتقل می‌کند.

public void ReadDataFromFile(string filePath)
{
try
{
‏ // منطق خواندن داده از فایل
// ...
‏ if (/* خطایی در خواندن رخ داده */)
{
‏ throw new IOException("خطا در خواندن فایل.");
}
}
catch (IOException ex)
{
‏ // لاگ کردن خطا یا انجام عملیات دیگر
‏ Console.WriteLine($"خطا در ReadDataFromFile: {ex.Message}");
‏ throw; // پرتاب مجدد استثنای اصلی
}
}


‏سناریوی ۲: پرتاب مجدد استثنا با اضافه کردن اطلاعات جدید (Wrapper Exception)

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

public void ProcessUserData(int userId)
{
try
{
‏ // منطق پردازش داده کاربر
// ...
‏ if (/* خطایی در پردازش رخ داده */)
{
‏ throw new InvalidOperationException("داده کاربر نامعتبر است.");
}
}
catch (InvalidOperationException ex)
{
‏ // پرتاب استثنای جدید با ارجاع به استثنای اصلی
‏ throw new UserProcessingException($"خطا در پردازش کاربر با شناسه {userId}.", ex);
}
}

public class UserProcessingException : Exception
{
public UserProcessingException(string message, Exception innerException) : base(message, innerException)
{
}
}

‏در این مثال، UserProcessingException استثنای اصلی InvalidOperationException را در خود جای داده و اطلاعات مربوط به شناسه کاربر را نیز اضافه کرده است. این به لایه‌های بالاتر کمک می‌کند تا هم خطای اصلی را بفهمند و هم زمینه وقوع آن را. 📂⚙️

https://t.me/csharp7
🔵 کوییز #سی_شارپ

🟣 موضوع : ‏ویژگی‌های جدید در C#

🟢 سوال :

‏کدام یک از موارد زیر یک ویژگی جدید در C# برای کار با توابع بازگشتی است؟

گزینه ۱:
‏حلقه‌های for

گزینه ۲:
‏دستورات switch

گزینه ۳:
Tail-Call Optimization

گزینه ۴:
‏کلاس‌های generic

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

🟢 توضیح :

‏Tail-Call Optimization یک ویژگی جدید در C# برای بهینه‌سازی توابع بازگشتی است.

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

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

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

آدرس وبسایت:
https://Tutorial24.ir
1