اگر به دنبال شغلی در حوزهی توسعهی نرمافزار با استفاده از زبان سیشارپ (#C) هستید، آمادهسازی برای مصاحبههای فنی یکی از مراحل مهم در مسیر موفقیت شماست. مصاحبههای برنامهنویسی اغلب شامل سوالات متنوعی هستند که از مفاهیم پایهای تا مباحث پیشرفتهی سیشارپ را پوشش میدهند. در این مقاله، مجموعهای از 200 سوال مصاحبهی سیشارپ را گردآوری کردهایم که به شما کمک میکند تا با اطمینان بیشتری در مصاحبهها شرکت کنید.
1. کلاس (Class) و ساختار (Struct) در سیشارپ چه تفاوتی دارند؟
o پاسخ:
کلاسها نوع رفرنس (Reference Type) هستند و در هیپ (Heap) ذخیره میشوند، اما ساختارها نوع مقداری (Value Type) بوده و در استک (Stack) ذخیره میشوند. ساختارها نمیتوانند ارثبری کنند.
2. مفهوم Boxing و Unboxing چیست؟
o پاسخ:
تبدیل یک نوع مقداری (مثل int
) به نوع رفرنس (مثل object
) را Boxing میگویند. برعکس این فرایند (تبدیل object
به int
) Unboxing نام دارد.
3. کلمهی کلیدی using
در سیشارپ چه کاربردی دارد؟
o پاسخ:
برای مدیریت خودکار منابع غیرمستقیم (مثل فایلها یا دیتابیس) با پیادهسازی IDisposable
. بعد از اتمام بلوک using
، متد Dispose()
فراخوانی میشود.
4. تفاوت const
و readonly
چیست؟
o پاسخ:
const
در زمان کامپایل مقداردهی میشود و تغییرناپذیر است. readonly
در زمان اجرا (مثلاً در constructor) مقداردهی میشود.
5. متدهای Extension (Extension Methods) چیستند؟
o پاسخ:
متدهایی هستند که بدون تغییر کلاس اصلی، به آن اضافه میشوند. با this
در پارامتر اول تعریف میشوند (مثال: public static string ToCapital(this string text)
).
6. اینترفیس (Interface) و کلاس آبسترکت (Abstract Class) چه تفاوتی دارند؟
o پاسخ:
اینترفیس فقط قرارداد تعریف میکند (بدنۀ متد ندارد)، اما کلاس آبسترکت میتواند متدهای پیادهسازیشده داشته باشد. کلاسها میتوانند چندین اینترفیس را پیادهسازی کنند، اما فقط از یک کلاس آبسترکت ارثبری کنند.
7. پارامترهای ref
و out
چه تفاوتی دارند؟
o پاسخ:
هر دو برای ارسال رفرنس استفاده میشوند، اما پارامتر ref
باید قبل از فراخوانی مقداردهی شده باشد، در حالی که out
نیازی به مقدار اولیه ندارد و داخل متد باید مقداردهی شود.
8. تفاوت StringBuilder
و string
معمولی چیست؟
o پاسخ:
string
غیرقابل تغییر (Immutable) است، اما StringBuilder
قابل تغییر است و برای عملیاتهای زیاد روی رشتهها کارایی بهتری دارد.
9. سازندهی استاتیک (Static Constructor) چه زمانی اجرا میشود؟
o پاسخ:
قبل از اولین استفاده از کلاس یا ایجاد نمونهی جدید. فقط یک بار اجرا میشود.
10. مفهوم Overloading و Overriding چیست؟
o پاسخ:
Overloading: تعریف چند متد با نام یکسان اما پارامترهای متفاوت.
Overriding: تغییر پیادهسازی متد ارثبری شده از کلاس والد با استفاده از override
.
11. Delegate چیست؟
o پاسخ:
یک نوع دادهای که به متدها اشاره میکند. مثل Action
(برای متدهای بدون خروجی) و Func
(برای متدهای با خروجی).
12. Event در سیشارپ چگونه کار میکند؟
o پاسخ:
با استفاده از delegate
ها پیادهسازی میشود. برای انتشار (Publish) و اشتراک (Subscribe) رویدادها استفاده میشود.
13. LINQ چیست؟
o پاسخ:
زبان یکپارچه پرسوجو (Language Integrated Query) برای کار با دادهها (مثل آرایهها، دیتابیس) با سینتکس شبیه SQL.
14. Nullable Type در سیشارپ چیست؟
o پاسخ:
با اضافه کردن ?
به نوع دادهای مقداری (مثل int?
)، امکان مقدار null
دادن به آن ایجاد میشود.
15. تفاوت throw
و throw ex
در Catch Block چیست؟
o پاسخ:
throw
استک تریس اصلی را حفظ میکند، اما throw ex
استک تریس را از نقطهی فعلی ریست میکند.
16. کلاس Object
در سیشارپ چه متدهایی دارد؟
o پاسخ:
ToString()
، Equals()
، GetHashCode()
و GetType()
.
17. مفهوم Garbage Collection چیست؟
o پاسخ:
فرایند خودکار آزادسازی حافظهی اشیاء بیاستفاده در هیپ. توسط runtime مدیریت میشود.
18. کلاس استاتیک (Static Class) چه ویژگیهایی دارد؟
o پاسخ:
نمیتوان از آن نمونه ایجاد کرد. همهی اعضای آن باید استاتیک باشند.
19. Property در سیشارپ چیست؟
o پاسخ:
یک عضو کلاس که دسترسی به فیلدهای خصوصی را با get
و set
کنترل میکند.
20. کلمهی کلیدی virtual
چه کاربردی دارد؟
o پاسخ:
برای اجازهی Override کردن متد در کلاسهای مشتق شده استفاده میشود.
- async و await در سیشارپ چه کاری انجام میدهند؟
- پاسخ:
برای مدیریت عملیات ناهمزمان (Asynchronous) استفاده میشوند. await اجرا را تا تکمیل Task متوقف میکند، اما رشتهی اصلی (مثل UI) بلوک نمیشود.
- تفاوت Task.Run() و Task.Factory.StartNew() چیست؟
- پاسخ:
Task.Run() برای عملیاتهای سادهتر و پیشفرضها (مثل تنظیم TaskScheduler.Default) بهینه شده است. Task.Factory.StartNew() انعطافپذیرتر است و پارامترهای بیشتری میگیرد.
- الگوی طراحی Singleton را در سیشارپ پیادهسازی کنید.
public class Singleton
{
private static Singleton _instance;
private static readonly object _lock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
lock (_lock)
{
return _instance ??= new Singleton();
}
}
}
}
- مفهوم Yield در سیشارپ چیست؟
- پاسخ:
برای پیادهسازی Iteratorها با yield return استفاده میشود و حالت فعلی متد را حفظ میکند تا مقدار بعدی در فراخوانی بعدی برگردد.
- تفاوت IEnumerable و IQueryable چیست؟
- پاسخ:
IEnumerable برای کوئری روی دادههای درون حافظه (مثل لیست) استفاده میشود. IQueryable برای کوئری روی دادههای خارجی (مثل دیتابیس) و ترجمهی کوئری به SQL.
- متد Volatile.Read و Volatile.Write چه کاربردی دارند؟
- پاسخ:
برای جلوگیری از بهینهسازیهای کامپایلر یا CPU که ممکن است دسترسی به فیلدهای چندریختی (Multithreaded) را مختل کنند.
- چگونه از Reflection در سیشارپ استفاده میشود؟
- پاسخ:
برای بررسی و تغییر ساختارهای نوع (Type) در زمان اجرا. مثال:
Type type = typeof(MyClass);
var method = type.GetMethod("MethodName");
- Attribute در سیشارپ چیست؟ مثال بزنید.
- پاسخ:
کلاسهایی که متاداده به عناصر کد اضافه میکنند. مثال:
[Serializable]
public class MyClass { }
- الگوریتم Binary Search را پیادهسازی کنید.
public int BinarySearch(int[] arr, int target)
{
int left = 0, right = arr.Length - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
- مفهوم Lazy Loading چیست؟
- پاسخ:
تأخیر در بارگذاری یک شی تا زمانی که واقعاً مورد نیاز باشد. مثال: Lazy<T>.
- چگونه یک Exception سفارشی در سیشارپ ایجاد کنیم؟
- پاسخ:
با ارث بری از Exception:
public class MyException : Exception
{
public MyException(string message) : base(message) { }
}
- تفاوت Any() و Count() > 0 در LINQ چیست؟
- پاسخ:
Any() کارایی بهتری دارد چون با اولین عنصر موجود برمیگردد. Count() تمام عناصر را میشمارد.
- مفهوم Dependency Injection (DI) چیست؟
- پاسخ:
الگویی برای کاهش وابستگی بین کلاسها با تزریق اشیاء از خارج (مثل Constructor Injection).
- مزایای استفاده از Genericها در سیشارپ چیست؟
- پاسخ:
افزایش استفاده مجدد از کد، ایمنی نوع (Type Safety) و کاهش Boxing/Unboxing.
- متد SelectMany در LINQ چه کاری انجام میدهد؟
- پاسخ:
برای مسطحسازی (Flatten) مجموعههای تو در تو. مثال: تبدیل List<List<int>> به List<int>.
- الگوریتم Reverse String را بدون توابع آماده پیادهسازی کنید.
public string Reverse(string s)
{
char[] arr = s.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
- CancellationToken در سیشارپ چیست؟
- پاسخ:
برای لغو عملیاتهای ناهمزمان (Async) یا طولانی استفاده میشود.
- مفهوم Memory Management در سیشارپ چیست؟
- پاسخ:
مدیریت حافظه توسط Garbage Collector (GC) که اشیاء بیاستفاده در هیپ را پاک میکند.
- تفاوت First() و FirstOrDefault() در LINQ چیست؟
- پاسخ:
First() اگر نتیجهای نباشد، Exception میدهد. FirstOrDefault() مقدار پیشفرض (مثل null) برمیگرداند.
- چگونه از Parallel.ForEach استفاده میشود؟
- پاسخ:
برای موازیسازی پردازش آیتمهای یک مجموعه:
Parallel.ForEach(myList, item => Process(item));
- Middleware در ASP.NET Core چیست؟
- پاسخ:
قطعات کدی هستند که در خط لوله (Pipeline) درخواستهای HTTP شرکت میکنند. هر middleware میتواند درخواست را پردازش، تغییر، یا متوقف کند (مثلاً UseAuthentication(), UseRouting()).
- الگوی Repository چیست و چگونه پیادهسازی میشود؟
- پاسخ:
لایهای برای جداسازی دسترسی به دادهها از منطق کسب وکار. مثال:
public interface IRepository<T>
{
T GetById(int id);
void Add(T entity);
}
- تفاوت AddTransient، AddScoped، و AddSingleton در Dependency Injection چیست؟
- پاسخ:
- Transient: نمونهی جدید در هر فراخوانی.
- Scoped: یک نمونه در هر Scope (مثلاً یک درخواست وب).
- Singleton: یک نمونه برای کل برنامه.
- چگونه در ASP.NET Core یک Custom Middleware بنویسیم؟
public class CustomMiddleware
{
private readonly RequestDelegate _next;
public CustomMiddleware(RequestDelegate next) => _next = next;
public async Task InvokeAsync(HttpContext context)
{
// قبل از پردازش
await _next(context);
// بعد از پردازش
}
}
- IHttpClientFactory چه مزایایی دارد؟
- پاسخ:
مدیریت بهینهی اتصالات HTTP، جلوگیری از مشکل Socket Exhaustion، و پیکربندی مرکزی سرویسهای HTTP.
- مفهوم Liskov Substitution Principle (LSP) در SOLID چیست؟
- پاسخ:
زیرکلاسها باید بتوانند جایگزین کلاس والد شوند بدون تغییر رفتار صحیح برنامه. مثال: اگر کلاس B از کلاس A ارثبری میکند، باید تمام انتظارات A را برآورده کند.
- [FromBody] و [FromQuery] در ASP.NET Core چه تفاوتی دارند؟
- پاسخ:
- [FromBody]: داده از بدنهی درخواست (مثل JSON) خوانده میشود.
- [FromQuery]: داده از پارامترهای URL خوانده میشود.
- چگونه در EF Core یک رابطهی Many-to-Many پیادهسازی کنیم؟
- پاسخ:
با ایجاد یک کلاس واسطه (Join Entity):
public class StudentCourse
{
public int StudentId { get; set; }
public Student Student { get; set; }
public int CourseId { get; set; }
public Course Course { get; set; }
}
- مفهوم CQRS چیست؟
- پاسخ:
تفکیک عملیاتهای خواندن (Query) و نوشتن (Command) در سیستم. معمولاً با استفاده از مدلهای جداگانه برای هر عملیات.
- Attribute Routing در Web API چگونه کار میکند؟
- پاسخ:
با استفاده از Attributeهایی مثل [HttpGet], [Route("api/products")] روی کنترلرها و متدها:
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet("{id}")]
public IActionResult Get(int id) { ... }
}
- الگوی Unit of Work چیست؟
- پاسخ:
مدیریت تراکنشها و ذخیرهی تغییرات بهصورت Atomic. در EF Core، DbContext خودش یک Unit of Work پیادهسازی میکند.
- چگونه در سیشارپ یک Event با استاندارد .NET ایجاد کنیم؟
public class Publisher
{
public event EventHandler<MyEventArgs> MyEvent;
protected virtual void OnMyEvent(MyEventArgs e)
=> MyEvent?.Invoke(this, e);
}
- مفهوم Idempotency در APIها چیست؟
- پاسخ:
اطمینان از اینکه اجرای مکرر یک درخواست (مثلاً POST) اثر یکسانی با یک بار اجرا داشته باشد. برای جلوگیری از duplicate processing.
- تفاوت String و string در سیشارپ چیست؟
- پاسخ:
هیچ تفاوتی ندارد. string یک alias برای System.String است. استفاده از هر دو مجاز است.
- متد ConfigureServices و Configure در Startup کلاس ASP.NET Core چه کاری انجام میدهند؟
- پاسخ:
- ConfigureServices: ثبت سرویسها در DI Container.
- Configure: پیکربندی Middleware Pipeline.
- چگونه در EF Core یک Query Filter اعمال کنیم؟
- پاسخ:
با استفاده از HasQueryFilter در OnModelCreating:
modelBuilder.Entity<Blog>().HasQueryFilter(b => !b.IsDeleted);
- مفهوم JWT (JSON Web Token) چیست و چگونه اعتبارسنجی میشود؟
- پاسخ:
یک استاندارد برای ایجاد توکنهای امنیتی. در ASP.NET Core با JwtBearerAuthentication و اعتبارسنجی امضا (Signature) توکن.
- چرا از ValueTask به جای Task استفاده میشود؟
- پاسخ:
وقتی نتیجهی عملیات ناهمزمان از قبل محاسبه شده باشد (مثلاً cache شده)، ValueTask از اختصاص حافظهی اضافی (Allocation) جلوگیری میکند.
- ConfigureAwait(false) چه کاربردی دارد؟
- پاسخ:
برای جلوگیری از بازگشت به Context اصلی (مثلاً UI Thread) پس از اتمام await. بهبود کارایی در کتابخانه ها.
- الگوی Factory Method چیست؟ مثال بزنید.
- پاسخ:
یک اینترفیس برای ایجاد اشیاء، اما تصمیمگیری دربارهی نوع شیء به زیرکلاسها واگذار میشود.
public abstract class Creator
{
public abstract IProduct FactoryMethod();
}
- تفاوت Authentication و Authorization چیست؟
- پاسخ:
- Authentication: تأیید هویت کاربر (مثلاً با نام کاربری و رمزعبور).
- Authorization: تعیین سطح دسترسی کاربر به منابع پس از احراز هویت.
- چگونه در ASP.NET Core از Policy-Based Authorization استفاده کنیم؟
- پاسخ:
تعریف Policy در Startup.cs:
services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
});
سپس با [Authorize(Policy = "AdminOnly")] روی کنترلر/متد اعمال میشود.
- مفهوم CSRF و جلوگیری از آن در ASP.NET Core چیست؟
- پاسخ:
CSRF (Cross-Site Request Forgery): حملهی جعل درخواست بین سایتی.
جلوگیری: با استفاده از Anti-Forgery Token با [ValidateAntiForgeryToken].
- الگوی Producer-Consumer را در سی شارپ پیادهسازی کنید.
- پاسخ:
با استفاده از BlockingCollection:
var queue = new BlockingCollection<int>();
// Producer
Task.Run(() => { queue.Add(1); });
// Consumer
Task.Run(() => { foreach (var item in queue.GetConsumingEnumerable()) { ... } });
- چگونه در EF Core یک Transaction دستی ایجاد کنیم؟
using var transaction = context.Database.BeginTransaction();
try
{
// عملیاتها
context.SaveChanges();
transaction.Commit();
}
catch
{
transaction.Rollback();
}
- مزایای استفاده از IAsyncEnumerable<T> چیست؟
- پاسخ:
امکان بازگشت دادهها بهصورت ناهمزمان و جریاندار (Streaming) بدون بلوک کردن رشتهها. مناسب برای پردازش دادههای حجیم.
- مفهوم Circuit Breaker در میکروسرویسها چیست؟
- پاسخ:
الگویی برای جلوگیری از فراخوانی مکرر سرویسهای شکستخورده. پس از چند خطا، مدار باز میشود و فراخوانیها متوقف میشوند (مثل کتابخانهی Polly).
- چگونه در سی شارپ یک فایل را بهصورت ناهمزمان بخوانیم؟
using var reader = new StreamReader("file.txt");
string content = await reader.ReadToEndAsync();
- تفاوت IActionResult و ActionResult<T> در Web API چیست؟
- پاسخ:
- IActionResult: انعطافپذیرتر، امکان بازگشت انواع پاسخها (مثل Ok(), NotFound()).
- ActionResult<T>: ترکیبی از IActionResult و نوع مشخص بازگشتی (Type-Safe).
- الگوی Specification چیست و چگونه پیادهسازی میشود؟
- پاسخ:
برای کپسوله سازی منطق کوئریها. مثال:
public interface ISpecification<T>
{
Expression<Func<T, bool>> Criteria { get; }
}
- مفهوم Health Check در میکروسرویسها چیست؟
- پاسخ:
بررسی وضعیت سرویسها (مثل دسترسی به دیتابیس) با endpointهایی مثل /health. در ASP.NET Core با AddHealthChecks().
- چگونه در سی شارپ از Regular Expression برای اعتبارسنجی استفاده کنیم؟
var regex = new Regex(@"^\d+$");
bool isValid = regex.IsMatch("123"); // true
- مزایای استفاده از gRPC در مقابل REST چیست؟
- پاسخ:
- عملکرد بهتر با پروتکل باینری و HTTP/2.
- پشتیبانی از Streaming (دوطرفه).
- قراردادهای دقیق با Protobuf.
- مفهوم Sharding در دیتابیس چیست و چگونه پیادهسازی میشود؟
- پاسخ:
تقسیم دادهها به بخشهای مستقل (Shard) بر اساس کلید. در EF Core با کتابخانههایی مثل ShardingCore.
- چگونه در ASP.NET Core یک Custom Model Binder ایجاد کنیم؟
- پاسخ:
پیاده سازی IModelBinder:
public class CustomBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext context)
{
// پردازش داده
context.Result = ModelBindingResult.Success(value);
return Task.CompletedTask;
}
}
- مفهوم Shadow Properties در EF Core چیست؟
- پاسخ:
فیلدهایی که در مدل کلاس تعریف نمیشوند، اما در دیتابیس وجود دارند. با Property در OnModelCreating اضافه میشوند.
- الگوی Mediator چیست؟
- پاسخ:
کاهش وابستگی بین اجزا با استفاده از یک واسطه (Mediator) برای ارتباط. مثال: کتابخانهی MediatR.
- تفاوت AddDbContext و AddDbContextPool چیست؟
- پاسخ:
- AddDbContext: ایجاد نمونههای جدید از DbContext در هر درخواست.
- AddDbContextPool: استفاده از Pool برای استفاده مجدد از نمونههای DbContext و بهبود کارایی.
- چگونه در سی شارپ یک پروکسی داینامیک ایجاد کنیم؟
- پاسخ:
با استفاده از DispatchProxy:
public class MyProxy : DispatchProxy
{
protected override object Invoke(MethodInfo method, object[] args)
{
// اعمال منطق قبل/بعد از فراخوانی
return method.Invoke(target, args);
}
}
- مفهوم Backpressure در سیستمهای Reactive چیست؟
- پاسخ:
مکانیزمی برای کنترل سرعت تولید دادهها نسبت به مصرف. در Rx.NET با اپراتورهایی مثل Buffer یا Window مدیریت میشود.
- الگوی Clean Architecture چیست و چگونه در داتنت پیادهسازی میشود؟
- پاسخ:
معماری مبتنی بر لایههای مستقل (Core, Infrastructure, UI) با وابستگی معکوس (Dependency Inversion). Core شامل انتزاعها، و Infrastructure شامل پیادهسازیها (مثل EF Core) است.
- چگونه در EF Core از Bulk Insert برای درج حجم بالای داده استفاده کنیم؟
- پاسخ:
با کتابخانه های сторонهای مثل EFCore.BulkExtensions:
context.BulkInsert(entities);
- مفهوم Event Sourcing چیست؟
- پاسخ:
ذخیرهی تغییرات حالت سیستم بهصورت دنبالهای از رویدادها (Events) بهجای ذخیرهی مستقیم وضعیت فعلی. امکان بازسازی وضعیت از رویدادها وجود دارد.
- تفاوت بین Vertical و Horizontal Scaling در میکروسرویسها چیست؟
- پاسخ:
- Vertical: افزایش منابع سرور (مثل CPU/RAM).
- Horizontal: افزایش تعداد سرورها و توزیع بار.
- چگونه در سی شارپ یک gRPC سرویس ایجاد کنیم؟
- پاسخ:
تعریف قرارداد (Protobuf) و پیادهسازی سرویس:
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); }
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ...)
=> new HelloReply { Message = "Hello " + request.Name };
}
- مفهوم "Primitive Obsession" و راه حل آن چیست؟
- پاسخ:
استفادهی بیش از حد از انواع دادهای اولیه (مثل string برای ایمیل) بهجای ساخت نوعهای اختصاصی. راهحل: ایجاد کلاسهای Value Object (مثل Email).
- چگونه در ASP.NET Core از Rate Limiting استفاده کنیم؟
- پاسخ:
با Middlewareهایی مثل AspNetCoreRateLimit یا Microsoft.AspNetCore.RateLimiting:
services.AddRateLimiter(options =>
options.AddFixedWindowLimiter("fixed", opt => opt.PermitLimit = 10));
- مزایای استفاده از Source Generators در داتنت چیست؟
- پاسخ:
تولید کد در زمان کامپایل (مثلاً برای کاهش Boilerplate) بدون نیاز به Reflection در زمان اجرا. مثال: تولید کلاسهای DTO.
- الگوی Retry Pattern را با Polly پیادهسازی کنید.
var retryPolicy = Policy
.Handle<HttpRequestException>()
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(2));
await retryPolicy.ExecuteAsync(async () => await client.GetAsync(url));
- چگونه در Blazor Server از Circuit Handling استفاده کنیم؟
- پاسخ:
مدیریت اتصال کاربران با CircuitHandler:
public class MyCircuitHandler : CircuitHandler
{
public override async Task OnConnectionUpAsync(Circuit circuit, ...)
=> // منطق مدیریت اتصال
}
- مفهوم "Decorator Pattern" را با مثال سی شارپ توضیح دهید.
- پاسخ:
افزودن قابلیت به اشیاء به صورت دینامیک:
public interface IComponent { void Execute(); }
public class Decorator : IComponent
{
private readonly IComponent _component;
public Decorator(IComponent component) => _component = component;
public void Execute()
{
// افزودن منطق قبل
_component.Execute();
// افزودن منطق بعد
}
}
- تفاوت Scoped و Singleton در Dependency Injection هنگام استفاده از Background Service چیست؟
- پاسخ:
سرویسهای Scoped در Background Serviceها باید بهصورت CreateScope ساخته شوند، زیرا Background Serviceها خود Singleton هستند و نمیتوانند مستقیماً سرویسهای Scoped را تزریق کنند.
- چگونه در EF Core یک Query قابل استفاده مجدد (Reusable) بنویسیم؟
- پاسخ:
با استفاده از IQueryable و ترکیب کوئریها:
public static IQueryable<User> ActiveUsers(this IQueryable<User> query)
=> query.Where(u => u.IsActive);
- مفهوم "Data Mesh" چیست و چگونه با داتنت مرتبط است؟
- پاسخ:
معماری مبتنی بر مالکیت دامنهمحور (Domain-Owned) دادهها با تمرکز بر خودمختاری تیمها. در داتنت با میکروسرویسها و ابزارهایی مثل Apache Kafka پیادهسازی میشود.
- چگونه در سی شارپ از MemoryCache استفاده کنیم؟
services.AddMemoryCache();
public class MyService
{
private readonly IMemoryCache _cache;
public MyService(IMemoryCache cache) => _cache = cache;
public string GetData(string key)
=> _cache.GetOrCreate(key, entry => FetchData());
}
- مزایای استفاده از Record در سی شارپ چیست؟
- پاسخ:
- ایمنی برای دادههای تغییرناپذیر (Immutable).
- پیادهسازی خودکار Equals, GetHashCode, و ToString.
- سینتکس مختصر برای تعریف مدلها.
- چگونه در ASP.NET Core یک Custom Validator ایجاد کنیم؟
- پاسخ:
با ارثبری از ValidationAttribute:
public class MyValidator : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ...)
=> // منطق اعتبارسنجی
}
- مفهوم "Hexagonal Architecture" چیست؟
- پاسخ:
معماری با تمرکز بر جداسازی منطق کسب وکار از جزئیات فنی (مثل دیتابیس یا UI) با استفاده از پورت (Port) و آداپتور (Adapter).
- چگونه در سی شارپ از Span<T> و Memory<T> برای بهینهسازی استفاده کنیم؟
- پاسخ:
برای کار با دادههای حجیم بدون کپی کردن:
Span<int> span = array.AsSpan();
foreach (ref int item in span)
item *= 2;
- تفاوت IEnumerable، ICollection، و IList چیست؟
- پاسخ:
- IEnumerable: پایهترین رابط برای پیمایش.
- ICollection: افزودن قابلیتهای Count، Add، Remove.
- IList: دسترسی اندیسدار ([index]) و عملیات Insert/RemoveAt.
- تفاوت Unit Test و Integration Test چیست؟
- پاسخ:
- Unit Test: تست واحدهای کوچک کد (مثل متدها) بهصورت ایزوله.
- Integration Test: تست تعامل بین چندین جزء (مثل دیتابیس و سرویسها).
- چگونه در xUnit یک Mock ایجاد کنیم؟
- پاسخ:
با استفاده از کتابخانهای مثل Moq:
var mock = new Mock<IService>();
mock.Setup(m => m.GetData()).Returns("test");
- مفهوم TDD (Test-Driven Development) چیست؟
- پاسخ:
روش توسعهی نرمافزار که ابتدا تست نوشته میشود، سپس کد پیادهسازی میشود تا تست پاس شود.
- چگونه در Azure DevOps یک Pipeline برای CI/CD بسازیم؟
- پاسخ:
تعریف مراحل در azure-pipelines.yml شامل Build, Test, Publish, Deploy به سرویسهایی مثل Azure App Service.
- تفاوت [Fact] و [Theory] در xUnit چیست؟
- پاسخ:
- [Fact]: تست بدون پارامتر.
- [Theory]: تست با پارامترهای مختلف (با [InlineData]).
- مزایای استفاده از Docker با داتنت چیست؟
- پاسخ:
ایزولهسازی محیط اجرا، سهولت Deployment، و سازگاری بین پلتفرمها.
- چگونه Code Coverage در تستها اندازهگیری میشود؟
- پاسخ:
با ابزارهایی مثل Coverlet و گزارشگیری در فرمت OpenCover یا Cobertura.
- مفهوم Blue-Green Deployment چیست؟
- پاسخ:
روشی برای کاهش Downtime با انتشار نسخهی جدید در محیطی موازی (سبز) و تغییر مسیر ترافیک پس از تست.
- چگونه در سی شارپ از Logging با Serilog استفاده کنیم؟
services.AddSerilog(config =>
config.WriteTo.Console().WriteTo.File("log.txt"));
- تفاوت IWebHost و IHost در ASP.NET Core چیست؟
- پاسخ:
- IWebHost: مخصوص برنامههای وب.
- IHost: عمومیتر، برای برنامههای کنسولی یا Background Services.
- مفهوم Canary Release چیست؟
- پاسخ:
انتشار تدریجی نسخهی جدید برای درصد کمی از کاربران جهت بررسی پایداری.
- چگونه در EF Core Migrationها را بهصورت دستی مدیریت کنیم؟
- پاسخ:
- ایجاد: dotnet ef migrations add <Name>.
- اعمال: dotnet ef database update.
- مزایای استفاده از Application Insights در Azure چیست؟
- پاسخ:
مانیتورینگ عملکرد، تشخیص خطاها، و ردیابی درخواستها در برنامههای داتنت.
- چگونه در سی شارپ یک Background Service ایجاد کنیم؟
- پاسخ:
ارثبری از BackgroundService:
public class MyService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken token)
=> // منطق سرویس
}
- تفاوت Kestrel و IIS به عنوان سرور در ASP.NET Core چیست؟
- پاسخ:
- Kestrel: سرور کراسپلتفرم و سبک داتنت.
- IIS: سرور ویندوزی با امکانات پیشرفته (مثل SSL).
- مفهوم Feature Toggle (Feature Flag) چیست؟
- پاسخ:
فعال/غیرفعال کردن قابلیتها بدون تغییر کد، معمولاً با استفاده از تنظیمات یا سرویسهایی مثل Azure App Configuration.
- چگونه در برنامهی داتنت از Secret Manager استفاده کنیم؟
- پاسخ:
با دستور dotnet user-secrets set "Key" "Value" و دسترسی با Configuration["Key"].
- مفهوم Load Balancing در میکروسرویسها چیست؟
- پاسخ:
توزیع ترافیک بین چندین نمونه از سرویس برای بهبود کارایی و تحملپذیری خطا.
- چگونه در سی شارپ از الگوی Publisher-Subscriber استفاده کنیم؟
- پاسخ:
با کتابخانه هایی مثل MassTransit یا RabbitMQ.Client:
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare("queue");
- مزایای استفاده از Redis در معماری داتنت چیست؟
- پاسخ:
کشینگ سریع، پشتیبانی از دادههای ساختاریافته، و بهبود عملکرد برنامه های پرترافیک.
سوالات ۱۴۱ تا ۱۶۰ (پایگاه داده پیشرفته و بهینه سازی)
- مفهوم Index در دیتابیس چیست و چگونه کارایی را بهبود میبخشد؟
- پاسخ:
ساختاری برای افزایش سرعت جستجوها با کاهش نیاز به اسکن کامل جدول. مثلاً CREATE INDEX در SQL.
- چگونه در EF Core از Raw SQL استفاده کنیم؟
var result = context.Users.FromSqlRaw("SELECT * FROM Users").ToList();
- مفهوم Deadlock در دیتابیس چیست و چگونه جلوگیری میشود؟
- پاسخ:
بنبست زمانی که دو تراکنش منتظر یکدیگر هستند. جلوگیری با استفاده از Isolation Level مناسب و ترتیب دسترسی به منابع.
- تفاوت Eager Loading و Lazy Loading در EF Core چیست؟
- پاسخ:
- Eager Loading: بارگذاری مرتبط دادهها با Include().
- Lazy Loading: بارگذاری خودکار هنگام دسترسی به Navigation Property (نیاز به فعالسازی).
- مزایای استفاده از Stored Procedure در دیتابیس چیست؟
- پاسخ:
افزایش امنیت، کاهش ترافیک شبکه، و استفاده مجدد از منطق دیتابیس.
- چگونه Query Optimization را در EF Core انجام دهیم؟
- پاسخ:
- استفاده از AsNoTracking().
- جلوگیری از SELECT *.
- استفاده از Projection با Select().
- مفهوم Sharding در EF Core چیست؟
- پاسخ:
تقسیم دادهها به چندین دیتابیس بر اساس کلید (مثل شناسهی کاربر) برای مقیاسپذیری.
- چگونه در دیتابیس Replication را پیادهسازی کنیم؟
- پاسخ:
کپی دادهها بین سرورها برای دسترسیپذیری و تحملپذیری خطا. مثلاً در SQL Server با Always On Availability Groups.
- مفهوم ACID در تراکنشهای دیتابیس چیست؟
- پاسخ:
- Atomicity: تمام یا هیچ.
- Consistency: حفظ قوانین دیتابیس.
- Isolation: اجرای تراکنشها بهصورت مجزا.
- Durability: ماندگاری پس از Commit.
- چگونه در EF Core از دستورات Bulk Update/Delete استفاده کنیم؟
- پاسخ:
با ExecuteUpdateAsync() و ExecuteDeleteAsync() در EF Core 7+:
await context.Users.Where(u => u.IsActive).ExecuteDeleteAsync();
- مفهوم Connection Pooling در ADO.NET چیست؟
- پاسخ:
مدیریت اتصالات باز برای کاهش هزینهی ایجاد اتصال جدید. بهصورت خودکار توسط Providerها مدیریت میشود.
- چگونه در EF Core یک View را Map کنیم؟
- پاسخ:
با ToView() در OnModelCreating:
modelBuilder.Entity<UserView>().ToView("v_Users");
- مفهوم Temporal Tables در SQL Server چیست؟
- پاسخ:
ذخیرهی تاریخچهی تغییرات دادهها بهصورت خودکار. امکان Query روی دادههای تاریخی.
- چگونه در EF Core یک فیلت سراسری (Global Query Filter) اعمال کنیم؟
- پاسخ:
با HasQueryFilter() در OnModelCreating:
modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
- مزایای استفاده از In-Memory Database در تستها چیست؟
- پاسخ:
سرعت بالا، عدم نیاز به تنظیم دیتابیس واقعی، و ایزولهسازی تستها.
- مفهوم Database Migration در DevOps چیست؟
- پاسخ:
اعمال خودکار تغییرات اسکیمای دیتابیس با اسکریپتهای Migration در فرایند CI/CD.
- چگونه در EF Core از دستورات JOIN استفاده کنیم؟
- پاسخ:
با Include() برای Eager Loading یا LINQ Join:
var query = context.Users.Include(u => u.Posts);
- مفهوم Pessimistic Locking و Optimistic Locking چیست؟
- پاسخ:
- Pessimistic: قفل کردن رکورد حین ویرایش (مثل SELECT FOR UPDATE).
- Optimistic: بررسی تغییرات با استفاده از Version (مثل ConcurrencyCheck).
- چگونه در EF Core یک Index ایجاد کنیم؟
- پاسخ:
با HasIndex() در OnModelCreating:
modelBuilder.Entity<User>().HasIndex(u => u.Email).IsUnique();
- مفهوم Database Sharding در میکروسرویسها چیست؟
- پاسخ:
تقسیم دیتابیس به بخشهای مستقل بر اساس کلید (مثل Tenant ID) برای مقیاسپذیری.
سوالات ۱۶۱ تا ۱۸۰ (Blazor، MAUI، و تکنولوژیهای مدرن)
- تفاوت Blazor Server و Blazor WebAssembly چیست؟
- پاسخ:
- Blazor Server: منطق در سرور اجرا میشود، ارتباط با SignalR.
- Blazor WebAssembly: اجرا در مرورگر با WebAssembly.
- چگونه در Blazor از Dependency Injection استفاده کنیم؟
- پاسخ:
ثبت سرویسها در Program.cs و تزریق با [Inject]:
@inject IService MyService
- مفهوم WebAssembly و مزایای آن چیست؟
- پاسخ:
فرمت باینری برای اجرای کد در مرورگر با عملکرد نزدیک به Native. امکان اجرای برنامههای داتنت با Blazor WebAssembly.
- چگونه در MAUI از ویژگیهای پلتفرم خاص (Platform-Specific) استفاده کنیم؟
- پاسخ:
با استفاده از DependencyService یا Platform-Specific APIs:
#if ANDROID
// کد مخصوص اندروید
#endif
- مفهوم Hot Reload در MAUI چیست؟
- پاسخ:
امکان مشاهدهی تغییرات کد بدون نیاز به کامپایل مجدد برنامه در زمان توسعه.
- چگونه در Blazor با JavaScript Interop ارتباط برقرار کنیم؟
await JSRuntime.InvokeVoidAsync("jsFunction", parameter);
- مزایای استفاده از MAUI نسبت به Xamarin چیست؟
- پاسخ:
یکپارچگی بهتر با داتنت، پشتیبانی از Desktop، و بهبود Performance.
- چگونه در Blazor یک Component بسازیم؟
- پاسخ:
ایجاد یک فایل .razor:
<h3>My Component</h3>
@code {
[Parameter] public string Title { get; set; }
}
- مفهوم State Management در Blazor چیست؟
- پاسخ:
مدیریت حالت برنامه با ابزارهایی مثل CascadingValue, Fluxor, یا Blazor-State.
- چگونه در MAUI به دیتابیس لوکال دسترسی داشته باشیم؟
- پاسخ:
با استفاده از SQLite و کتابخانهای مثل sqlite-net-pcl:
var dbPath = Path.Combine(FileSystem.AppDataDirectory, "app.db");
var db = new SQLiteConnection(dbPath);
- تفاوت EditForm و Form معمولی در Blazor چیست؟
- پاسخ:
EditForm با DataAnnotationsValidator یکپارچه میشود و اعتبارسنجی خودکار را فراهم میکند.
- چگونه در MAUI از سنسورهای دستگاه استفاده کنیم؟
- پاسخ:
با Microsoft.Maui.Essentials:
var accelerometer = Accelerometer.Default;
accelerometer.ReadChanged += (s, e) => { ... };
- مفهوم RenderTree در Blazor چیست؟
- پاسخ:
ساختار درختی که Blazor برای رندرینگ کامپوننتها استفاده میکند. تغییرات با Diffing Algorithm بهروز میشوند.
- چگونه در Blazor از Authorization استفاده کنیم؟
- پاسخ:
با AuthorizeView یا [Authorize] روی کامپوننتها:
<AuthorizeView Roles="Admin">
<p>Only admins can see this.</p>
</AuthorizeView>
- مزایای استفاده از .NET MAUI نسبت به React Native چیست؟
- پاسخ:
استفاده از زبان سی شارپ، دسترسی مستقیم به APIهای پلتفرم، و یکپارچگی با اکوسیستم داتنت.
- چگونه در MAUI یک Custom Control ایجاد کنیم؟
- پاسخ:
ارث بری از View یا استفاده از ContentView:
public class MyControl : ContentView { ... }
- مفهوم Code-Behind در Blazor چیست؟
- پاسخ:
جداسازی منطق (C#) از مارآپ (HTML) با ایجاد فایل MyComponent.razor.cs و ارثبری از ComponentBase.
- چگونه در MAUI از Push Notifications استفاده کنیم؟
- پاسخ:
با سرویسهایی مثل Firebase Cloud Messaging (FCM) برای اندروید و APNs برای iOS.
- مفهوم Prerendering در Blazor چیست؟
- پاسخ:
رندر اولیهی صفحات در سرور برای بهبود SEO و تجربهی کاربری قبل از بارگذاری WebAssembly.
- چگونه در Blazor از SignalR استفاده کنیم؟
- پاسخ:
ثبت سرویس SignalR و استفاده از HubConnection:
csharp
Copy
services.AddSignalR();
var connection = new HubConnectionBuilder().WithUrl("/chatHub").Build();
سوالات ۱۸۱ تا ۲۰۰ (الگوریتمها، ساختار دادهها، و چالشهای کدنویسی و برنامه نویسی)
- الگوریتم QuickSort را پیادهسازی کنید.
public void QuickSort(int[] arr, int low, int high)
{
if (low < high)
{
int pi = Partition(arr, low, high);
QuickSort(arr, low, pi - 1);
QuickSort(arr, pi + 1, high);
}
}
private int Partition(int[] arr, int low, int high)
{
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++)
if (arr[j] <= pivot)
Swap(arr, ++i, j);
Swap(arr, i + 1, high);
return i + 1;
}
- یک تابع برای چک کردن Palindrome بنویسید.
public bool IsPalindrome(string s)
=> s.SequenceEqual(s.Reverse());
- مقدار nام فیبوناچی را محاسبه کنید.
public int Fibonacci(int n)
{
if (n <= 1) return n;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
- یک درخت دودویی (Binary Tree) را پیادهسازی کنید.
public class TreeNode
{
public int Val;
public TreeNode Left, Right;
public TreeNode(int val) => Val = val;
}
- الگوریتم BFS (جستجوی سطحی) را برای گراف پیادهسازی کنید.
public void BFS(Node start)
{
var queue = new Queue<Node>();
queue.Enqueue(start);
while (queue.Any())
{
var node = queue.Dequeue();
foreach (var neighbor in node.Neighbors)
if (!neighbor.Visited)
queue.Enqueue(neighbor);
}
}
- یک تابع برای Reverse کردن Linked List بنویسید.
public ListNode Reverse(ListNode head)
{
ListNode prev = null;
while (head != null)
{
var next = head.Next;
head.Next = prev;
prev = head;
head = next;
}
return prev;
}
- طولانیترین زیررشتهی بدون تکرار را پیدا کنید.
public int LongestSubstring(string s)
{
var set = new HashSet<char>();
int max = 0, left = 0;
for (int right = 0; right < s.Length; right++)
{
while (set.Contains(s[right]))
set.Remove(s[left++]);
set.Add(s[right]);
max = Math.Max(max, right - left + 1);
}
return max;
}
- مسئلهی برج هانوی را حل کنید.
public void TowerOfHanoi(int n, char from, char to, char aux)
{
if (n == 1)
Console.WriteLine($"Move disk 1 from {from} to {to}");
else
{
TowerOfHanoi(n - 1, from, aux, to);
Console.WriteLine($"Move disk {n} from {from} to {to}");
TowerOfHanoi(n - 1, aux, to, from);
}
}
- یک تابع برای Merge دو آرایهی مرتبشده بنویسید.
public int[] MergeSortedArrays(int[] a, int[] b)
{
int[] result = new int[a.Length + b.Length];
int i = 0, j = 0, k = 0;
while (i < a.Length && j < b.Length)
result[k++] = a[i] < b[j] ? a[i++] : b[j++];
while (i < a.Length) result[k++] = a[i++];
while (j < b.Length) result[k++] = b[j++];
return result;
}
- یک تابع برای چک کردن Valid Parentheses بنویسید.
public bool IsValid(string s)
{
var stack = new Stack<char>();
foreach (char c in s)
if (c == '(') stack.Push(')');
else if (c == '[') stack.Push(']');
else if (c == '{') stack.Push('}');
else if (stack.Count == 0 || stack.Pop() != c) return false;
return stack.Count == 0;
}
- الگوریتم DFS (جستجوی عمقی) را برای گراف پیادهسازی کنید.
public void DFS(Node node)
{
if (node == null) return;
node.Visited = true;
foreach (var neighbor in node.Neighbors)
if (!neighbor.Visited)
DFS(neighbor);
}
- یک تابع برای پیدا کردن Median دو آرایهی مرتبشده بنویسید.
public double FindMedianSortedArrays(int[] nums1, int[] nums2)
{
int[] merged = MergeSortedArrays(nums1, nums2);
int len = merged.Length;
return len % 2 == 0
? (merged[len / 2 - 1] + merged[len / 2]) / 2.0
: merged[len / 2];
}
- طولانیترین زیرآرایهی افزایشی را پیدا کنید.
public int LongestIncreasingSubarray(int[] nums)
{
int max = 1, current = 1;
for (int i = 1; i < nums.Length; i++)
{
current = nums[i] > nums[i - 1] ? current + 1 : 1;
max = Math.Max(max, current);
}
return max;
}
- یک تابع برای چک کردن Anagram بودن دو رشته بنویسید.
public bool IsAnagram(string s, string t)
=> s.Length == t.Length &&
s.OrderBy(c => c).SequenceEqual(t.OrderBy(c => c));
- مقدار Factorial یک عدد را محاسبه کنید.
public int Factorial(int n)
=> n <= 1 ? 1 : n * Factorial(n - 1);
- یک تابع برای چرخاندن آرایه به اندازهی k قدم بنویسید.
public void Rotate(int[] nums, int k)
{
k %= nums.Length;
Reverse(nums, 0, nums.Length - 1);
Reverse(nums, 0, k - 1);
Reverse(nums, k, nums.Length - 1);
}
private void Reverse(int[] nums, int start, int end)
{
while (start < end)
(nums[start], nums[end]) = (nums[end], nums[start++]);
}
- یک تابع برای پیدا کردن Largest Number در یک آرایه بنویسید.
public int FindLargest(int[] nums)
=> nums.Max();
- یک تابع برای محاسبهی توان (Power) بنویسید.
public double Power(double x, int n)
{
if (n == 0) return 1;
if (n < 0) return 1 / Power(x, -n);
return x * Power(x, n - 1);
}
- یک تابع برای تبدیل عدد به حروف (مثلاً ۱۲۳ به "یکصد و بیست و سه") بنویسید.
- پاسخ:
(پیادهسازی طولانی است، اما ایدهی کلی استفاده از آرایه های映射 اعداد به متن و بازگشت تقسیم کننده ها است.)
- یک الگوریتم برای پیدا کردن زیرآرایه با بیشترین جمع (Kadane's Algorithm) بنویسید.
public int MaxSubArray(int[] nums)
{
int max = nums[0], current = nums[0];
for (int i = 1; i < nums.Length; i++)
{
current = Math.Max(nums[i], current + nums[i]);
max = Math.Max(max, current);
}
return max;
}
تمام ۲۰۰ سوال به مصاحبه به پایان رسید. اگر سوالی داشتین بنده برای پاسخگویی در خدمتم.