| کانال توسعهدهندگان سیشارپ |
Open in Telegram
⭕️ کانال توسعهدهندگان سیشارپ دولوپیکس 💠 دولوپیکس | جامعه توسعهدهندگان ایرانی 💎 @Developix 🚀 Developix.ir 📌 پشتیبانی و تبلیغات: @DevelopixSupport
Show more1 008
Subscribers
No data24 hours
+27 days
-330 days
Loading data
Similar Channels
Tags Cloud
No data
Any problems? Please refresh the page or contact our support manager.
Incoming and Outgoing Mentions
---
---
---
---
---
---
Attracting Subscribers
October '26Oct '26
October '26
+74
in 0 channels
September '260
in 0 channels
Get PRO
August '260
in 0 channels
Get PRO
July '260
in 0 channels
Get PRO
June '260
in 0 channels
Get PRO
May '260
in 0 channels
Get PRO
April '260
in 0 channels
Get PRO
March '260
in 0 channels
Get PRO
February '260
in 0 channels
Get PRO
January '260
in 0 channels
Get PRO
December '250
in 0 channels
Get PRO
November '250
in 0 channels
Get PRO
October '250
in 0 channels
Get PRO
September '250
in 0 channels
Get PRO
August '250
in 0 channels
Get PRO
July '250
in 0 channels
Get PRO
June '250
in 0 channels
Get PRO
May '250
in 0 channels
Get PRO
April '250
in 0 channels
Get PRO
March '250
in 0 channels
Get PRO
February '250
in 0 channels
Get PRO
January '250
in 0 channels
Get PRO
December '240
in 0 channels
Get PRO
November '240
in 0 channels
Get PRO
October '240
in 0 channels
Get PRO
September '240
in 0 channels
Get PRO
August '24
+11
in 0 channels
Get PRO
July '24
+50
in 0 channels
Get PRO
June '24
+45
in 0 channels
Get PRO
May '24
+30
in 1 channels
Get PRO
April '24
+30
in 0 channels
Get PRO
March '24
+56
in 0 channels
Get PRO
February '24
+87
in 0 channels
Get PRO
January '24
+127
in 0 channels
Get PRO
December '23
+108
in 0 channels
Get PRO
November '23
+596
in 0 channels
| Date | Subscriber Growth | Mentions | Channels | |
| 28 October | 0 | |||
| 27 October | +1 | |||
| 26 October | +3 | |||
| 25 October | 0 | |||
| 24 October | +1 | |||
| 23 October | +1 | |||
| 22 October | 0 | |||
| 21 October | 0 | |||
| 20 October | 0 | |||
| 19 October | +1 | |||
| 18 October | 0 | |||
| 17 October | +1 | |||
| 16 October | 0 | |||
| 15 October | 0 | |||
| 14 October | 0 | |||
| 13 October | +1 | |||
| 12 October | 0 | |||
| 11 October | 0 | |||
| 10 October | 0 |
Channel Posts
این کد چی چاپ میکنه؟ چرا با اینکه کاربر رو از مجموعه حذف نکردیم، نتیجه میتونه خلاف انتظار باشه؟ کد رو چطور اصلاح میکنی که این مشکل پیش نیاد؟
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp
| 2 | 🛡️ قوانین اعتبارسنجی را از مدلها جدا کن
وقتی شرطهای ثبتنام بین سرویس و کنترلر پخش میشوند، تغییرشان دردسر دارد. کتابخانهٔ FluentValidation قوانین را در کلاسهای مستقل و قابل تست نگه میدارد؛ بدون شلوغکردن مدل با Attributeها.
🔹 قوانین آماده برای ایمیل، طول و محدودهٔ عددی
🔹 شرطهای سفارشی و اعتبارسنجی Async
🔹 پیام خطای قابل تنظیم برای هر قانون
نصب و یک نمونهٔ ساده:
dotnet add package FluentValidation
using FluentValidation;
var validator = new UserValidator();
var result = validator.Validate(new User("bad"));
Console.WriteLine(result.IsValid); // False
public record User(string Email);
public class UserValidator : AbstractValidator<User>
{
public UserValidator()
{
RuleFor(x => x.Email)
.NotEmpty().EmailAddress();
}
}
💡 برای قوانین Async از ValidateAsync استفاده کن.
مستندات رسمی
🚀 از قوانین یک فرم کوچک شروع کن؛ تستکردنشان هم سادهتر میشود.
🔖 #CSharp #سی_شارپ #CSharp #Validation #FluentValidation
👤 Developix
💎 Channel: @DevelopixCSharp | 239 |
| 3 | 🔥 پروژه: ملونلودر؛ ابزار مودینگ یونیتی
برای توسعهدهندگان سیشارپ که میخواهند سراغ مودنویسی بازیهای Unity بروند، MelonLoader پروژهای دیدنی است: یک Mod Loader با پشتیبانی از هر دو محیط Mono و IL2CPP.
نکتهٔ مهمش همین پشتیبانی دوگانه است؛ برای بررسی مودینگ، محدود به بازیهایی نیستی که از Mono استفاده میکنند. البته سازگاری با این دو محیط به معنی تضمین کارکرد در همهٔ بازیها نیست.
برای شروع، مستندات و کد پروژه را ببین؛ مسیر خوبی برای آشنایی با مودنویسی در Unity است.
⭐️ 19 stars this week
🔖 #CSharp #سی_شارپ #CSharp #Unity #MelonLoader
💎 @DevelopixCSharp | 256 |
| 4 |
سؤال سیشارپ (سطح متوسط رو به سخت)
در کد زیر، از async/await و Task.Run استفاده شده است. اجرای برنامه فقط روی یک Thread انجام میشود (مثلاً در یک کنسولاپ ساده بدون SynchronizationContext خاص).
خروجی نهایی این برنامه دقیقاً چه رشتهای است که در کنسول چاپ میشود؟
(جواب را دقیق و به ترتیب کاراکترها بنویسید، شامل خطوط جدید)
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp | 258 |
| 5 | 🔥 پروژه: نصبکننده ReShade HDR برای بازیها
اگر با گرافیک بازیها و رندرینگ سروکار داری، پروژه ReShade HDR Installer حسابی دیدنی است 🎮
این ابزار، نصب و پیکربندی ReShade با پروفایلهای HDR را برای بازیها خودکار میکند؛ از شناسایی مسیر بازی تا کپی فایلها و تنظیم پریستها.
برای ایده گرفتن درباره طراحی ابزارهای نصب، لانچرهای بازی یا مدیریت مودها در سیشارپ، کدش منبع الهام خوب و عملی است.
سورس این پروژه را اینجا میتوانی ببینی:
github.com/RankFTW/RHI
⭐️ 333 stars this week
🔖 #CSharp #سی_شارپ #سیشارپ #C# #_NET
💎 @DevelopixCSharp | 343 |
| 6 | تو سیشارپ وقتی توی حلقه رشته میسازی، حواست باشه StringBuilder رو فراموش نکنی.
روش اول هم کد رو بههم میریزه هم برای حجم دیتای زیاد خیلی کند و پرهزینهست، چون هر بار یه string جدید میسازه.
روش دوم با StringBuilder هم تمیزتره هم از نظر Performance و مصرف حافظه خیلی بهتر جواب میده؛ مخصوصاً وقتی با دیتابیس یا فایل لاگ سروکار داری و احتمال بزرگ شدن خروجی زیاده.
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp | 359 |
| 7 | این کد async رو چطور درستش میکنی؟
اینجا متد async ظاهراً درست نوشته شده، ولی یه ایراد مهم تو استفاده از Task توش هست که میتونه باعث Deadlock یا بلاک شدن بیخودی بشه. مشکل دقیقاً کجاست و چطور باید اصلاحش کنی؟
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp | 362 |
| 8 | 🔥 پروژه: Discord Chat Exporter برای لاگ دیسکورد
برای موقعهایی که لازم داری لاگ چتهای دیسکورد را نگه داری، پروژهٔ Discord Chat Exporter خیلی بهدرد بخور است 🔧
یک ابزار متنباز نوشتهشده با C# و .NET که چتها را از سرور، DM و گروهها گرفته و در قالبهای مختلف (مثلاً HTML یا JSON) روی دیسک ذخیره میکند؛ با فیلتر بر اساس کانال، بازهٔ زمانی و غیره.
برای آرشیو تیم، گزارش داخلی یا مهاجرت از دیسکورد عالی است. سورس و باینریها اینجاست:
لینک پروژه 🚀
⭐️ 52 stars this week
🔖 #CSharp #سی_شارپ #سیشارپ #ابزار #Discord
💎 @DevelopixCSharp | 353 |
| 9 | خروجی اجرای این کد چیست؟
در این مثال با یک سناریوی closure در LINQ و اجرای تنبل (Deferred Execution) روبهرو هستیم. دقت کنید که چه زمانی query ساخته میشود و چه زمانی مقدار multiplier تغییر میکند.
پاسخ را دقیقا مطابق خروجی کنسول بنویسید (شامل خطوط جداگانه).
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp | 428 |
| 10 | در کد زیر هدف این است که نتیجهٔ یک متد async روی Thread اصلی دریافت شود، اما پیادهسازی فعلی میتواند باعث Deadlock شود و UI را فریز کند.
سوال: در این کد چه چیزی از نظر نحوهٔ صدا زدن متد async اشتباه است و این الگو را چطور باید اصلاح کرد تا هم نتیجهٔ متد async گرفته شود و هم خطر Deadlock و فریز شدن UI برطرف شود؟
فقط بخشهای لازم را بازنویسی یا اصلاح کنید، نیازی به تغییر کامل ساختار کلاس نیست.
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp | 430 |
| 11 | 💠 نسخه جدید محیط توسعه Rider منتشر شده است
🔸 ارتقا از نسخه 2026.1.4 به 2026.2
🔖 #rider, #csharp, #release
💎 @DevelopixCSharp | 391 |
| 12 | در کد زیر، از LINQ و یک لیست مشترک استفاده شده است، اما به خاطر deferred execution و تغییر متغیر خارجی، رفتار نهایی کد غافلگیرکننده است و نتیجهای که در پایان چاپ میشود، چیزی نیست که توسعهدهنده انتظار داشته باشد.
سوال:
چه تغییری در این کد باید انجام شود تا کوئری LINQ نتیجهای پایدار و مستقل از تغییرات بعدی لیست numbers و مقدار threshold برگرداند و خروجی چاپشده مطابق وضعیت لحظه تعریف کوئری باشد؟
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp | 488 |
| 13 | در کد زیر یک event handler ناهمگام نوشته شده که روی یک دکمه صدا زده میشود:
public class DataLoader
{
public event EventHandler DataLoaded;
public async void Load()
{
await Task.Delay(1000);
throw new Exception("Something went wrong");
}
}
public class Program
{
public static void Main()
{
var loader = new DataLoader();
loader.DataLoaded += async (s, e) =>
{
await Task.Delay(500);
Console.WriteLine("Data loaded");
};
loader.Load();
Console.WriteLine("Finished");
Console.ReadLine();
}
}
در این پیادهسازی هم از async void و هم از event سنتی استفاده شده که باعث مشکل در مدیریت خطا و زمانبندی اجرا میشود.
سؤال: در این طراحی چه Anti Pattern مهمی وجود دارد و امضای متد/ایونتها را چگونه باید اصلاح کنید تا هم بتوانید خطاهای ناهمگام را مدیریت کنید و هم اجرای ناهمگام بهشکل قابل پیشبینی عمل کند؟
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp | 547 |
| 14 | 👩💻👨💻
در کد زیر به رفتار String Interning در C# و مقایسهی رفرنسها با ReferenceEquals توجه کنید.
خروجی این برنامه (سه خط روی Console) دقیقا چه خواهد بود؟
خروجی را بههمان شکل Console (با True/False و رشتهٔ نهایی) بنویسید.
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp | 535 |
| 15 | استفادهٔ تمیز از Dependency Injection در ASP.NET Core ⚙️
یکی از سادهترین ولی مهمترین نکتهها در ASP.NET Core این است که در DI همیشه با Interface کار کنیم، نه کلاسهای پیادهساز. همین تغییر کوچک، تستپذیری و انعطاف سیستم را چند برابر میکند. 💡
وقتی مستقیم به کلاس Concrete وابسته میشویم:
public class PaymentService
{
private readonly SqlOrderRepository _repository;
public PaymentService()
{
_repository = new SqlOrderRepository();
}
public void Pay(int orderId)
{
var order = _repository.Get(orderId);
// ...
}
}
اینجا:
• PaymentService به یک کلاس خاص قفل شده 🔒
• تعویض دیتابیس یا Mock کردن در Unit Test سخت و پرهزینه میشود.
حالت تمیزتر با Interface و DI Container:
public interface IOrderRepository
{
Order Get(int id);
}
public class SqlOrderRepository : IOrderRepository
{
public Order Get(int id)
{
// query DB
}
}
public class PaymentService
{
private readonly IOrderRepository _repository;
public PaymentService(IOrderRepository repository)
{
_repository = repository;
}
public void Pay(int orderId)
{
var order = _repository.Get(orderId);
// ...
}
}
ثبت در ASP.NET Core DI Container:
builder.Services.AddScoped<IOrderRepository, SqlOrderRepository>();
builder.Services.AddScoped<PaymentService>();
حالا PaymentService فقط قرارداد را میشناسد (IOrderRepository) و دیگر اهمیتی ندارد پشت صحنه Sql است، In-Memory است یا یک Web API دیگر. این یعنی loosely coupled بودن، مطابق اصل D از SOLID (Dependency Inversion). ✅
برای Unit Test هم میتوانیم خیلی راحت یک Fake/Mock تزریق کنیم:
public class FakeOrderRepository : IOrderRepository
{
public Order Get(int id)
{
return new Order { Id = id, Total = 100_000 };
}
}
var service = new PaymentService(new FakeOrderRepository());
این الگوی کوچک در کل لایههای پروژه (Application, Infrastructure, UI) کمک میکند وابستگیها را از بالا به پایین طراحی کنیم و معماریهایی مثل Clean Architecture را راحتتر پیاده کنیم.
برای مطالعهٔ بیشتر:
Microsoft Docs - Dependency injection in ASP.NET Core
از همین امروز در سرویسها و Controllerهای جدید فقط Interfaceها را تزریق کن و کمکم بقیه را هم به این الگو مهاجرت بده؛ نتیجهاش کد تمیزتر و تغییرپذیرتر است. 🚀
🔖 #CSharp #سی_شارپ #C# #ASP_NET_Core #Dependency_Injection #SOLID #Clean_Code
👤 Developix
💎 Channel: @DevelopixCSharp | 571 |
| 16 | اصل SRP در Controllerهای ASP.NET Core 🎯
یکی از سادهترین راهها برای تمیزتر شدن کد در ASP.NET Core این است که Controller را لاغر نگه داریم و Single Responsibility Principle (SRP) را جدی بگیریم.
SRP میگوید هر کلاس فقط یک دلیل برای تغییر داشته باشد. ولی در بسیاری از پروژهها، Controller هم درخواست را هندل میکند، هم Validation میکند، هم Business Logic دارد، هم با Database حرف میزند و هم Log میگیرد 😅
نتیجه؟
کدی که تستنشدنی، سختخوان و پر از Bugهای پنهان است.
نمونهٔ ضدالگو (Controller چاق) 🚫
public class OrdersController : ControllerBase
{
private readonly AppDbContext _db;
public OrdersController(AppDbContext db)
{
_db = db;
}
[HttpPost]
public async Task<IActionResult> Create(CreateOrderDto dto)
{
if (string.IsNullOrWhiteSpace(dto.CustomerName))
return BadRequest("CustomerName is required");
var order = new Order
{
CustomerName = dto.CustomerName,
TotalAmount = dto.TotalAmount,
CreatedAt = DateTime.UtcNow
};
if (order.TotalAmount <= 0)
return BadRequest("Invalid amount");
_db.Orders.Add(order);
await _db.SaveChangesAsync();
return Ok(order.Id);
}
}
این Controller هم Validation میکند، هم Domain Rule، هم Data Access؛ حداقل سه مسئولیت مختلف در یک کلاس 👎
بهبود با Service + SRP ✅
Controller فقط باید:
• ورودی/خروجی HTTP را مدیریت کند.
• درخواست را به یک Service بدهد.
• نتیجه را به Response تبدیل کند.
public interface IOrderService
{
Task<int> CreateAsync(CreateOrderDto dto);
}
public class OrderService : IOrderService
{
private readonly AppDbContext _db;
public OrderService(AppDbContext db)
{
_db = db;
}
public async Task<int> CreateAsync(CreateOrderDto dto)
{
if (string.IsNullOrWhiteSpace(dto.CustomerName))
throw new ArgumentException("CustomerName is required");
if (dto.TotalAmount <= 0)
throw new ArgumentException("Invalid amount");
var order = new Order
{
CustomerName = dto.CustomerName,
TotalAmount = dto.TotalAmount,
CreatedAt = DateTime.UtcNow
};
_db.Orders.Add(order);
await _db.SaveChangesAsync();
return order.Id;
}
}
و حالا Controller لاغرتر:
[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
private readonly IOrderService _orderService;
public OrdersController(IOrderService orderService)
{
_orderService = orderService;
}
[HttpPost]
public async Task<IActionResult> Create(CreateOrderDto dto)
{
try
{
var id = await _orderService.CreateAsync(dto);
return Ok(id);
}
catch (ArgumentException ex)
{
return BadRequest(ex.Message);
}
}
}
حالا:
• تست Unit روی IOrderService بدون WebHost و بدون HTTP کاملاً ساده است ✅
• Controller فقط یک مسئولیت دارد: تبدیل HTTP به فراخوانی Service و برعکس.
• وقتی Business Rule عوض شود، فقط Service را لمس میکنید، نه Controller و نه Routing.
برای مطالعهٔ بیشتر:
Microsoft Learn - Controllers
روی همین ایده در بقیهٔ Controllerها هم کار شود، ساختار پروژه تمیزتر، قابلتستتر و آمادهٔ رشد در سطح Enterprise میماند 🚀
🔖 #CSharp #سی_شارپ #C# #_NET #ASP_NET_Core #Clean_Code #SRP #Architecture
👤 Developix
💎 Channel: @DevelopixCSharp | 493 |
| 17 | کتابخونهٔ Polly یکی از مهمترین ابزارها برای ساختن سرویسهای رزیلینت تو داتنت هست 🚀
با Polly میتونی روی callهای I/O مثل HTTP، دیتابیس یا message broker بهسادگی policyهایی مثل Retry، Circuit Breaker، Timeout و Fallback اعمال کنی؛ بدون اینکه پر از try/catch تکراری بشه.
👍 موارد استفادهٔ روزمره:
- Retry خودکار روی خطاهای موقتی (مثل 5xx)
- قطع موقت callها به سرویس مشکلدار (Circuit Breaker)
- تعریف Timeout منطقی برای HttpClient
نمونهٔ استفاده در ASP.NET Core با HttpClient:
builder.Services.AddHttpClient("api")
.AddPolicyHandler(Policy
.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
.WaitAndRetryAsync(3, retry => TimeSpan.FromSeconds(2)));
این کار هم کد رو تمیزتر میکنه، هم رفتار خطاها قابل پیشبینی و تنظیمپذیر میشه، مخصوصاً تو microservices و سیستمهای توزیعشده 💡
لینکها:
GitHub
Docs
امتحانش کن روی HttpClient یا callهای حساس و کمکم policyهای خودت رو بساز 🌱
🔖 #CSharp #سی_شارپ #CSharp #Polly #_NET #Resilience #ASP_NET_Core
👤 Developix
💎 Channel: @DevelopixCSharp | 453 |
| 18 | ⚡ استفاده درست از ConfigureAwait(false) در C#
یکی از ریزهکاریهای مهم در کد async/await اینه که بدون نیاز، کانتکست سنکرونسازی (SynchronizationContext) رو نگه نداریم. این کار تو سرویسها و کتابخانهها باعث بهبود کارایی و جلوگیری از Deadlock میشه. 💡
تو اپهای غیر UI (مثل ASP.NET Core) توی لایههای داخلی معمولاً نیازی به برگردوندن execution به همون کانتکست اولیه نیست؛ پس میشه از ConfigureAwait(false) استفاده کرد.
public async Task<UserDto> GetUserAsync(int id)
{
var entity = await _dbContext.Users
.AsNoTracking()
.FirstOrDefaultAsync(u => u.Id == id)
.ConfigureAwait(false);
if (entity is null)
return null;
return new UserDto
{
Id = entity.Id,
Name = entity.Name
};
}
✅ نکتهها:
• در UI (WPF/WinForms/Maui) تو کدی که بعد از await به UI دسترسی داره، از ConfigureAwait(false) استفاده نشه.
• در لایههای زیرین (Repository، Service، Client ها) استفاده از ConfigureAwait(false) معمولاً انتخاب خوبیه.
برای مطالعه بیشتر:
Microsoft Docs - Asynchronous programming
🔖 #CSharp #سی_شارپ #CSharp #ConfigureAwait #AsyncAwait #BestPractice #Performance #_NET
👤 Developix
💎 Channel: @DevelopixCSharp | 404 |
| 19 | ویراک کلود | تجربهی ابری بدون محدودیت ☁️🚀
🎁 ۲۰٪ شارژ هدیه روی اولین واریزی
مزیتهایی که واقعاً فرق میسازن:
⚡️ پهنای باند 980 مگ
🌐با IP مازاد
⏱️ راهاندازی فوری
💳 پرداخت ساعتی
🛡 پشتیبانی ۲۴/۷
💬 هر سوالی داشتی، تیم ما کنارتـه
✅ مناسب استارتاپها، تیمهای فنی، تا سازمانهای بزرگ
همین الان شروع کن و با حداکثر منابع، سریعتر رشد کن 👇🏻
📞 تماس سریع: 02191555530
🔗 https://virakcloud.com | 343 |
| 20 | در نمونهکد بالا در نسخهی اشتباه، بهجای استفاده از LINQ و عملگرهای آماده برای حذف عناصر تکراری، بهصورت دستی روی لیست حلقه زده شده و برای هر آیتم یک Any() جداگانه روی result صدا زده شده است؛ این کار در سناریوهایی که تعداد رکوردها زیاد است، باعث پیچیدگی زمانی O(n²)، افزایش فشار روی GC و کاهش کارایی میشود. در نسخهی اصلاحشده با استفاده از GroupBy و انتخاب آخرین آیتم هر گروه (براساس Timestamp)، هم کد خواناتر شده و هم فقط یک بار روی مجموعه اصلی پیمایش انجام میشود که در سناریوهای پردازش لاگ یا Events حجیم، مصرف CPU را بهطور محسوسی کاهش میدهد.
کدام رویکرد را برای سناریوهای Real-World با حجم داده بالا منطقیتر میدانید و چرا در Collections بزرگ، پرهیز از حلقههای تو در تو (Nested) تا این حد اهمیت دارد؟
🔖 #CSharp #سی_شارپ
👤 Developix
💎 Channel: @DevelopixCSharp | 662 |
