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

آیدی ادمین:
@ma_limbs
Download Telegram
💡 دیباگ کردن Source Generatorها در C# ممکنه چالش‌برانگیز باشه.

⚙️ برای این کار، پراپرتی <EmitCompilerGeneratedFiles> رو در فایل .csproj پروژه generator روی true تنظیم کنید.

📁 این کار باعث میشه فایل‌های تولید شده توسط generator در مسیر obj\Debug\net6.0\generated (یا مشابه) ذخیره بشن و بتونید اون‌ها رو بررسی و دیباگ کنید.

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
🔵 کوییز #HTML

🟣 موضوع : ‏تگ‌های صوتی HTML5 (audio)

🟢 سوال :

‏کدام ویژگی تگ <source> فرمت فایل صوتی ارائه شده را مشخص می‌کند؟

گزینه ۱:
‏src (مسیر فایل)

گزینه ۲:
type

گزینه ۳:
‏media (برای media queries)

گزینه ۴:
‏kind (برای زیرنویس)



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

🟢 توضیح :

‏ویژگی type در تگ <source> نوع رسانه (MIME type) فایل صوتی مشخص شده در ویژگی src را تعیین می‌کند (مثلاً audio/mpeg, audio/ogg, audio/wav). این به مرورگر کمک می‌کند تا تشخیص دهد آیا می‌تواند فایل را پخش کند یا خیر.

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

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

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

آدرس وبسایت:
https://Tutorial24.ir
💡 نکته #NoSQL

🟣 موضوع : ‏نظارت و مانیتورینگ (Monitoring)

نکته :

‏یه نگاهی هم به سایز دیتابیس بنداز. اگه خیلی بزرگ شده، شاید وقتشه یه تمیزکاری کنی🧹🗑️


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

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

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

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

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

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

‏برای مدیریت این نوع خطاها، می‌توانید از بلوک try-catch استفاده کنید. خطای خاصی که معمولاً برای این منظور استفاده می‌شود، UnauthorizedAccessException است.

‏مثال:
try
{
‏ // تلاش برای عملیات روی فایل (مثلاً خواندن یا نوشتن)
string filePath = "C:\\path\\to\\your\\file.txt";
File.WriteAllText(filePath, "This is some text.");
}
catch (UnauthorizedAccessException ex)
{
‏ // مدیریت خطای عدم دسترسی
‏ Console.WriteLine($"خطا: دسترسی به فایل مجاز نیست. جزئیات: {ex.Message}");
}
catch (Exception ex)
{
‏ // مدیریت سایر خطاهای احتمالی
‏ Console.WriteLine($"خطای عمومی رخ داد: {ex.Message}");
}

‏این رویکرد به شما امکان می‌دهد تا به طور موثر خطاهای مربوط به مجوزهای دسترسی را تشخیص داده و پیام مناسبی را به کاربر نمایش دهید. 🔒📄

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#

🟢 سوال :

‏کدام یک از موارد زیر برای تعریف متغیرها و انواع داده‌ها در C# استفاده می‌شود؟

گزینه ۱:
‏تعریف کلاس

گزینه ۲:
‏تعریف متد Main

گزینه ۳:
‏تعریف نام فضا (namespace)

گزینه ۴:
‏بدنه متد یا کلاس

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

🟢 توضیح :

‏بدنه متد یا کلاس برای تعریف متغیرها و انواع داده‌ها استفاده می‌شود.

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

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

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

آدرس وبسایت:
https://Tutorial24.ir
‏Source Generatorها در C#، امکان تولید کد در زمان کامپایل را فراهم می‌کنند. ⚙️

‏با استفاده از این قابلیت، می‌توان وابستگی‌ها (Dependency Injection) را به صورت خودکار تولید کرد. این کار نیاز به نوشتن boilerplate code را کاهش می‌دهد و خوانایی کد را افزایش می‌دهد.

‏به این ترتیب، فریم‌ورک‌های DI می‌توانند بدون استفاده از reflection در زمان اجرا، وابستگی‌ها را مدیریت کنند که منجر به بهبود کارایی می‌شود. 🚀

https://t.me/csharp7
‏متد GetHashCode در C# برای تولید کد hash یک شیء استفاده میشه. 🧮

‏وقتی متد Equals رو override می‌کنید، حتماً GetHashCode رو هم override کنید. ⚠️

‏اگر دو شیء با هم برابر باشند (Equals == true)، کد hash اونها هم باید یکسان باشه. در غیر این صورت، کالکشن‌های hash-based مثل Dictionary درست کار نمی‌کنند. ⚙️

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
💡 نکته #SQL

🟣 موضوع : NATURAL JOIN

نکته :

‏وقتی با NATURAL JOIN کار می‌کنی، حتماً قبلش ساختار جداول رو چک کن. 👀


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

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

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

آدرس وبسایت:
https://Tutorial24.ir
‏کلاس‌های انتزاعی (Abstract Classes) و اینترفیس‌ها (Interfaces) هر دو در C# برای تعریف قراردادها و دستیابی به انتزاع استفاده می‌شوند، اما تفاوت‌های کلیدی دارند.

‏کلاس انتزاعی:
‏- می‌تواند شامل متدهای انتزاعی (بدون پیاده‌سازی) و متدهای غیرانتزاعی (با پیاده‌سازی) باشد.
‏- می‌تواند دارای اعضای کلاس مانند فیلدها، سازنده‌ها (constructors) و توابع destructor باشد.
‏- یک کلاس فقط می‌تواند از یک کلاس انتزاعی ارث‌بری کند (قانون ارث‌بری تکی).
‏- برای تعریف یک "چیزی" است که می‌تواند حالت (state) داشته باشد و رفتار مشترک را به اشتراک بگذارد.

‏اینترفیس:
‏- فقط می‌تواند شامل متدهای انتزاعی، خصوصیات (properties) و رویدادها (events) باشد. از C# 8 به بعد، امکان افزودن متدهای با پیاده‌سازی پیش‌فرض نیز فراهم شده است.
‏- نمی‌تواند دارای فیلد باشد.
‏- یک کلاس می‌تواند از چندین اینترفیس پیاده‌سازی کند (ارث‌بری چندگانه).
‏- برای تعریف یک "قابلیت" یا "وظیفه" است که کلاس‌ها می‌توانند آن را پیاده‌سازی کنند.

‏مقایسه:
‏| ویژگی | کلاس انتزاعی | اینترفیس |
|---|---|---|
‏| پیاده‌سازی متد | دارد (هم انتزاعی و هم غیرانتزاعی) | ندارد (به جز متدهای با پیاده‌سازی پیش‌فرض از C# 8) |
‏| فیلد | دارد | ندارد |
‏| سازنده | دارد | ندارد |
‏| ارث‌بری | تکی (از یک کلاس) | چندگانه (از چندین اینترفیس) |
‏| هدف اصلی | اشتراک‌گذاری کد و حالت بین کلاس‌های مرتبط | تعریف قرارداد و قابلیت |

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

‏// مثال کلاس انتزاعی
abstract class Shape
{
‏ public abstract double Area(); // متد انتزاعی

‏ public void Display() // متد غیرانتزاعی
{
Console.WriteLine("This is a shape.");
}
}

class Circle : Shape
{
public double Radius { get; set; }

public Circle(double radius)
{
Radius = radius;
}

public override double Area()
{
return Math.PI * Radius * Radius;
}
}


‏// مثال اینترفیس
interface IDrawable
{
‏ void Draw(); // متد انتزاعی
}

interface IResizable
{
‏ void Resize(double factor); // متد انتزاعی
}

class Square : IDrawable, IResizable
{
public double Side { get; private set; }

public Square(double side)
{
Side = side;
}

public void Draw()
{
Console.WriteLine($"Drawing a square with side {Side}");
}

public void Resize(double factor)
{
Side *= factor;
Console.WriteLine($"Resized square to side {Side}");
}
}

💡


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

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

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
🧵 پایتون و تردها! یه کم کار سنگین داری و میخوای سریع‌تر انجام بشه؟ تردینگ (Threading) به کمکت میاد!

‏اما یه مشکل هست: ممکنه چند تا ترد بخوان همزمان به یه منبع دسترسی داشته باشن 🤯. اینجاست که Lockها وارد میشن!

‏Lock مثل یه کلید🔑 میمونه. هر تردی که بخواد از منبع استفاده کنه، اول باید کلید رو بگیره. وقتی کارش تموم شد، کلید رو پس میده تا ترد بعدی بتونه استفاده کنه.

‏با Lockها خیالت راحته که داده‌هات خراب نمیشن! 😎

https://t.me/python7ir
‏در ASP.NET Core دو نوع فیلتر برای مدیریت نتیجه درخواست‌ها وجود دارد: `IResultFilter` و endpoint filter.

‏`IResultFilter` بعد از اجرای action و قبل از serialize شدن نتیجه، اجرا می‌شود و امکان تغییر نتیجه نهایی را فراهم می‌کند.

‏endpoint filter اما قبل از binding مدل و اجرای action، و همچنین بعد از action و قبل از ارسال پاسخ اجرا می‌شود. endpoint filter کنترل بیشتری روی lifecycle درخواست دارد. ⚙️

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

https://t.me/csharp7
‍‍
‏MemoryPool<T> در C# برای مدیریت کارآمد حافظه استفاده میشه. 💾 دیگه نیازی نیست نگران تخصیص و آزادسازی مکرر حافظه باشی.

‏میتونی MemoryPool رو به صورت پیش‌فرض استفاده کنی یا Pool خودت رو بسازی! 🧑‍💻 با ساخت custom pool، کنترل بیشتری روی نحوه تخصیص و استفاده از حافظه داری و می‌تونی اون رو دقیقاً مطابق نیازهای برنامه‌ات تنظیم کنی. ⚙️

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

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

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
‏در ASP.NET Core، برای اجرای وظایف پس‌زمینه در طول عمر برنامه، می‌توان از کلاس IHostedService استفاده کرد. این سرویس‌ها به طور خودکار توسط فریم‌ورک مدیریت و اجرا می‌شوند.

‏برای پیاده‌سازی، یک کلاس ایجاد کنید که رابط IHostedService را پیاده‌سازی کند. متد ExecuteAsync وظیفه اصلی سرویس پس‌زمینه شما را در خود جای می‌دهد.

public class MyBackgroundService : IHostedService, IDisposable
{
private Timer _timer;

public Task StartAsync(CancellationToken cancellationToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}

private void DoWork(object state)
{
‏ // منطق اجرای وظیفه پس‌زمینه شما اینجا قرار می‌گیرد
Console.WriteLine("Working...");
}

public Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}

public void Dispose()
{
_timer?.Dispose();
}
}




https://t.me/csharp7
‏در C#، یک متد می‌تواند انواع مختلفی از مقادیر را بازگرداند. این امکان از طریق استفاده از انواع داده‌های مختلف در تعریف متد و نیز استفاده از ساختارهای پیچیده‌تر مانند Tuple یا ValueTuple فراهم می‌شود.

‏بازگشت چندین مقدار با استفاده از Tuple:

Tuple به شما اجازه می‌دهد تا مجموعه‌ای از مقادیر با انواع داده‌های مختلف را در قالب یک شیء واحد بازگردانید.

(int count, string message, bool success) ProcessData()
{
‏ // فرض کنید این متد داده‌ها را پردازش می‌کند
int processedCount = 10;
‏ string resultMessage = "عملیات با موفقیت انجام شد.";
bool operationStatus = true;

return (processedCount, resultMessage, operationStatus);
}

‏// نحوه فراخوانی و استفاده از مقادیر بازگشتی:
var result = ProcessData();
‏Console.WriteLine($"تعداد: {result.count}");
‏Console.WriteLine($"پیام: {result.message}");
‏Console.WriteLine($"وضعیت: {result.success}");


‏در این مثال، متد ProcessData یک Tuple بازمی‌گرداند که شامل یک عدد صحیح، یک رشته و یک بولین است. شما می‌توانید به هر یک از این مقادیر با استفاده از نام‌گذاری (مانند result.count) یا ایندکس (مانند result.Item1) دسترسی پیدا کنید. استفاده از نام‌گذاری خوانایی کد را افزایش می‌دهد.

‏بازگشت یک شیء سفارشی:

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

public class ProcessResult
{
public int Count { get; set; }
public string Message { get; set; }
public bool Success { get; set; }
}

ProcessResult ProcessDataWithClass()
{
‏ // فرض کنید این متد داده‌ها را پردازش می‌کند
return new ProcessResult
{
Count = 15,
‏ Message = "پردازش کامل شد.",
Success = true
};
}

‏// نحوه فراخوانی:
var classResult = ProcessDataWithClass();
‏Console.WriteLine($"تعداد: {classResult.Count}");
‏Console.WriteLine($"پیام: {classResult.Message}");
‏Console.WriteLine($"وضعیت: {classResult.Success}");


‏این روش، علاوه بر سازماندهی بهتر کد، امکان اضافه کردن متدها یا ویژگی‌های بیشتر به شیء بازگشتی را در آینده فراهم می‌کند. 🚀💡

https://t.me/csharp7
‏در C#، برای پیمایش کلیدها و مقادیر یک دیکشنری (Dictionary<TKey, TValue>) با استفاده از حلقه foreach، می‌توانید به روش‌های مختلفی عمل کنید.

‏برای دسترسی به جفت‌های کلید-مقدار (Key-Value Pairs):
Dictionary<string, int> ages = new Dictionary<string, int>()
{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35}
};

foreach (KeyValuePair<string, int> pair in ages)
{
Console.WriteLine($"Name: {pair.Key}, Age: {pair.Value}");
}

‏این روش به شما امکان می‌دهد همزمان به کلید و مقدار هر آیتم در دیکشنری دسترسی داشته باشید.

‏برای دسترسی فقط به کلیدها:
foreach (string key in ages.Keys)
{
Console.WriteLine($"Key: {key}");
}


‏برای دسترسی فقط به مقادیر:
foreach (int value in ages.Values)
{
Console.WriteLine($"Value: {value}");
}

‏این قابلیت‌ها انعطاف‌پذیری بالایی در کار با داده‌های دیکشنری فراهم می‌کنند. 💡📚

https://t.me/csharp7