#C یک زبان شی گرا ، ایمن و Managed است که توسط .Net framework برای تولید یک زبان میانی کامپایل می شود.
متغیرها یا متدهای public در هر نقطه از برنامه قابل دسترسی است. متغیرها یا متدهای static در سطح برنامه بدون ایجاد نمونه ای از کلاس در دسترس هستند و void یک modifier نوع است که بیان می کند که متد یا متغیر هیچ مقداری بر نمی گرداند.
یک سازنده یک متد هم نام با نام کلاس و بدون مقدار بازگشتی است. هر زمان که شی ای از یک کلاس ایجاد شود ، سازنده آن به طور خودکار فراخوانی می شود و فیلدهای کلاس را مقداردهی اولیه میکند یا منطقی را پیاده سازی میکند. در صورتی که هیچ سازنده ای در کلاس تعریف نشده باشد #C از یک سازنده پیش فرض که پارامتر ورودی ندارد استفاده می کند. در یک کلاس می توان چندین سازنده با overload های مختلف داشت.
public class Person
{
private string last;
private string first;
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
// Remaining implementation of Person class.
}
این سوال از من پرسیده شده است  + 
method overloading مکانیزمی برای ایجاد چندین متد با یک نام و امضای منحصر به فرد در یک کلاس است. با تغییر تعداد، تغییر ترتیب و تغییر نوع ورودی ها میتوان overload های مختلفی از متدهای هم نام ایجاد کرد.
بله، میتوان چندین بلوک catch متوالی ایجاد کرد که هر کدام در جواب به exception خاصی اجرا شوند. مثلا میتوان دو بلوک catch داشت که اولی در زمان ایجاد خطای تقسیم بر صفر اجرا گردد (DevideByZeroException) و دیگری در زمانی که سعی داریم در یک آرایه یا لیست به یک ایندکس خارج از محدوده دسترسی پیدا کنیم (IndexOutOfRangeException).
آرایه مجموعه ای از نمونه های مربوط به هم از نوع value و یا reference است. سه نوع آرایه توسط C#پشتیبانی می شود: آرایه تک بعدی: شامل یک ردیف است. همچنین به عنوان آرایه برداری معروف است. آرایه چند بعدی: مستطیلی است و شامل سطرها و ستون ها است. آرایه ناهموار(Jagged): شامل سطرها و ستونها است اما شکل نامنظمی دارد.
آرایه ای که دارای عناصری از نوع آرایه باشد ، آرایه Jagged نامیده می شود. عناصر می توانند در ابعاد و اندازه های مختلف باشند. ما همچنین می توانیم آرایه Jagged را به عنوان آرایه ای از آرایه ها بنامیم.
ArrayList یک آرایه پویا است. در زمان اجرا می توانید عناصر را از ArrayList اضافه و حذف کنید. در ArrayList ، عناصر به طور خودکار مرتب نمی شوند.
در یک آرایه ، ما می توانیم مواردی از نوع یکسان را داشته باشیم. اندازه آرایه همواره ثابت است. arraylist شبیه به یک آرایه است اما اندازه ثابتی ندارد.
Interface یک کلاس انتزاعی است که فقط متدهای انتزاعی عمومی دارد. این متدها فقط اعلان دارند نه تعریف. این متدهای انتزاعی باید در کلاسهای فرزند پیاده سازی شوند. یک از دلایل استفاده از Interface امکان پیاده سازی وراثت چندگانه است. یعنی میتوان از چند Interface به طور همزمان ارث بری کرد ولی در مقابل شما میتوانید فقط از یک کلاس ارث بری کنید.
Lock برای اطمینان از این مساله استفاده میشود که یک Thread در بخش حساس کد وارد نمی شود، در حالی که Therad دیگر در بخش بحرانی قرار دارد. اگر Therad دیگری سعی کند که وارد کد قفل شده شود، منتظر می ماند ، مسدود می شود، تا شیء آزاد شود.
به فرآیند تبدیل یک شی به آرایه ای از بایت ها جهت ارسال از طریق شبکه، سریال سازی می گویند و به فرایندی که در مقصد عمل عکس را انجام می دهد، یعنی تبدیل آرایه ای از بایت ها به شی، Deserialization می گویند.
موارد زیر modifier های دسترسی هستند که عموماً برای دسترسی استفاده می شوند: - public: اگر یک attribute یا متد را public تعریف کنید ، می توانید از هر جای کد پروژه به آن دسترسی داشته باشید. - private: به attribute یا متد تعریف شده خصوصی تنها می توان در داخل کلاس فعلی دسترسی داشت. - protected: اگر متد یا attribute را protected تعریف کنید ، می توانید از هر متدی در کلاسهای فرزند و هر متدی در همان کلاس به آن ها دسترسی داشته باشید. - internal: اگر یک ویژگی یا متدی را به عنوان internal تعریف کنید ، به کلاسهای موجود در assembly پروژه فعلی محدود می شود. - protected internal: اگر یک attribute یا متدی را به عنوان protected internal تعریف کنید ، دسترسی به کلاسهای موجود در assembly پروژه فعلی یا انواع مشتق شده از کلاس فعلی آن محدود می شود.
کلاس abstarct به غیر از متدهای abstract متدهای پیاده سازی شده نیز دارد ولی interface فقط شامل متدهای abstract میباشد. در interface همه متدها از نوع public هستند ولی در کلاس abstract میتوان متدهای private نیز داشت..
پارامترهای متد در overloading متفاوت ولی در overloading یکسان است. وراثت در overloading مورد نیاز نیست و در داخل یک کلاس overload های مختلف یک متد تعریف میشود ولی در overriding وراثت لازم است. یعنی کلاس فرزند میتواند متد تعریف شده در کلاس والد را override کند.
Delegate نوعی است که به متدهایی با پارامتر ها و نوع بازگشتی مشابه با اعلان خود رفرنس می دهد. یعنی هنگامی که یک Delegate را نمونه سازی می کنید، می توانید نمونه آن را با هر متد سازگاری مرتبط کنید. می توانید متد را از طریق نمونه delegate فراخوانی کنید. Delegates برای انتقال متدها به عنوان آرگومان به متدهای دیگر استفاده می شود. Event handlersها چیزی نیستند جز متدهایی که از طریق Delegate ها فراخوانی می شوند. شما یک متد سفارشی ایجاد میکنید و کلاسی مانند windows control میتواند زمانی که رویداد خاصی رخ میدهد، متد شما را فراخوانی کند. هر متدی از هر کلاس یا struct قابل دسترسی که با نوع Delegate مطابقت داشته باشد را می توان به آن اختصاص داد. این متد می تواند استاتیک باشد یا از طریق ایجاد نمونه قابل دسترسی باشد. مثال زیر روش اعلان یک Delegate و استفاده از آن را نشان می دهد:
public delegate void Del(string message);
// Create a method for a delegate.
public static void DelegateMethod1(string message)
{
Console.WriteLine(message);
}
// Create another method for a delegate.
public static void DelegateMethod2(string name)
{
Console.WriteLine("Hello"+name);
}
// Instantiate the delegate with method1.
Del handler = DelegateMethod1;
// Call the delegate.
handler("Hello World");
// Instantiate the delegate with method2.
Del handler = DelegateMethod2;
// Call the delegate.
handler("Ali");
Output:
Hello World
Hello Ali
این سوال از من پرسیده شده است  + 
یک آرگومان که به عنوان ref ارسال می شود باید قبل از انتقال به متد مقداردهی شود در حالی که پارامتر out قبل از انتقال به متد نیازی به مقداردهی اولیه ندارد.
در #C مدیریت حافظه به صورت خودکار توسط Garbage Collector انجام میگیرد، ولی با استفاده از بلوک کد using برنامه نویس میتواند به طور صریح کار تخصیص حافظه به اشیا و آزادسازی آن را انجام دهد. دستور using در واقع مرزی را برای استفاده از یک شی ایجاد میکند که خارج از آن آن شی به طور خودکار از بین می رود. برای فهم بهتر موضوع به مثال زیر دقت کنید. در این مثال شیئی به نام mnObj ایجاد شده است که در داخل بلوک کد using مورد استفاده قرار میگیرد. زمانی که به انتهای بلوک رسیدیم این شی از بین میرود و خارج از بلوک قابل استفاده نیست.
.......
using (MyManagedClass mnObj = new MyManagedClass())
{
......
mnObj.Use(); //use the mnObj object
......
} //The compiler will dispose the mnObj object now
......
این سوال از من پرسیده شده است  + 
ما نمی توانیم از "this" در یک متد استاتیک استفاده کنیم زیرا فقط می توانیم از متغیرها/متدهای استاتیک در یک متد استاتیک استفاده کنیم.
متغیرهای const فقط در زمان کامپایل اعلان و مقداردهی اولیه میشوند و بعد از آن مقدارشان قابل تغییر نیست. در حالی که متغیرهای read-only در زمان اجرا مقدار میگیرند.
مقدار متغییرهای Value Type در حافظه Stackذخیره میشود، مثل متغییرهای نوع int، ولی متغییر Reference Type حاوی یک اشاره گر یا آدرس به یک مکان حافظه در حافظه Heap است که مقدار متغییر در آن قرار گرفته است.
کلاس sealed کلاسی است که امکان وراثت از آن وجود ندارد. یعنی فرزندی ندارد.
System.String تغییر ناپذیر است. وقتی مقدار یک متغیر رشته ای از نوع System.String را تغییر می دهیم ، یک حافظه جدید به مقدار جدید اختصاص داده می شود و تخصیص حافظه قبلی آزاد می شود. System.StringBuilder به گونه ای طراحی شده است که دارای یک رشته متغیر باشد که در آن می توان عملیات مختلفی را بدون تخصیص مکان جداگانه حافظه برای رشته اصلاح شده انجام داد.
با استفاده از روش Clone ، یک آرایه جدید شامل همه عناصر موجود در آرایه اصلی ایجاد می کنیم. اما با استفاده از روش CopyTo، همه عناصر آرایه موجود در آرایه موجود دیگری کپی می شوند. هر دو روش یک کپی سطحی را انجام می دهند.
جنریک ها کلاس های قابل استفاده مجددی هستند که نوع داده ای فیلدها، پارمترها و یا مقدار برگشتی متدها آنها در زمان استفاده تعیین میشود. بنابراین آنها از تولید کد اضافه جلوگیری میکنند. یک کلاس جنریک به وسیله براکت های زاویه ای <> تعریف شود. برای مثال List یک کلاس جنریک است که می تواند هر نوع داده ای را بگیرد.
ArgumentException, ArgumentNullException, ArgumentOutOfRangeException, ArithmeticException, DivideByZeroException ,OverflowException, IndexOutOfRangeException, InvalidCastException, InvalidOperationException, IOEndOfStreamException , NullReferenceException, OutOfMemoryException, StackOverflowException.
کلاس را به صورت public تعریف کنید ولی متد را sealed تعریف کنید تا از override شدنش جلوگیری شود.
struct ها از نوع value-type هستند ولی کلاس ها از نوع reference-type هستند. struct ها روی حافظه Stack ذخیره می شوندکه باعث سربار اضافی میشود اما بازیابی سریعتر می شود. struct ها را نمی توان به ارث برد.
عملگر "is" برای بررسی یکی بودن نوع یک شی با یک نوع مشخص استفاده می شود و نتیجه را به صورت Boolean برمی گرداند. در حالی که عملگر "as" برای تبدیل نوع یک شیء به یک نوع یا کلاس دیگر استفاده می شود.
میتوانیم از طریق سازنده(Constructor) کلاس پدر به فیلدهای خصوصی آن دسترسی پیدا کرده و به آنها مقدار دهیم. به مثال زیر توجه کنید. در این مثال دو کلاس با نام های A و B وجود دارند که کلاس B فرزند کلاس A است و هر یک دارای یک فیلد خصوصی هستند. برای دسترسی به فیلد private_field_A از طریق سازنده کلاس B ، از دستور base با یک پارامتر ورودی استفاده میکنیم. با این روش ابتدا سازنده کلاس پدر فراخوانی شده و فیلد private_field_A مقدار value1 را می گیرد، سپس مقدار value2 به private_field_B تخصیص می یابد.
public class A
{
private int private_field_A;
public A(int value)
{
private_field= value;
}
}
public class B:A
{
private int private_field_B;
public B(int value1,int value2):base(value1)
{
private_field_B=value2;
}
}
این سوال از من پرسیده شده است  + 
برای اینکه بتوانیم متدی از کلاس پدر را در کلاس فرزند بازنویسی (override) کنیم ابتدا باید متد پایه در کلاس پدر virtual و یا abstract باشد. سپس باید جهت بازنویسی آن متد در کلاس فرزند در کنار نام متد از کلمه override استفاده کنیم. در زمان بازنویسی متدها در نظر داشته باشید که: - ساختار متد بازنویسی شده مانند تعداد پارامترها و نوع مقدار بازگشتی باید با متد پایه یکسان باشد. - شما نمیتوانید Access Modifier متد پایه را در متد بازنویسی شده تغییر دهید. مثلا نمیتوانید آن را از public به private تغییر دهید. - شما نمیتوانید یک متد ایستا (static) را بازنویسی کنید. به مثال زیر توجه کنید:
abstract class Shape
{
public abstract int GetArea();
}
class Square : Shape
{
private int _side;
public Square(int n) => _side = n;
// GetArea method is required to avoid a compile-time error.
public override int GetArea() => _side * _side;
static void Main()
{
var sq = new Square(12);
Console.WriteLine($"Area of the square = {sq.GetArea()}");
}
}
// Output: Area of the square = 144}
این سوال از من پرسیده شده است  + 
در سی شارپ از فضاهای نام برای مرتب کردن و سازماندهی منطقی کلاس ها، structها، interface ها، enumها و delegateها استفاده می شود. فضاهای نام در سی شارپ می توانند تودرتو باشند. این بدان معناست که یک فضای نام می تواند شامل فضاهای نام دیگری نیز باشد.
زمانی که بخواهیم تنها یک نمونه از یک کلاس ایجاد شود، از این Design Pattern استفاده میکنیم. هر تلاشی که برای ساختن نمونه های جدید انجام شود به سادگی به نمونه قبلی رفرنس داده میشود.
public sealed class SingletonClass {
private SingletonClass() {}
private static SingletonClass instance = null;
public static SingletonClass Instance {
get {
if (instance == null) {
instance = new SingletonClass();
}
return instance;
}
}
}
این سوال از من پرسیده شده است  + 
فرایند تبدیل نوع یک مقدار از value-type (بر روی حافظه Stack) به reference-type (بر روی حافظه Heap ) را Boxing و عکس این عمل را Unboxing می نامند. مثال:
int a=42;
object b=a; // Boxing
int c=(int)b;// Unboxing
این سوال از من پرسیده شده است  + 
خطاها در #C عموما بر دو نوع اند: 1) Run-time Errors: انواع Exceptionها که در زمان اجرای برنامه رخ میدهند و اجرای برنامه را متوقف میکنند، مانند خطای تقسیم بر صفر. 2) Compile-time Errors: مانند خطاهای نحوی (ُSyntax Errors)
سوالی هست که اینجا نمیبینیش و از نظر تو مهمه؟ خودت سوالی داری که دنبال جوابشی؟ جواب بهتری واسه یکی از سوالای بالا داری؟ پس واسمون بفرست.
چه تفاوتی بین public ، static ...
Net. چیست؟
مزایای استفاده از NET. چیست؟
تفاوت بین Reference Type و Val...
برو به همه سوالات
WPF چیست؟
انواع اسناد پشتیبانی شده توسط ...
فضای نام مورد نیاز برای کار با...
آیا درست است که بگوییم WPF جای...
برو به همه سوالات