- کلاسی که قابل ارث بری نیست.
- معمولا برای گسترش کلاس های پیش فرض استفاده می شود مثلا کلاس استرینگ C# را گسترش دهیم.(Extension Methods)
- نیاز به وهله سازی ندارد.
- تعریف یک کلاس که اجزای آن در بیش از یک فایل قرار دارند است. به عبارت دیگر، یک کلاس ممکن است در چندین فایل مختلف تعریف شود و هر بخش از آن در یک فایل جداگانه قرار داشته باشد. این قابلیت برای کلاسهای بزرگ و پیچیده مفید است که تعداد اعضا و روشهای فعالیتشان زیاد است.
// MyClass1.cs
public partial class MyClass {
// تعریف بخش اول کلاس
}
// MyClass2.cs
public partial class MyClass {
// تعریف بخش دوم کلاس
}
// MyClass3.cs
public partial class MyClass {
// تعریف بخش سوم کلاس
}
قابلیت نمونه سازی از این کلاس وجود ندارد و فقط برای ارث بری است
آخرین کلاس در زمان ارث بری است و دیگر از این کلاس نمیشه ارث بری کرد.
به معنا انعکاس برای استخراج متا از آبجکت و کلاس استفاده می شود.
به شی نمونه سازی شده از کلاس میگویند.
به معنای انتزاع و چیز هایی را که کاربر نیاز داره فقط ببینه راننده میدونه گاز بده ماشین حرکت میکنه ولی نیاز نیست بدونه موتور چجوری کار میکنه.
متدی که در کلاس پدر استفاده شده و در فرزند میخواد بازنویسی بشود از این مفهوم استفاده می شود
همون مفهوم پلی مورفیسم یعنی تعریف چند متد با تعداد پارامترهای مختلف
- اینترفیس از خاصیت multiple inhirtance پشتیبانی میکنه ولی abstract نه.
- abstract میتوان یک کلاس را تعرف و پیاده سازی کرد ولی اینترفیس فقط میشه تعریف کرد.
- abstract را برای مواقعی که حتما لازم نیست متدها پیاده سازی شوداستفاده میشود
- interface به هیچ عنوان کانستراکتور ندارد
- هیچکدام قابلیت نمونه سازی ندارند.
- در params از پشت ورودی یک تابع بیاید این ورودی تعداد نامشخص ورودی میگیرد
- در out لازم نیست مقدار اولیه بگیرد ولی ref حتما باید مقدار اولیه بگیرد
زمانی که یک متد برای کلاسی که به آن دسترسی ندارم بخواهیم تعریف کنیم مثلا متدی برای کلاس string در خود هسته #C بخواهیم تعریف کنیم.
اگر یک کلاسی سطح دسترسی آن مشخص نشود پیش فرض internal قرار میگرد.
دسترسی کامل در کلاس فعلی و همه کلاس ها و همه پروژه که اسمبلی شده از این کلاس
فقط در کلاس جاری قابل دسترسی است و لا غیر
در همه کلاس های پروژه فعلی استفاده می شود و نه در پروژه های اسمبلی
این کانستراکتور برای ساخت شیهای پیش فرض مورد استفاده قرار میگیرد و به صورت خودکار فراخوانی میشود.
در این نوع کانستراکتور، پارامترهایی به آن ارسال میشوند که برای مقداردهی اولیه خصوصیات شیها استفاده میشوند.
این نوع کانستراکتور برای ایجاد متدهای استاتیک به کار میرود و هنگام بارگذاری یک کلاس، فقط یک بار فراخوانی میشود.
throw اطلاعات بیشتری بر میگرداند
در افزودن کلید نیاز ندارد
در افزودن کلید نیاز دارد.
برای کار با مجموعه دادههای در حافظه مانند لیستها، آرایهها و ... استفاده میشود.
برای لیست هایی که از سمت دیتابیس می آید و برای Linq کاربرد دارد. و ممکن است در لحظه تغییر کند. با استفاده از Expression Tree اجازه میدهد تا پرس و جوهای LINQ به صورت تاخیری (Deferred Execution) اجرا شوند،
بنابراین، اگر تنها نیاز به پیمایش دادهها در حافظه دارید، از IEnumerable استفاده کنید؛ اما اگر نیاز به اعمال پرس و جوی پیچیدهتری در دادهها دارید که باید به صورت تاخیری اجرا شود، از IQueryable استفاده کنید.
یک پوینتر است که میتوان رفرنس یک یا چند متد را توی خودش نگه داره پارامتری که بهDelegate پاس داده میشه خودش یک متد است. از جمله پیاده سازی الگوهای طراحی Observer و Callback استفاده میشود.
// Delegate simple Example
internal class Program
{
public delegate int MyDelegate(params int[] numbers);
public static int Add(params int[] numbers) => numbers[0] + numbers[1];
public static int Square(params int[] numbers) => numbers[0] * numbers[0];
public static void Main(string[] args)
{
MyDelegate myDelegate = Add;
var add_res = myDelegate(5, 3); // Output: 8
myDelegate = Square;
var square_res = myDelegate(5); // Output: 25
}
}
دلیگیتی که متد را داخلی خودش میسازه و نیاز به فراخوانی متد ثالث ندارد.
میتواند چندین متد را داخل آن رفرنس دهی کرد.
به صورت مجموعه ای از delegate ها عمل می کند که به تابعی object را متصل کرده و یک مشتری برای کاربر سازی می دهد. هنگامی که یک event در سیستم رخ داد، delegate های متصل به آن فراخوانی می شوند و بدین ترتیب کار کاربر ادامه پیدا می کند. به طور خلاصه، delegate به عنوان یک پوینتر به تابع عمل می کند، در حالی که event به عنوان یک پوینتر به بازخورد استفاده می شود.
اشاره به نمونه ای که داخل کلاس داریم
const در زمان تعریف باید مقدار دهی شود readonly میتوان در کانستکراتور مقدار دهی شود
var متغیر کامپایل تایم تعریف میکند dynamic متغیر ران تایم تعریف میکند
وقتی یک مقدار value type را داخل refrence type میریزیم باکسینگ رخ میدهد و زمانی که تایپ کستینگ میکنم unboxing رخ میدهد
برای الحاق رشته ها فضای جدید میگیرد ولی در string builder فضای جدید نمیگیرد.
- As برای مشخص کردن تایپ یک مقدار
- Is برای چک کردن تایپ یک مقدار
Semaphore برای کنترل دسترسی به منابع محدود در برنامههای همزمان استفاده میشود. در داتنت، از کلاسهای Semaphore و SemaphoreSlim استفاده میکنیم، و در زبانهای دیگر مانند Python از threading.Semaphore استفاده میشود.
using System;
using System.Threading;
class Program
{
static Semaphore semaphore = new Semaphore(2, 2); // حداکثر دو thread اجازه دسترسی دارند.
static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(Worker).Start(i);
}
}
static void Worker(object id)
{
Console.WriteLine($"Thread {id} منتظر است");
semaphore.WaitOne(); // منتظر دسترسی به منبع میماند.
Console.WriteLine($"Thread {id} وارد شد");
Thread.Sleep(2000); // شبیهسازی کار با منبع
Console.WriteLine($"Thread {id} خارج شد");
semaphore.Release(); // دسترسی به منبع آزاد میشود.
}
}
در این مثال، حداکثر دو thread میتوانند بهطور همزمان به بخش محافظت شده دسترسی داشته باشند. بقیه thread ها باید منتظر بمانند تا یکی از thread های فعال منبع را آزاد کند.