سوالات مصاحبه سی شارپ
سوالات مصاحبه سی شارپ، این عنوان مقالهای هست که امروز میخوام براتون منتشر کنم. در واقع یکی از بهترین و بدرد بخورترین مقالههایی که تا الان منتشر شده. سوالات مصاحبه سی شارپ در واقع نمونه سوالهایی هستن که تو اکثر مصاحبهها از برنامه نویسهای حوزه دات نت پرسیده می شه، بنابراین تصمیم گرفتم یکی از مقالاتی که از سایت CsharpCorner انتخاب کردم تحت عنوان 50 نمونه سوال و جواب سی شارپ رو براتون ترجمه کنم. امیدوارم که مفید باشه.
50 نمونه سوال و جواب در مصاحبههای استخدامی برنامه نویس سی شارپ
1. سی شارپ چیه ؟
سی شارپ یک زبان برنامه نویسی شی گراییه که در سال 2000 توسط کمپانی مایکروسافت به منظور ساخت نرم افزارها در بسترهای مختلفی مثل ویندوز، وب و موبایل ساخته شد. از نطر نحوی شبیه به زبان C++ است. سی شارپ از ویژگی های برنامه نویسی شی گرایی مدرن مثل Abstraction ، ncapsulation، olymorphism و Inheritance پشتیبانی میکنه.
2. منظور از آبجکت در زبان سی شارپ چیه ؟
گفتیم که سی شارپ یک زبان برنامه نویسیه شی گراییه. کلاسها، پایهی سی شارپ محسوب میشن. یک کلاس یک الگو هست که مشخص میکنه ساختار داده به چه شکل باشه و داده ها چطوری ذخیره، مدیریت و منتقل بشن. خود کلاس شامل فیلدها، پراپرتیها و متدها و دیگر اعضاست. از اونجا که کلاسها به عنوان یک مفهوم هستن، آبجکتها کاملا واقعی هستن. آبجکتها توسط نمونه سازی از کلاسها ایجاد میشن. در واقع یک کلاس نوع یک شی رو تعریف میکنه. آبجکتها دادههای واقعی رو درون خودشون (حافظههای کامپیوتر ) نگه داری میکنن.
هر چیزی که در دنیای واقعی شامل یه سری ویژگیها و رفتارها باشه میتونه یک آبجکت در نظر گرفته بشه. به آبجکتها، نمونه یا Instance هم گفته میشه چون در حقیقت آبجکتها نمونههای ساخته شده از هر کلاس هستن. برای مثال ما نیاز داریم که یه برنامهای بنویسیم که با یک ماشین سر و کار داره، خب نیاز داریم که یک کلاس داشته باشیم به اسم مثلا Car. این کلاس شامل چهار مشخصه یا Property تحت عناوین مدل، نوع، رنگ و سایز هست. این مشخصهها اعضای یک کلاس هستن. کلاس Car میتونه شامل اعضای دیگهای هم باشه، مثلا هر ماشین میتونه حرکت کنه یا متوقف بشه که هر کدوم از اینها در قالب یک متد و یا رفتار قابل پیاده سازی هستن.
3. منظور از Managed و Unmanaged کد چیه ؟
Managed Code ها کد هایین که توسط دات نت فریمورک و یا یکی از زبانهای برنامه نویسی پشتیبانی شده مثل C#،VB.NET و یا F# ایجاد شدن. منیج کدها مستقیما توسط کامپایلر CLR کامپابل میشن و عملیات چرخه حیات اونها مثل نمونه سازی، تخصیص حافظه و حذف نمونهها در زمان اجرا و توسط CLR صورت میگیره.
Unmanaged Code ها، کدهایین که خارج از چهارچوب دات نت فریمورک توسعه داده میشن. برنامههایی که تحت کنترل CLR اجرا نمیشن رو در حقیقت میشه گفت Unmanaged مثل زبانهای C،C++ و یا VB. عملیات چرخه حیات اینجا دیگه توسط برنامه نویس صورت میگیره و اگر برنامه نویسی بد و اصولی نباشه، میزان هدر رفت حافظه و عدم کارایی بالایی رو شاهد خواهیم بود.
4. منظور از Boxing و Unboxing در سی شارپ چیه ؟
هر دوی این مفاهیم برای تایپ کانورژنها بکار برده میشن، جایی که ما یک مقدار از نوع Value Type رو به Reference Type و یا بالعکس، کست میکنیم.
پروسه تبدیل یک نوع از Value Type به Reference Type رو اصطلاحا Boxing میگن.
// Boxing
int anum = 123;
Object obj = anum;
Console.WriteLine(anum);
Console.WriteLine(obj);
برعکس، پروسه تبدیل یک نوع از Reference Type به Value Type رو Unboxing میگن.
// Unboxing
Object obj2 = 123;
int anum2 = (int)obj;
Console.WriteLine(anum2);
Console.WriteLine(obj);
5. تفاوت بین Class و Struct چیه ؟
کلاسها و استراکتها، هر دو جزو دسته انواع تعریف شده توسط کاربرا قرار میگیرن. اما یه سری تفاوتهای عمده دارن :
Struct ها :
- یک استراکت یک نوع Value Type هست که از کلاس System.Value ارث بری شده.
- استراکتها معمولا برای کار با حجم دادههای پایینتر استفاده میشن.
- استراکتها نمیتونن از انواع دیگه ارث بری کنن.
- یک استراکت نمیتونه از نوع Abstract باشه.
- به دلیل اینکه از نوع ValueType هست، در هنگام تعریف نیاز به استفاده از کلیدواژه new رو نداریم.
- نمیتونیم براش سازنده پیشفرض یا همون Default Constructor داشته باشیم.
Class ها :
- کلاسها از نوع Reference type هستن و از کلاس پایه System.Object ارث بری میشن.
- کلاسها معمولا برای کار با حجم دادههای زیاد استفاده میشن.
- کلاسها میتونن از انواع دیگه ارث بری کنن.
- کلاسها میتونن abstract باشن.
- همینطور میتونیم برای هر کلاس، سازنده پیش فرض داشته باشیم.
6. تفاوت بین Interfaceها وAbstract Classها چیه ؟
- Abstract کلاسها میتونن متدهای non-Abstract داشته باشن یا به اصطلاح Concrete Methodها، در صورتی که تمام اعضای تعریف شده در Interface ها از نوع Abstract هست.
- درون کلاسهای Abstract میتونیم هر متغیری رو ایجاد و استفاده کنیم اما درون Interface ها مجاز به تعریف اون ها نیستیم.
- در Abstract کلاسها به صورت پیش فرض تمام انواع دادهها و توابع به صورت private هستن در صورتی که تمام اعضای یک Interface به صورت public هستن و به صورت دستی نمیشه اونارو تغییر داد.
- برای تعریف متدهای Abstract درون کلاسها باید از کلید واژه abstract استفاده کنیم در صورتی که درون Interface ها نیاز به این کار نداریم.
- Abstract کلاسها از ارث بری چندگانه پشتیبانی نمیکنن در صورتی که در Interface ها میتونیم ارث بری چندگانه داشته باشیم.
- Abstract کلاسها میتونن سازنده داشته باشن در صورتی که Interface ها نمیتونن داشته باشن.
7. نوع داده enum در سی شارپ چیه ؟
enum یک نوع Value Type، که شامل لیستی از نامهای ثابت مرتبط به هم که اغلب به عنوان یک enumerator list استفاده میشه. از کلید واژه enum برای تعریف یک enumeration استفاده میشه. enum ها primitive type هایین که توسط کاربر تعریف میشن. نوع enum میتونه عددی باشه (اعشاری، صحیح، بایت، دابل و یا...) اما اگه با int بکار برده بشه، عملیات cast اتفاق میفته. از enum ها معمولا برای ساخت ثابتهای عددی به همراه نام استفاده میشه.
نوع داده عددی پیش فرض برای اعضای یک enum،int هست که از 0 شروع میشه و با تعریف هر عضو جدید یک واحد به آن اضافه میشود.
enum Dow {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
برخی از ویژگی های enum ها :
- برای end user نیست و صرفا برای دولپرها استفاده میشه.
- کدهامون رو خوانا تر و قابل فهم تر میکنه.
- enum ها ثابت هستن. میتونن به عنوان یک رشته برای نمایش و یا از مقدار عددیش در هنگام پردازش استفاده کرد.
- مقدار پیش فرض برای اعضای enum از نوع int هست اما مقادیر قابل قبول byte , sbyte , short , ushort , uint , long و ulong هستن.
- هر enumی به صورت پیش فرض از کلاس System.Enum ارث بری میکنه و قاعدتا میشه از تمام متدهای این کلاس برای این انواع استفاده کرد.
- Enum ها یک نوع Value Type هستن که بر روی Stack ذخیره میشن نه Heap.
8. تفاوت بین break و continue در سی شارپ چیه ؟
با استفاده از کلید واژه break میتونیم از یک حلقه تکرار خارج بشیم در صورتی که با استفاده از کلید واژه continue حلقه تکرار به ازای مقدار جاری اجرا نخواهد شد و اجرای حلقه از به یک گام بعد منتقل میشود.
1. using System;
2. using System.Collections;
3. using System.Linq;
4. using System.Text;
5. namespace break_example {
6. Class brk_stmt {
7. public static void main(String[] args) {
8. for (int i = 0; i <= 5; i++) {
9. if (i == 4) {
10. break;
11. }
12. Console.WriteLine("The number is " + i);
13. Console.ReadLine();
14. }
15. }
16. }
17. }
خروجی قطعه کد بالا به شکل زیره :
The number is 0;
The number is 1;
The number is 2;
The number is 3;
زمانی که گام اجرای حلقه برابر با 4 شود از حلقه خارج میشویم.
1. using System;
2. using System.Collections;
3. using System.Linq;
4. using System.Text;
5. namespace continue_example {
6. Class cntnu_stmt {
7. public static void main(String[] {
8. for (int i = 0; i <= 5; i++) {
9. if (i == 4) {
10. continue;
11. }
12. Console.WriteLine(“The number is "+ i);
13. Console.ReadLine();
14. }
15. }
16. }
17. }
خروجی قطعه کد بالا به شکل زیره :
The number is 1;
The number is 2;
The number is 3;
The number is 5;
زمانی که گام اجرای حلقه برابر با 4 شود دستورات درون حلقه به ازای گام 4ام اجرا نخواهد شد و وارد گام پنجم میشویم.
10. تفاوت بین constant و readonly در سی شارپ چیه؟
constant ها ثابتهایی هستن که در طول اجرای برنامه مقدارشان ثابت است و در زمان تعریف باید مقدار دهی شوند در غیر این صورت خطای زمان کامپایل رو داریم. اما در متغیرهای readonly شرایط به گونه ای دیگر است. یک متغیر readonly میتواند در زمان تعریف مقدار دهی اولیه نشود. همچنین میتواند بعد از مقدار دهی اولیه در هنگام تعریف متغیر در سازنده کلاس که non-static باشد مقدار آن تغییر یابد.
11. تفاوت بین ref و out در سی شارپ چیه ؟
دو روش برای ارسال پارامتر به عنوان آرگومانهای ورودی تابع داریم، یکی ارسال با مقدار و دیگری ارسال با ارجاع. کیوردهای out و ref هر دو از دسته ارسال با ارجاع هستن، یعنی با هر تغییر درون متد بر روی این آرگومانها، مقدار اصلی آن متغیر در خارج از بدنه متد دستخوش تغییر میشود. معمولا زمانی که میخوایم متد ما به جای یک خروجی چند خروجی رو در بر بگیره میتونیم از این روش استفاده کنیم. اما یه سری تفاوتهایی هم با هم دارن که در زیر به چند تا از اونها اشاره میکنم.
- متغیر های از نوع ref قبل از ارسال به عنوان آرگومان ورودی تابع باید مقدار دهی شوند.
- در این روش نوشتن کلمه ref، هم در زمان ارسال آرگومان و هم در زمان دریافت پارامتر الزامیه.
- Ref یک روش دو طرفه است.
- در روش out نیازی نیست متغیر ها حتما قبل از ارسال به متد مقدار دهی شوند اما باید درون بدنه متد قبل از بازگشت مقدار دهی شوند.
- این یک روش یک طرفه است.
- از این دو روش نمیتوان به عنوان متد اورلودینگ استفاده کرد. فقط در صورتی میتوان از متد اورلودینگ استفاده کرد که یک متد ارسال با مقدار داشته باشد و دیگری با ارجاع. یا از نوع ref و یا از نوع out.
- هر دوی این روش در زمان کامپایل رفتار مشابه ولی در زمان اجرا رفتار متفاوتی دارن.
- Property ها متغیر نیستن و به همین دلیل نمیتونن به عنوان پارامتر ref و out استفاده بشن.
12. آیا کلمه کلیدی this رو میتونیم در داخل متدهای static استفاده کنیم؟
از کلمه کلیدی this داخل متدهای static نمیتونیم استفاده کنیم به این دلیل که this یک مرجع به نمونه فعلی کلاس حاوی اون برمیگردونه در صورتیکه متد های static و یا تمام اعضای static متعلق به نمونه خاصی نیستن. اونها بدون اینکه از یک کلاس نمونه سازی بشن و فقط با صدا زدن نام کلاس در دسترس ما هستن به همین دلیل نمیتونیم از this در درون بدنهی متدهای static استفاده کنیم. در عین حال میتونیم در هنگام تعریف اکستنشن متدها در پارامترهای تابع از اون استفاده کنیم.
13. Properties در سی شارپ چیه ؟
Properties اعضای یک کلاس در زبان سی شارپ هستن که یک مکانیزم منعطف برای خواندن، نوشتن و محاسبه مقادیر private درون یک کلاس رو فراهم میکنن. به عبارت دیگه میتونیم با استفاده از Property ها به اعضای private یک کلاس دسترسی داشته باشیم و مقادیر اونها رو تنظیم کنیم. Property ها در سی شارپ اعضای با دسترسی عمومی و یا Public هستن. Property های سی شارپ از متدهای get و set که به accessor ها هم معروفن برای دسترسی و تنظیم مقادیر مقادیر private استفاده میکنن.
14. اما Accessor ها چین ؟
به بخش های set و get متد یک پراپرتی accessor گفته میشه. از accessorها میشه برای محدود کردن دسترسی به property ها استفاده کرد. با set accessor میتونیم مقداری رو برای فیلد های private ست کنیم. یک پراپرتی بدون بخش set به عنوان یک فیلد readonly در دسترس هست. ودر نهایت با get accessor میتونیم به مقدار یک فیلد private دسترسی داشته باشیم.
15. Extension Method ها چین ؟
Extension method ها در حقیقت ما رو قادر میسازن که بدون ایجاد یک نوع مشتق جدید، کامپایل مجدد و یا تغییر منبع اصلی متدهایی رو اضافه کنیم. extension method ها طبق اصل Open/Closed Principle ها عمل میکنن، بدون اینکه به بدنه اصلی کاری داشته باشیم میتونیم کلاس خودمون رو توسعه بدیم.
و اما چطوری باید از extension method ها استفاده کنیم ؟ یک extension method در واقع یک متد استاتیک از یک کلاس استاتیک هست که از کلمه کلیدی this قبل از پارامتر اول استفاده می کنه. همچنین پارامتر اول باید کلاسی باشه که اون رو میخواد توسعه بده.
16. چه تفاوتی بین dispose و finalize method ها در سی شارپه؟
هر دوی این متدها برای آزاد سازی منابع مدیریت نشده به کار برده میشه.
Finalize:
- از متد finalize برای آزادسازی منابع unmanaged که در حال استفاده نیستن استفاده میشه. مثل فایلها، کانکشنهای دیتابیس در لایه اپلیکیشن دامین و یا لایه های دیگه.
- در پردازش های داخلی، این عملیات توسط Garbage Collector به صورت اتوماتیک انجام میشود و به صورت دستی امکان آن توسط کاربر موجود نیست.
- متد finalize متعلق به کلاس system.object است.
Dispose:
- از متد Dispose هم برای آزادسازی منابع unmanaged که در حال استفاده نیستن استفاده میشه. مثل فایلها، کانکشنهای دیتابیس در لایه اپلیکیشن دامین در هر زمان.
- متد Dispose به صورت دستی توسط کاربر فراخوانی میشه.
- اگر نیاز به استفاده از متد dispose داشته باشیم، باید کلاس مربوطه اینترفیس IDisposable را پباده سازی کند.
- این متد متعلق به اینترفیس IDisposable می باشد.
- این متد را برای کلاسهای کاستوم خود که توسط کاربران دیگه استفاده میشه پیاده سازی کنید.
17. تفاوت بین string و stringBuilder در سی شارپ چیه ؟
از هر دوی اینها برای کار با رشتهها استفاده میشه اما یه سری تفاوتها در نحوه نمونه سازی و پرفورمنس دارن.
String:
- String ها آبجکتهای Immutable هستن. یعنی به محض ایجاد دیگه قابل تغییر نیستن. هر زمان که شما مقداری رو درون اون قرار بدین، مقدار درون اون رو آپدیت کنین و یا مقدار درون اون رو با مقداری دیگه جایگزین کنین، نمونه قبلی dispose میشه و یک نمونه جدید درون حافظه قرار می گیره. برای مثال :
String val = “website”;
Val +=”ostadbash.com”;
Console.writeline(val);
- از نظر عملکرد ضعیف تره چون هر بار یک نمونه جدید داره ایجاد میکنه و نمونه قبلی رو از بین میبره.
- متعلق به فضای نام System هست.
StringBuilder:
- در StringBuilder شرایط به گونه ای دیگه است. در این حالت آبجکتها به صورت mutable هستن، یعنی با یکبار ایجاد وهر با تغییر آن، نمونه اولیه از بین نمیره و صرفا تمام تغییرات روی نمونه اولیه صورت می گیره. برای مثال :
StringBuilder val = new StringBuilder();
Val.Append(“Website”);
Val.append(“Ostadbash.com”);
Console.writeline(val);
- از نظر عملکرد بسیار سریع تر از String ها هستن.
- متعلق به فضای نام system.text.stringBuilder هست.
18. Delegate ها در سی شارپ چیست و چه استفاده ای دارن ؟
یک delegate در واقع یک نماینده ایه که از طرف ما مشخص میشه تا یه سری متدها رو اجرا کنه. تو دنیای واقعی یه سری آدم ها وجود دارن که شغلشون وکیله، یعنی به نمایندگی از طرف شما یه سری کار هارو براتون انجام میدن. حالا تو دنیای برنامه نویسی هم این رو داریم. یک delegate در واقع یک اشاره گر به متد یا متد هاییه که ما قصد اجرای اونهارو داریم. با استفاده از delegate ها میتونیم از فانکشنهای به عنوان یک data استفاده کنیم. یعنی چی ؟ یعنی میتونیم یک فانکشن رو به عنوان یک پارامتر ورودی برای یک فانکشن دیگه ارسال کنیم.
- هر delegate یک امضا یا signature و یک return type داره. هر فانکشنی که میخواد به عنوان delegate استفاده بشه باید با این signature همخوانی داشته باشه.
- Delegateها میتونن هم به صورت async و هم به صورت sync استفاده بشن.
- Delegateها هم میتونن به متد استاتیک و هم به نمونه ساخته شده از اون اشاره کنن.
19. کلاس های Sealed به چه شکل هستن ؟
زمانی از این مشخصه در تعریف یک کلاس استفاده میکنیم که بخوایم ویژگی ارث بری رو از اون کلاس بگیریم. هر کلاسی که به صورت Sealed پیاده سازی بشه قابل ارث بری نیست و در صورت ارث بری از کلاس Sealed خطای زمان کامپایل داریم.
20. کلاس های Partial به چه شکل هستن ؟
از کلاسهای پارشیال برای انشعاب زدن یک کلاس به چند تا کلاس استفاده میشه. مثلا یک کلاس داریم به اسم Class1 که اون رو به صورت partial تعریف کردیم و داخلش property هامون رو نگه داری میکنیم، حالا میتونیم یک کلاس دیگه دقیقا هم نام با همین کلاس یعنی Class1 داشته باشیم که مثلا در اون متد ها مون رو تعریف کنیم. حال اگر در متد اصلی خودمون از Class1 نمونه سازی کنیم، به همه اعضای تعریف شده در دو کلاس پارشیال دسترسی داریم.
- کلاسهای پارشیال فقط در یک فضای نام قابل تعریف هستن و مجاز به تعریف اون ها در فضا های نام مختلف نیستیم.
21. منظور از IEnumerable<> در سی شارپ چیه ؟
IEnumerable یک اینترفیس پدر برای تمام مجموعه های غیر جنریک در فضای نام System.Collection مثل Arraylist ها و یا HashTable هاست و IEnumerable<T> هم یک اینترفیس پدر برای تمام مجموعه های جنریک در فضای نام System.Collection.Generic مثل List<> هست.