توسعه دهنده نرم افزار ، مشتاق و آماده یادگیری مطالب جدید در حوزه های مرتبط
سوالات متداول مصاحبه شغلی دات نت
1. اصول شی گرایی؟
Abstraction:
مخفی کردن پیاده سازی ها می باشد .ما به کمک کلاس های abstract و یا اینترفیس ها ، کلاس های برنامه را از تعاریف جدا میکنیم. انتزاع داده یا پنهان کردن اطلاعات، Abstraction نامیده می شود. به عبارت دیگر فرآیندی برای انتزاع یا پنهان سازی عملکردها می باشد و فقط امکان استفاده از آن ها را برای کاربران یا برنامه نویسان فراهم می کند. برای مثال متدConsole.WriteLine. هیچ کس نمی داند چه عملیاتی در تابع اتفاق می افتد و ما فقط با صدا زدن و ارسال پارامتر از آن استفاده می کنیم.
Encapsulation:
محدود کردن دسترسی به اعضای یک کلاس می باشد . به کمک access modifier ها.
Polymorphism:
یا چند ریختی به این معنی است : Method overloading , Method overriding , Method hiding
به معنای چند ریختی است و به دو صورت قابل پیاده سازی است.
Static (Compile Time Polymorphism)
به معنی Overloading می باشد. می توانیم چندین متد با یک نام ایجاد کنیم اگرچه پارامترها متفاوت هستند.
Dynamic (Runtime Polymorphism)
از این نوع برای مفاهیم بازنویسی (Overridden) استفاده می شود. با استفاده از کلمات کلیدی Virtualو Overrideپیاده سازی می شود.
Inheritance:
وراثت، اشیاء جدید را قادر می سازد تا از ویژگیهای اشیاء موجود استفاده کنند. برای ایجاد آن به یک ساختار سلسله مراتبی نیاز داریم که به وسیله OOP و با استفاده از Inheritance فراهم می شود. کلاس فرزند خاصیت ها و متدهایی که در کلاس پدر عمومی هستند را به ارث می برد. از مزایای آن قابلیت استفاده مجدد و توسعه پذیری کد ها را میتوانیم نام ببریم.
2.آبجکت چیست؟
بلوک هایی از حافظه می باشد که بر اساس خواست و کلاس هایی که ما تعریف میکنیم شکل دهی می شوند.کلاس ها به خودی خود کاربردی ندارند و برای استفاده از آنها ما باید آبجکت و یا نمونه ای از آنها را در حافظه بسازیم تا بتوانیم از قابلیت آنها استفاده کنیم.
3.کدهای managed و unmanaged چیست؟
کد هایی که به زبان میانی دات نت و یا IL(intermediate language) ابتدا کامپایل شوند و بعد از آن به زبان ماشین ترجمه شوند کدهای managed گفته میشوند
و کدهایی که بصورت مستقیم به زبان ماشین ترجمه می شوند کدهای unmanaged گفته میشوند.
4.مفهوم boxing و unboxing چیست؟
Boxing:
به زبان ساده وقتی ما یک متغیر Value Type را به یک Reference Type نسبت بدیم عملیات باکسینگ انجام شده است.
int stackVar = 12;
object boxedVar = stackVar;
Unboxing:
زمانی که ما یک ReferenceType را که در Heap قرار دارد را معادل یک متغیر در Stack میکنیم .
Int unboxed = (int)boxedVar;
اضافه کردن یک آیتم ValueType به یک آرایه از مثال های دیگر باکسینگ می باشد.و زمانی که آن آیتم را از آرایه به یک ValueType تبدیل میکنیم آنباکسینگ کرده ایم.
5.تفاوت struct با class چیست؟
رفرنس struct : System.Value و رفرنس کلاس: System.Object
در استراکت ها حالت abstract وجود ندارد درصورتی که در کلاس ها وجود دارد
کاربرد استراکت ها در دیتاهای کم تعداد می باشد به دلیل اینکه استراکت ها ValueType هستند ولی کلاس ها در دیتا های با حجم بالا کاربرد دارند.
در استراکت ها ارث بری وجود ندارد درصورتیکه کلاس ها این قابلیت را دارند
کلاس ها برای استفاده نیازمند ساخت آبجکت هستند درصورتیکه استراکت ها اینطور نمی باشند.
استراکت ها تابع سازنده ندارند در صورتیکه کلاس ها این قابلیت را دارا می باشند.
6.کلاس abstract چیست؟
به طور کلی، Abstract کلاسی می باشد که غیر قطعی و ناتمام است که باید در سطح فرزندانش تکمیل شود. کلاس Abstractشبیه اینترفیس می باشد ولی با دیدی وسیع تر. این کلاسها میتواند دارای متدهای Abstract باشند که شبیه اینترفیس فقط اعلام می شوند و باید در کلاسهای مشتق شده بازنویسی شوند. علاوه بر این، میتوان در این کلاسها متدهایی داشت که Abstractنیستند و احتیاجی به پیاده سازی آنها در کلاس های مشتق شده ندارند. تنها متدهایی از کلاس abstractالزام به پیاده سازی دارند که صریحا کلمه abstractدر تعریف آن متد ذکر شده باشد. این امکان نیز وجود دارد که متدهای abstract در subclassهم به صورت abstractذکر شوند. البته به شرطی که subclassهم به صورت abstractتعریف شده باشد.
تعریف سطوح دسترسی برای متدها و خصوصیتها مانند کلاسهای معمولی نیز از مزیتهای این کلاسها می باشد.
7.مفهوم interface چیست؟
به طور کلی اینترفیس ها یک قالب اجرائی برای کلاس ها هستند. بدین صورت که با تعریف مشخصات کلی متدها، بدون پیاده سازی آنها، کلاسهای مشتق شده را ملزم به پیاده سازی کامل آن متدها می کند. بنابراین فقط مشخصات متدها یک بار در اینترفیس تعریف میشوند و هر جا که لازم باشد پس از ارث بری، متدهای آنها پیاده سازی میشوند. علاوه بر اینکه متدهای اینترفیس دارای بدنه نمی باشند، اینترفیسها سازنده و فیلد ندارند و نمیشود از روی آنها نمونهای ایجاد کرد.
در حالت عادی ارث بری از چند کلاس به طور هم زمان امکان پذیر نیست ولی اینترفیس ها این مزیت را دارند که به هر تعداد که لازم است، کلاسهای مشتق شده از آنها ارث بری کنند. این موضوع یکی از مهمترین مزایای اینترفیس میباشد. هم چنین با استفاده از اینترفیس ها کدها قابلیت بهتری در نگهداری، انعطاف پذیری و استفاده مجدد پیدا می کنند.
8.تفاوت interface و abstract class چیست؟
- 1- یک کلاس معمولی تنها میتواند از یک کلاس Abstractارث بری کند ولی همان کلاس می تواند از چندین اینترفیس ارث ببرد.
- 2- یک اینترفیس فقط می تواند اعلان متدها و خصوصیت ها را داشته باشد، اما یک کلاس Abstractعلاوه بر آنها می تواند متدها و خصوصیت هایی با کدهای کامل داشته باشد.
- 3- عناصر موجود در کلاس Abstractمی توانند مانند یک کلاس معمولی دارای سطح دسترسی باشند، ولی اینترفیس ها فاقد این امکان هستند.
- 4- کلاسهای Abstract مانند کلاسهای معمولی میتوانند دارای فیلد و عناصر دیگری (مثل ثابتها) باشند، در حالیکه یک اینترفیس فاقد این امکان میباشد. همچنین کلاس abstractمی تواند شامل سازنده باشد، اما اینترفیس نمی تواند.
- 5- اینترفیس تنها می تواند از اینترفیس ارث بری کند اما کلاس abstractمی تواند از اینترفیس، کلاس Abstractو یا سایر کلاسها ارث بری کند.
9. چه زمانی از Interface ها و یا کلاسهای Abstract استفاده کنیم؟
- 1- مواقعی که نیاز به وراثت چند گانه داریم باید از اینترفیس استفاده کنیم، به دلیل اینکه این امکان در کلاسهای Abstractوجود ندارد.
- 2- زمانی که بخواهیم تمام متدهای معرفی شده در کلاس پایه به طور کامل در کلاس مشتق شده پیاده شوند باید از اینترفیس استفاده کنیم.
- 3- وقتی در پروژههای بزرگ با تغییرات زیادی مواجه هستیم، استفاده از کلاس Abstract توصیه میشود، زیرا با تغییر آن به طور خودکار تغییرات در کلاس های مشتق شده اعمال میشوند.
- 4- با توجه به اینکه به غیر از اعلان متدها و خصوصیتها امکان تعریف عناصر دیگری در اینترفیس ها وجود ندارد، در صورتیکه ملزم به استفاده از این عناصر باشیم، استفاده از کلاسهای Abstract ضروری میباشد.
- 5- در صورتی که نخواهیم کلیه متدها در کلاسهای مشتق شده پیاده سازی شوند و تعدادی از آنها را در کلاس پدر کدنویسی کنیم، باید از کلاس Abstractاستفاده کنیم.
- 6- به طور کلی یک اینترفیس چارچوب و قابلیتهای یک کلاس را مشخص می کند و یک قرارداد است، ولی کلاس Abstractنوع کلاس را معین میکند. این تفاوت کمک بسیاری برای تشخیص زمان استفاده از این دو را به برنامه نویسان می دهد.
10.کلید واژه های break و continueچه تفاوتی دارند؟
دستور break در حلقه های تودرتو از درونی ترین حلقه ای که درآن قرار دارد خارج میشود و از خط بعدی بلاک شروع میکند
دستور continue به ابتدای آخرین (درونی ترین) حلقه ای که درآن قرار دارد وارد شده و شرط آنرا تست میکند.
11. تفاوت constant ها و readOnly ها چیست؟
متغیر های constant در زمان تعریف باید مقداردهی شوند. اما متغیر های readOnlyمیتوانند در تابع سازنده همان کلاس مقداردهی شوند.
12.کلید واژه thisچیست و آیا میتوان در متدهای استاتیک از آن استفاده کرد؟
کلیدواژه this به ابجکتی اشاره میکند که در آن قرار دارد.
در متد های استاتیک نمیتوانیم از this استفاده کنیم به این دلیل که this به نمونه ای از آبجکت جاری اشاره میکند، زمانی که از متد استاتیک استفاده میکنیم در واقع متدی داریم که مستقل از آبجکت میباشد بنابراین this در آن کاربردی ندارد.
13.پراپرتی چیست؟
یکی از ممبرهای کلاس میباشد که یک مکانیزم انعطاف پذیر برای خواندن، نوشتن و محاسبه مقادیر است که با دنیای بیرون از کلاس ارتباط برقرار میکند.
14.توابع extension method چگونه ساخته میشوند؟
برای ساخت آن یک کلاس استاتیک با یک متد پابلیک استاتیک میسازیم و ورودی آن متد را جنس آن کلاسی که میخواهیم برای آن extension method بنویسیم قرار میدهیم با کلیدواژه this قبل از آن.
15.تفاوت string و stringBuilder چیست؟
هردو مکانیزمی برای ذخیره سازی رشته ها هستند.
اما string ها آبجکت های immutable هستند یعنی تغییر ناپذیرند. یعنی اگر مقدار جدیدی به آن بدهیم و یا تغییری در آن بدهیم آبجکت جدیدی ساخته میشود .
اما stringBuilder ها mutable هستند.و میتوان تغییرشون داد و یا مقدار جدیدی به آنها داد و همان آبجکت تغییر میکند. بنابراین سرعت آن بیشتر است و مدیریت حافظه بهتری دارند.
16.مفهوم delegate و کاربرد آن چیست ؟
دلگیت ها مانند یک اشاره گر به توابع هستند و متغیری از جنس تابع هستند.یک آبجکت دلیگیت میتواند تعداد زیادی تابع را بصورت رفرنس در خودش نگهداری کند که در یک invocation list قرار دارند و ما میتوانیم به آنها اشاره کنیم. ما توسط عملگر های =+ و یا =- میتوانیم به آبجکت دلیگیت یک اشاره گر(متد) اضافه و یا کم کنیم.
برای پیاده سازی event ها بسیار کاربرد دارند و رفرنس آن System.Delegate می باشد.
*** دلیگیت تایپی است که اگر متغیری از آن تعریف کنیم و توابعی را در داخل آن رجیستر نماییم، در زمان فراخوانی آن متغیر دلیگیت ، توابع رجیستر شده در آن به ترتیب اجرا میشوند.
17.کلاس های Sealed چیست؟
از این کلاس ها نمی توان ارث بری کرد.
18.کلاس های Partial چیست؟
با استفاده از این کلاس ها میتوان یک کلاس را به دو یا چند کلاس تقسیم کرد ولی همه آنها یک کلاس را تشکیل میدهند.
19.اینترفیس IEnumerable چیست؟
یک اینترفیس والد برای همه مجموعه های System.Collection و System.Collection.Generic میباشد.و فقط یک متد GetEnumerator() دارد.
خاصیت iterate کردن روی تمامی فرزندان و آبجکت هایی که در System.Collection و System.Collection.Generic وجوددارند از این اینترفیس نشات گرفته شده است.
20.معنی Early binding و Late binding را توضیح دهید؟
همان مفهوم پلی مورفیسم و یا چندریختی میباشد.
Early binding:
همان method overloading میباشد و که در زمان کامپایل تایم رخ میدهد.
Late binding:
همان method overriding میباشد که در زمان ران تایم رخ میدهد.
21. تفاوت بین IQueryable و IEnumerable چیست؟
هردوی این اینترفیس ها برای کار با کالکشن ها میباشند. اما طرز رفتار آنها با کالکشن ها متفاوت است.
اینترفیس IQueryable از System.Linq و IEnumerable از System.Collection هستند.
اینترفیس IQueryableاستخراج شده ای از IEnumerable میباشد درصورتیکه خود IEnumerable والدی ندارد.
اگر بخواهیم دیتایی را در حافظه و یا به اصطلاح In Memory استفاده کنیم از IEnumerable استفاده میکنیم
اما اگر دیتای ما خارج از حافظه قرار داشته باشد و ما بخواهیم فیلترمان به همراه کوئری به سمت آن بفرستیم از IQueryable استفاده میکنیم.
بطور کلی اگر بخواهیم از Lazy loading استفاده کنیم از IQueryable استفاده میکنیم.
Static void Main(string[] args)
{
using(var db = new MyDbContext())
{
IEnumarable<Client> clients =
db.Clients.Take(5).ToList();
IQueryable<Client> someClients =
db.Clients.Take(5).ToList();
}
}
در استفاده از IEnumerable ما تمام رکورد ها را در حافظه می اوریم و بعد انرا فیلتر کرده و 5 تا از آنها را
بر میداریم در صورتیکه در IQueryable فیلتر ما به همراه کوئری ارسال شده و دقیقا همان 5 رکوردی که نیاز داریم به حافظه انتقال داده میشود.
22.تفاوت Array , ArrayList , List ؟
Array:
آرایه حجم ثابتی دارد و قابل تغییر نیست درصورتیکه ArrayList قابل کوچک و بزرگ شدن است.
آرایه میتواند فقط یک نوع دیتا تایپ داشته باشد درصورتیکه ArrayList میتوانند چندین دیتا تایپ یا آبجکت را در خودش ذخیره کند.
آرایه از namespace ، System میباشد درصورتیکه ArrayList از System.Collection میباشد.
آرایه میتواند چندبعدی باشد درصورتیکه ArrayList فقط یک بعد دارد.(ماتریس)
لیست ها خیلی شبیه ArrayList ها هستند اما در List ها عناصر آنها از یک تایپ مشخص هستند.
سرعت خواندن Array بیش از سایرین میباشد و در عملیات های محاسباتی بهتر است که از Array ها استفاده شود.
23.تفاوت is و as چیست؟
برای مقایسه دو ابجکت از is استفاده میکنیم که مقدار Boolean برمیگرداند
عملگر as خیلی شبیه is است با این تفاوت که چیزی که به ما برگردانده میشود آبجکت است در صورتیکه هردو تایپ یکسان باشند ، درغیر این صورت null برمیگرداند.
24.روش های مختلف method overloading را توضیح دهید؟
تعداد ورودی های متفاوت ، تایپ(جنس) ورودی های متفاوت ، ترتیب متفاوت ورودی ها
25.جنریک در سی شارپ را تعریف کنید؟
جنریک ها به ما این امکان را میدهند که کلاس یا متدهای جنرالی را بنویسیم به گونه ای که بتوانند با هر دیتا تایپی کارکنند.
26.تفاوت ref و outچیست؟
مقدار ref باید از قبل مقدار دهی شده باشند تا مورد استفاده قرار گیرند اما متغیر هایی که کلیدواژه out را دارند نیازی به مقدار دهی اولیه ندارند.
پراپرتی ها نمیتوانند از این کلید واژه ها استفاده کنند . فقط فیلدها این امکان را دارند.
27.الگوی Decorator:
به کاربر اجازه می دهد که عملکرد جدیدی را به یک شی موجود اضافه کند بدون آنکه به تغییر در آن ساختار نیاز داشته باشد.
زمانی استفاده میشود که برای یک شی ما چندین پیاده سازی داشته باشیم ، بدین منظور یک کلاس abstract ایجاد میکنیم و تابع یا توابع موردنیاز خود را در آن تعریف میکنیم.
در قدم بعدی یک کلاس decorator ایجاد کرده و آنرا از کلاس abstract خود ارث بری میکنیم و در تابع سازنده آن ، شی ای از کلاس abstract خود را inject میکنیم و توابع کلاس پدر را override میکنیم.
سپس هر تایپی که اضافه میشود را از کلاس decorator ای که ساختیم ارث بری کرده و تابع یا توابع آنرا بر اساس نیاز خود پیاده سازی و override میکنیم.
28.الگوی Strategy:
1.پیاده سازی الگوریتم های مختلف
2.عدم وابستگی استفاده کننده به پیاده سازی
3.تاکید بر تک وظیفه ای 4.رعایت اصل OCP
در الگوی استراتژی قسمت متغیر کلاس را جدا و قسمت ثابت کلاس را هم جدا پیاده سازی میکنیم.
** هرجا با if-else یا switch-case های طولانی روبرو شدیم می توان از این الگو استفاده کرد.
29.اصول Solid:
Single Responsibility:
تعریف صحیح آن این است که هر ماژول تنها و فقط یک دلیل برای تغییر باید داشته باشد. در حقیقت هر ماژول باید تنها و فقط به یک Actor در سیستم خدمات بدهد.
Open Closed:
ماژول های ما باید برای توسعه باز باشند و برای اعمال تغییر بسته باشند. باید بدون تغییرات در سورس های اصلی کلاس، به کلاس ها ویژگی اضافه کنیم. برای رعایت کردن این اصل، در زمان طراحی یک ماژول باید به این فکر کنیم کدام قسمت ها قابل تغییر است و کدام قسمت ها قابل تغییر نیست. (قسمت های متغیر را از کلاس جدا می کنیم).
یکی دیگر از مطالبی که زیاد با آن سر و کار داریم، Abstraction (انتزاع) می باشد. همانطور که می دانیم Abstraction یکی از اصول شی گرایی است. سطح Abstraction یعنی در طراحی یک ماژول، بدانیم تا کجا این ماژول Abstract می باشد و سپس نمونه واقعی می شود. برای مثال در دنیای موجودات زنده، موجود زنده Abstract است، حیوان، گیاه و انسان Abstract هستند و در نهایت اسب یک نمونه واقعی می باشد و می توانیم از آن نمونه بسازیم. تعیین کردن سطح Abstraction، بسیار مهم است.
Liskov Substitution:
تعریف آن این است که اشیا پدر بتوانند با فرزندان جایگزین شوند و با جایگزینی عملکرد تغییری نکند.
Interface Segregation:
پیش از این هم گفتیم که اینترفیسها فقط مشخص میکنند که یک کلاس از چه متدهایی حتماً باید برخوردار باشد. در همین راستا و بر اساس این قانون، چندین اینترفیس تکمنظوره به مراتب بهتر است از یک اینترفیس چندمنظوره است به طوری که اگر یک اینترفیس چندمنظورهٔ کامل و جامع داشته باشیم و سایر کلاسهای ما از آن اصطلاحاً implements کنند، در چنین صورتی ممکن است برخی خصوصیات، متدها و رفتارها را به برخی کلاسهایی که اصلاً نیازی به آنها ندارند تحمیل کنیم اما اگر از چندین اینترفیس تخصصی استفاده کنیم، به سادگی میتوانیم از هر اینترفیسی که نیاز داشته باشیم در کلاسهای مد نظر خود استفاده نماییم و در صورتی هم کلاسی وجود داشت که نیاز به استفاده از چندین اینترفیس مختلف داشت، دست ما باز خواهد بود تا آن کلاس را از چندین اینترفیس implements کنیم.
Dependency Inversion:
ماژول های سطح بالا نباید به ماژول های سطح پایین وابستگی پیدا کنند و فقط باید به Abstraction وابسته باشند.(وظیفه ساختن نیازمندیها را به خارج از کلاس منتقل کنیم).
این مقاله به مرور زمان تکمیل خواهد شد ...
در صورتی که ایراد تایپی و یا مفهومی ای را مشاهده کردین و یا سوالات جدیدی شنیدین که دوس دارین در این مقاله اضافه بشه خیلی خوشحال میشم که باهام درمیون بذارین تا نسبت بهش اقدام کنم.
مطلبی دیگر از این انتشارات
اقامت تمکن مالی چیست؟
مطلبی دیگر از این انتشارات
چند گام در راهـ ه بهسازی یه خطط ه پارسی
مطلبی دیگر از این انتشارات
یک فنجان چای با دکتر ماهانی | قسمت اول