| کانال توسعه‌دهندگان سی‌شارپ |
1.03K subscribers
19 photos
3 videos
21 links
⭕️ کانال توسعه‌دهندگان سی‌شارپ دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
🌀 معرفی switch expression‏ 🌀

🔸 توی نسخه سی‌شارپ هشت این switch expression ها معرفی شدن که باعث می‌شه دستورات سوییچ خودمون رو خوانا‌تر بکنیم. بریم یه مثال ببینیم از قبل و بعد از استفاده از این switch expression ها.

🔹 توی این مثال از حالت عادیمون استفاده می‌کنیم.

int number = 1;

string result = "";

switch (number)
{
case 1:
result = "One";
break;
case 2:
result = "Two";
break;
case 3:

default:
result = "Default case";
break;
}

🔸حالا بریم با switch expression بازنویسیش کنیم.

int number = 1;

string result = number switch
{
1 => "One",
2 => "Two",
_ => "Default case"
};

🔹 می‌بینید که چقد کدمون رو کوتاه‌تر و خوانا‌تر کرده.

#Tips

👤 MHReza

💎 Channel: @DevelopixCSharp
👍195🔥2
معرفی کتابخانه RazorSlices

این کتابخانه یک template سبک و سریع برای asp.net core minimal api ساخته شده، بدون نیاز به استفاده از MVC، بهینه شده برای رندر کردن HTML در Razor یا Blazor.

برای شروع:
1.کتابخانه را نصب کنید
$ dotnet add package RazorSlices

2.یک دایرکتوری به نام Slices توی پروژتون ایجاد کنید، و داخل اون یک فایل به نام ViewImports.cshtml_ با این محتوا ایجاد کنید:
@inherits RazorSliceHttpResult
@using System.Globalization;
@using Microsoft.AspNetCore.Razor;
@using Microsoft.AspNetCore.Http.HttpResults;
@tagHelperPrefix disable_tagHelpers:
@removeTagHelper *, Microsoft.AspNetCore.Mvc.Razor
3. یک cshtml.* دیگه داخل دایرکتوری Slices ایجاد کنید :

@inherits RazorSliceHttpResult<DateTime>
<p>
Hello from Razor Slices! The time is @Model
</p>

4.حالا به راحتی داخل minimal api اتون صفحات HTML رو رندر کنید:

app.MapGet("/hello", () => Results.Extensions.RazorSlice("/Slices/Hello.cshtml", DateTime.Now));

🧷درحال حاضر موارد زیر در این کتابخانه پشتیبانی نمیشند:
1.پشتیبانی از AOT
2.پشتیبانی از Hot Reload
3.پشتیبانی از Layout ها و Section ها

#asp #razor

👤 QWxp

💎 Channel: @DevelopixCSharp
👍9
توصیه می‌کنم این پلی‌لیست رو در یوتیوب حتماً دنبال کنید.
مطالب خوبی در مورد EF Core منتشر میکنه.

🔗 لینک

👤 MHReza

💎 Channel: @DevelopixCSharp
👍10
احتمالا شده که خواستید یه کدی رو تست کنید، ولی نمی‌خواید به خاطرش به پروژه ایجاد بکنید. ابزار CSharpRepl اینجا بدردتون می‌خوره.

این ابزار بهتون کمک می‌کنه کدتون رو توی محیط کامند لاین تست کنید. برای نصبش می‌تونید دستور
dotnet tool install -g csharprepl

رو داخل ترمینالتون وارد کنید.

با وارد کردن دستور csharprepl وارد محیط کامند لاین میشید و می‌تونید هر کدی رو بنویسید.

اگه بخواید پکیجی رو هم نصب کنید با این دستور می‌تونید اون رو نصب کنید، برای مثال دستور زیر رو ببینید:

#r "nuget: Newtonsoft.Json"


با این دستور پکیج Newtonsoft.Json براتون نصب می‌شه

برای اطلاعات بیشتر در مورد این ابزار می‌تونید به صفحه گیت‌هابش مراجعه کنید و بیشتر در موردش مطالعه کنید.

👤 MHReza

💎 Channel: @DevelopixCSharp
👍12🔥31
به‌زودی دات‌نت 8 منتشر میشه 🎉 با کلی قابلیت های جدید ( که بیشترشون قرار نیست به دردمون بخوره👌).
توی چند روز آینده قراره کنفرانس های متعددی توسط مایکروسافت در این رابطه برگذار بشه.

اولیش فردا هست، میتونید توی یوتوب از این لینک تماشا کنید.

👤 QWxp

💎 Channel: @DevelopixCSharp
👍123
دات نت 8 به طور رسمی منتشر شد
لینک دانلود:

https://dotnet.microsoft.com/en-us/download/dotnet/8.0

👤 QWxp

💎 Channel: @DevelopixCSharp
👍82🔥1
لایو دوم مربوط به انتشار دات نت که امشب ساعت هشت هست رو میتونید از لینک زیر تماشا کنید
https://www.youtube.com/watch?v=vU-iZcxbDUk


👤 QWxp

💎 Channel: @DevelopixCSharp
👍41
احتمالا شده که موقع کار با Minimal API ها نیاز شده که یه سرویسی رو اینجکت کنید و ازش استفاده کنید.

با اتریبیوت [FromServices] مانند کد بالا می‌تونید اون سرویس رو از DI container بگیرید و داخل کدتون استفاده کنید.

👤 MHReza

💎 Channel: @DevelopixCSharp
3👍3🔥2
توی Minimal API ها بعضی وقت‌ها پارامترهاتون زیاد میشه و خوانایی کدتون رو پایین‌تر میاره، می‌تونید مثل عکس بالا اون‌ها رو توی یک رکورد تعریف کنید و با اتریبیوت [AsParameters] از اون استفاده کنید.

👤 MHReza

💎 Channel: @DevelopixCSharp
👍142🔥2
Forwarded from | Codilo |
🍉 یلدای امسال رو کُدیلویی بگذرونید!

🍓 تا پایان روز جمعه با دعوت دو کاربر جدید به کدیلو، فایل های کدیلو رو رایگان دریافت کنید

🥝 یلدای خوبی داشته باشید (:

💎 @Codilo
👍4
Forwarded from Developix Support
🔴 شتابان هاست 🔴

🔰 تخفیف ویژه 12 درصدی برای
خرید انواع🔹هاست🔹سرور
در شتابان هاست به مناسبت فرا رسیدن عید نوروز 🥳:


https://shetabanhost.com/
🌟 کد تخفیف اختصاصی:
shetabanhost


🔗 https://shetabanhost.com/

🌐 پشتیبانی ۲۴ ساعته شتابان هاست👇👇

☎️ 024-91311031
💎 Channel: @shetabanhostcom
31👍24🔥13
This media is not supported in your browser
VIEW IN TELEGRAM
#VisualStudio #Debug #Tip

🏕 تا الان خیلی شده که بخوام یک حلقه رو دیباگ کنم و برای رسیدن به اون سناریو مورد نظر، لازم باشه دائما continue بزنم تا برسم به اون نقطه. ولی خب با این قابلیت Visual Studio می‌تونید به‌راحتی برای دیباگ کردن condition و action قرار بدید و طبعا کارتون خیلی راحت‌تر می‌شه.

👤 Mahdiyar

💎 Channel: @DevelopixCSharp
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍3🔥2
Forwarded from TakShow | تک شو
This media is not supported in your browser
VIEW IN TELEGRAM
دوره آموزشی DesignPattern in C#
برپایه دو کتاب مرجع انگلیسی
وضعیت دوره: درحال برگزاری
سطح دوره: مقدماتی تا پیشرفته
مشاهده دوره :https://tak-show.ir/ShowCourse/2
ببینید چقدر راحت میتوانید متخصص در حوزه برنامه نویسی شوید😉

با ما تک شو:)
#وب سایت آموزشی تک شو
1👍1
زامارین فرم هم آرشیو شد

👤 MHReza

💎 Channel: @DevelopixCSharp
👍7
اصل Dependency Inversion Principle (DIP) در سی‌شارپ و دات‌نت

‌اصل Dependency Inversion Principle (DIP) یکی از اصول مهم در طراحی نرم‌افزار است که در چارچوب SOLID قرار دارد. این اصل می‌گوید ماژول‌های سطح بالا نباید به ماژول‌های سطح پایین وابسته باشند، بلکه هر دو باید به یک رابط (آبستراکشن) وابسته باشند. این اصل باعث می‌شود کد انعطاف‌پذیرتر باشد و راحت‌تر بشود آن را تست کرد.

مثال بدون استفاده از اینترفیس

در این مثال، یک سرویس ثبت‌نام کاربر و ارسال پیام رو بدون استفاده از اینترفیس درست می‌کنیم که وابستگی مستقیم به کلاس‌های پیاده‌سازی دارد:

// Email sender class
public class EmailSender
{
public void SendEmail(string message)
{
// Logic to send email
Console.WriteLine($"Sending Email: {message}");
}
}

// User registration service class
public class UserRegistrationService
{
private readonly EmailSender _emailSender;

public UserRegistrationService()
{
_emailSender = new EmailSender();
}

public void RegisterUser(string username)
{
// Logic to register user
Console.WriteLine($"User {username} registered.");

// Sending welcome message
_emailSender.SendEmail("Welcome to our service!");
}
}

// Using the service
class Program
{
static void Main(string[] args)
{
UserRegistrationService registrationService = new UserRegistrationService();
registrationService.RegisterUser("JohnDoe");
}
}






در اینجا کلاس UserRegistrationService به‌طور مستقیم به کلاس EmailSender وابسته است و هر تغییری در کلاس EmailSender می‌تواند باعث تغییرات زیادی در کد شود که نگهداری و تست آن را سخت می‌کند.

استفاده از اینترفیس و تزریق وابستگی

حالا با استفاده از اینترفیس و تزریق وابستگی، سرویس ثبت‌نام کاربر و ارسال پیام رو درست می‌کنیم:

// Message sender interface
public interface IMessageSender
{
void SendMessage(string message);
}

// Implementation of the interface for email sending
public class EmailSender : IMessageSender
{
public void SendMessage(string message)
{
// Logic to send email
Console.WriteLine($"Sending Email: {message}");
}
}

// User registration service with dependency injection
public class UserRegistrationService
{
private readonly IMessageSender _messageSender;

public UserRegistrationService(IMessageSender messageSender)
{
_messageSender = messageSender;
}

public void RegisterUser(string username)
{
// Logic to register user
Console.WriteLine($"User {username} registered.");

// Sending welcome message
_messageSender.SendMessage("Welcome to our service!");
}
}

// Using the service
class Program
{
static void Main(string[] args)
{
IMessageSender messageSender = new EmailSender();
UserRegistrationService registrationService = new UserRegistrationService(messageSender);
registrationService.RegisterUser("JohnDoe");
}
}






در این پیاده‌سازی، کلاس UserRegistrationService به‌جای اینکه به یک کلاس خاص وابسته باشد، به یک اینترفیس به‌نام IMessageSender وابسته‌ است. این کار باعث می‌شود کد انعطاف‌پذیرتر باشد و راحت‌تر بتوانیم تغییرات را اعمال کنیم بدون این‌که نیاز به تغییرات زیادی در کد باشد. به‌این‌ترتیب هم تست‌پذیری کد بهتر و هم نگهداری‌ آن راحت‌تر می‌شود.

#تزریق_وابستگی

🔖 #CSharp, #سی_شارپ

👤 Morteza Nazari

💎 Channel: @DevelopixCSharp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73
تابع بازگشتی چیست؟
تابع بازگشتی یک تابع تو در تو هست که برای رسیدن به نتیجه مورد نظر همواره خودش رو صدا می‌زنه. برای مثال برای به دست آوردن فاکتوریل یک عدد می‌تونیم از تابع بازگشتی زیر استفاده کنیم:
int factorial(int x) {
if (x == 1)
return 1;
else
return x * factorial(x-1);
}



در این تابع هر عددی که وارد کنیم اونقدر این تابع تکرار می‌شه تا عدد به 1 برسه و در نهایت فاکتوریل عدد ورودی رو خروجی می‌ده.

🔖 #CSharp, #سی_شارپ

👤 Morteza Nazari

💎 Channel: @DevelopixCSharp
👍13
🌟 آشنایی با مفهوم lock در سی‌شارپ 🔒

در برنامه‌نویسی، به خصوص در محیط‌های چندنخی (multithreading)، مدیریت همزمانی (Concurrency) یکی از چالش‌های مهم است. برای جلوگیری از بروز مشکلات ناشی از دسترسی همزمان به منابع مشترک، از کلمه کلیدی lock در سی‌شارپ استفاده می‌شود.

📌 کاربرد lock:
- پیشگیری از شرایط رقابتی: زمانی که چند نخ (Thread) سعی می‌کنند به طور همزمان به یک منبع (مانند یک متغیر یا شیء) دسترسی پیدا کنند، ممکن است داده‌ها به درستی پردازش نشوند. lock به ما کمک می‌کند تا فقط یک نخ در یک زمان به یک بخش از کد دسترسی داشته باشد.
- حفظ یکپارچگی داده‌ها: با استفاده از `lock`، می‌توانیم اطمینان حاصل کنیم که تغییرات داده‌ها توسط یک نخ در حال پردازش، با نخ‌های دیگر تداخل نداشته باشد.

✍️ چگونه از lock استفاده کنیم؟

نمونه ساده‌ای از استفاده از lock در سی‌شارپ:

using System;
using System.Threading;

class Program
{
private static int counter = 0;
private static readonly object lockObject = new object();

static void Main()
{
Thread t1 = new Thread(IncrementCounter);
Thread t2 = new Thread(IncrementCounter);

t1.Start();
t2.Start();

t1.Join();
t2.Join();

Console.WriteLine("Final Counter Value: " + counter);
}

static void IncrementCounter()
{
for (int i = 0; i < 1000; i++)
{
lock (lockObject)
{
counter++;
}
}
}
}


📌 این کد چه کاری انجام می‌دهد؟
- دو نخ (t1 و t2) به طور همزمان سعی دارند مقدار متغیر counter را ۱۰۰۰ بار افزایش دهند.
- با استفاده از lock ، فقط یک نخ در هر زمان می‌تواند به کد داخل بلاک lock دسترسی داشته باشد، که به این ترتیب از شرایط رقابتی جلوگیری می‌کند.

📝 نکات مهم:
- از lock برای حفاظت از منابع مشترک استفاده کنید تا از بروز خطاها و مشکلات همزمانی جلوگیری کنید.
- به یاد داشته باشید که استفاده بی‌رویه از lock می‌تواند منجر به کاهش عملکرد برنامه شود؛ بنابراین فقط در مواقع ضروری از آن استفاده کنید.

مزایای lock:
- ساده و آسان: استفاده از lock بسیار ساده است و به راحتی می‌توان آن را در کد پیاده‌سازی کرد.
- محافظت از منابع مشترک: lock به شما کمک می‌کند تا از دسترسی همزمان به منابع جلوگیری کنید و از یکپارچگی داده‌ها اطمینان حاصل کنید.

🔖 #CSharp, #سی_شارپ

👤 ali reza

💎 Channel: @DevelopixCSharp
👍14
در پروژه‌های ASP.NET Core وقتی یک سرویس تعداد زیادی وابستگی دارد، خوانایی، تست‌پذیری و نگهداری کد سخت می‌شود.

ایده‌ی عملی امروز: به‌جای تزریق مستقیم چندین سرویس در یک کلاس، یک Facade یا Aggregate Service بسازید تا زنجیره‌ی وابستگی ساده، قابل تست و خواناتر شود. این رویکرد از Service Locator و constructor bloat جلوگیری می‌کند و مسئولیت‌ها را بهتر جدا می‌کند. 🧩

مثال واقعی: کلاس OrderService که به Inventory، Payment و Notification وابسته است. اول نسخهٔ «بد» با constructor پر از وابستگی‌ها:

<!-- escaped C# code for Telegram -->
public class OrderService
{
private readonly IInventoryService _inventory;
private readonly IPaymentService _payment;
private readonly INotificationService _notification;

public OrderService(IInventoryService inventory, IPaymentService payment, INotificationService notification)
{
_inventory = inventory;
_payment = payment;
_notification = notification;
}

public async Task<bool> PlaceOrderAsync(Order order)
{
if (!await _inventory.ReserveAsync(order)) return false;
var paid = await _payment.ChargeAsync(order);
if (!paid) { await _inventory.ReleaseAsync(order); return false; }
await _notification.SendAsync(order);
return true;
}
}


با الگوی Facade، مجموعهٔ عملیات مرتبط را در یک رابط قرار می‌دهیم تا OrderService ساده شود:

<!-- escaped C# code -->
public interface IOrderProcessor { Task<bool> ProcessAsync(Order order); }

public class OrderProcessor : IOrderProcessor
{
private readonly IInventoryService _inventory;
private readonly IPaymentService _payment;
private readonly INotificationService _notification;

public OrderProcessor(IInventoryService inventory, IPaymentService payment, INotificationService notification) { ... }

public async Task<bool> ProcessAsync(Order order)
{
// همان منطق ترکیبی اینجا قرار می‌گیرد
}
}

public class OrderService
{
private readonly IOrderProcessor _processor;
public OrderService(IOrderProcessor processor) { _processor = processor; }
public Task<bool> PlaceOrderAsync(Order order) => _processor.ProcessAsync(order);
}


نکات عملی:
• با Facade، تست واحد ساده‌تر می‌شود (فقط IOrderProcessor موک می‌شود). 🧪
• مسئولیت‌ها تمیز جدا می‌شوند و هر سرویس کوچک‌تر و تک‌وظیفه‌ای می‌ماند. ✂️
• از تزریق مستقیم تعداد زیادی سرویس در کنترلرها یا سرویس‌های سطح بالا خودداری کنید.

مراجع معتبر: مستندات Microsoft Dependency Injection و الگوهای طراحی در Refactoring.Guru برای جزئیات بیشتر. 📚

شروع به کوچک‌سازی زنجیره‌های تزریق در پروژه کنونی کنید و تغییرات را با تست‌های واحد همراه کنید — تاثیرش را سریع احساس خواهید کرد. 🚀

🔖 #CSharp #سی_شارپ #Facade #DependencyInjection #SOLID #C# #ASP_NET_Core

👤 Developix

💎 Channel: @DevelopixCSharp
2👍1
🔹 یک تکه کد زیر مربوط به CSharp است که روی رفتار closure و async/await در حلقه تاکید دارد.

خروجی نهایی اجرای متد Main چیست؟

(ترتیب و مقدار دقیق خطوطی که در Console چاپ می‌شوند را بنویسید.)

🔖 #CSharp #سی_شارپ

👤 Developix

💎 Channel: @DevelopixCSharp
1