C# .Net Developer Mülakat Soruları
Herkese merhaba, bu yazıda mülakat sırasında karşınıza çıkması muhtemel soruları ve kısa cevaplarını yazacağım. Liste sürekli güncellenecektir.
Virtual Kavramı Nedir ?
Virtual olarak tanımladığımız metodlarımızı, diğer sınıflar içinde override edebiliriz. Yani, kalıtıldığı(miras alındığı) sınıfta metodun değiştirilebileceği anlamına gelir.
Struct ile Class Arasındaki Fark Nedir ?
struct
‘lar genellikle küçük veri yapısı için kullanılmaktadır ve bellekte stack’te saklanır.class
‘lar, nesneler için genellikle heap’te daha büyük bellek alanları kullanır.struct
‘lar null olamazlar. Birstruct
her zaman bir değer taşır.class
‘lar null olabilmektedir. Referans türü olduğu için bir class nesnesinull
olarak atanabilir.struct
‘lar miras alınamaz (inheritance desteklemez).class
‘lar miras alabilmektedir ve türetilebilmektedir.- Küçük ve sade veri yapıları için
struct
‘lar genellikle daha performanslıdır. Bunun nedeni, değer türlerinin bellekte daha düzenli bir şekilde saklanmasıdır. class
‘lar daha büyük nesneleri yönetmek için daha esnek ve genellikle referans türü olduğu için daha fazla bellek kullanır.
Class ve Object Nedir ?
- İlk önce sınıf tanımlanır ve kullanılmayı bekler, biz o sınıftan bir nesne türetirsek artık o sınıf bir anlam taşımaktadır.
- Sınıf soyut bir veri tipidir. Object ise onun somutlaşan bir cismidir.
OOP Temel Prensipleri Nelerdir ?
Encapsulation (Kapsülleme):
- Encapsulation, bir sınıfın içindeki verileri (alanlar) ve bu verilere erişim yöntemlerini (metotlar) bir araya getirme işlemidir. Yani, bir sınıfın içindeki verilere doğrudan erişimi kısıtlamak ve bu verilere sadece belirli metodlar aracılığıyla erişimi sağlamaktır. Bu, sınıfın iç yapısının gizlenmesini ve dış dünyaya sadece belirli bir arayüzün sunulmasını sağlar.
Inheritance (Kalıtım):
- Inheritance, bir sınıfın başka bir sınıftan türetilmesidir. Türeyen (alt) sınıf, türetilen (üst) sınıfın özelliklerini (alanlar ve metotlarını) miras alır. Bu, kodun yeniden kullanılabilirliğini artırır ve sınıflar arasında hiyerarşik bir ilişki kurulmasını sağlar.
Polymorphism (Çok Biçimlilik):
- Polymorphism, aynı isme sahip ancak farklı işlevlere sahip metotların kullanılabilmesini ifade eder. Polymorphism sayesinde bir nesne, farklı türlerdeki sınıfları temsil edebilmektedir ve aynı adı taşıyan metotlar farklı davranışlar sergileyebilmektedir.
Abstraction (Soyutlama):
- Abstraction, bir sınıfın iç detaylarını gizleyerek sadece gerekli olan özellikleri ve metotları açıkça tanımlamasını ifade eder. Soyut sınıflar ve arayüzler bu prensibi destekler.
Lazy Loading ve Eager Loading Nedir ?
Lazy Loading (Tembel Yükleme):
- Lazy Loading, veritabanındaki ilişkisel veri yapısının sadece ihtiyaç duyulduğu an yüklenmesini sağlar. Yani, bir nesnenin ilişkili bir nesnesine erişildiğinde, bu ilişkili nesnenin veritabanından çekilmesi gerçekleşir.
- Bu yöntem, performans avantajları sağlayabilmektedir çünkü sadece gerektiğinde veri çekilmektedir. Ancak, her ilişkili nesneye erişildiğinde ayrı ayrı sorgu gönderildiği için, potansiyel olarak N+1 sorgu sorununa yol açabilmektedir.
Eager Loading (Hemen Yükleme):
- Eager Loading, ana nesne çekilirken ilişkili nesnelerin de aynı anda çekilmesini sağlar. Bu, ilişkili verilerin önceden yüklenmesi anlamına gelir.
- Eager Loading, genellikle ilişkili verilere daha önceden ihtiyaç duyulacağı durumlarda tercih edilmektedir ve N+1 sorgu sorununu önleyebilmektedir.
SOLID Prensipleri Nelerdir ?
Single Responsibility Principle (Tek Sorumluluk Prensibi): Bir sınıfın sadece bir sorumluluğu olmalıdır. Yani, bir sınıfın değiştirilme nedeni yalnızca bir işlevi için olmalıdır. Bu prensip, kodun daha sade, anlaşılabilen ve bakımı daha kolay hale gelmesini sağlamaktadır.
Open/Closed Principle (Açık/Kapalı Prensibi): Bir sınıf, genişletilebilir olmalı ancak değiştirilemez olmalıdır. Yeni özellikler eklemek için sınıfın kodunu değiştirmek yerine, var olan kodu genişletebilmeliyiz. Bu, kodun daha güvenilir ve sürdürülebilir olmasına katkıda bulunur.
Liskov Substitution Principle (Liskov Yerine Koyma Prensibi): Alt sınıflar, üst sınıfların yerine kullanılabilir olmalıdır. Yani, bir üst sınıf nesnesi yerine alt sınıf nesnesi kullanıldığında, programın davranışı değişmemelidir. Bu prensip, türetilmiş sınıfların temel sınıfların yerine geçebilir ve beklenen sonuçları üretebilmesini sağlar.
Interface Segregation Principle (Arayüz Ayrımı Prensibi): Bir istemcinin ihtiyaç duymadığı özelliklere ait arayüzleri uygulayan sınıflar, bu özellikleri içermemelidir. Yani, bir sınıfın kullanmadığı metotları içeren bir arayüzü uygulamaması gerekir. Bu prensip, gereksiz bağımlılıkları azaltır ve sınıfları daha bağımsız hale getirir.
Dependency Inversion Principle (Bağımlılık Tersine Çevirme Prensibi): Üst seviye modüller, alt seviye modüllere bağlı olmamalıdır. Her ikisi de soyutlamalara (abstractions) bağlı olmalıdır. Bu prensip, bağımlılıkları azaltmak ve daha esnek, değiştirilebilir bir tasarım elde etmek amacıyla kullanılmaktadır.
Dependency Injection Nedir ?
Dependency Injection (Bağımlılık Enjeksiyonu), bir sınıfa dış bağımlılıkları (dependencies) enjekte etme sürecidir. Bu, bir sınıfın kendi bağımlılıklarını oluşturmaktan ziyade, dışarıdan almasını sağlar. Bu yöntem, yazılım tasarımında bağımlılıkları azaltmayı, sınıfları daha test edilebilen, değiştirilebilen ve esnek hale getirmeyi amaçlamaktadır.
Dependency Injection’in temel amacı, bağımlılıkların sınıf içinde sıkı bir şekilde bağlı olmasını engellemektir. Bu, kodun daha modüler hale gelmesini, birbirinden bağımsız modüllerin daha kolayca değiştirilebilen olmasını sağlamaktadır.
Transient:
- Her talep edildiğinde yeni bir örnek oluşturulmaktadır.
- Her injection (enjeksiyon) için yeni bir nesne oluşturulmaktadır ve bu nesne yalnızca talep edilen yerde kullanılmaktadır.
Singleton:
- Uygulama boyunca yalnızca bir kez oluşturulurmaktadır ve tüm talepler aynı nesneyi paylaşır.
- Uygulama başladığında oluşturulmaktadır ve uygulama sona erdiğinde yok edilmektedir.
- Hafızada uzun süreliktir.
Scoped:
- İstek başına bir örnek oluşturur ve bu örnek, o isteğin ömrü boyunca kullanır.
- Özellikle web uygulamalarında, her HTTP isteği için ayrı bir örnek oluşturur ve bu örnek yalnızca o istek süresince kullanılmaktadır.
Docker Nedir ?
Docker, uygulamalarınızı hızla derlemenize, test etmenize ve dağıtmanıza imkan tanıyan bir yazılım platformudur.Docker, container’lara yönelik bir işletim sistemidir.
Bir sanal makinenin sunucu donanımını sanallaştırmasına (doğrudan yönetme gereksinimini ortadan kaldırma) benzer şekilde container’lar da bir sunucunun işletim sistemini sanallaştırır. Docker her sunucuya yüklenme imkanı sağlar ve container’ları oluşturmak, başlatmak veya durdurmak için kullanabileceğiniz basit komutlar sağlar.
RabbitMQ Nedir ?
Mesajlaşma protokolü olan AMQP (Advanced Message Queuing Protocol) üzerine kurulan açık kaynaklı bir mesaj kuyruğu sunucusudur. RabbitMQ, uygulamalar arasında asenkron ve güvenilir bir şekilde veri aktarımı sağlar. RabbitMQ, yüksek performanslı, ölçeklenebilen ve esnek bir mesajlaşma çözümüdür.
Sealed Class Nedir ?
sealed
kelimesi, C# dilinde bir sınıfın miras alınamaz (inheritance edilemez) olduğunu belirtmek için kullanılmaktadır. Bir sınıfı sealed
olarak işaretlemek, bu sınıfın başka bir sınıf tarafından türetilmesini engeller.
Asenkron Programlama Nedir ?
C# dilinde asenkron programlama, programın işlemlerini zamanla uyumsuz (asenkron) olarak yürütme yeteneğini ifade eder. Asenkron programlamada, bir işlem tamamlanana kadar programın diğer kısımları çalışmaya devam eder, böylece zaman kaybı minimize edilmektedir ve daha etkili bir şekilde kaynaklar kullanılmaktadır.
ORM Nedir ?
Nesne-İlişkisel Eşleme, programlama dilindeki nesne modelini ve ilişkisel veritabanındaki tablolar ve sütunlar gibi veri yapılarını birbirine bağlama amacını taşır. Bu, programcılara veritabanındaki veriyi nesne gibi kullanmalarını sağlar, yani veritabanındaki kayıtları nesneler olarak ele almalarına imkan verir.
Hangfire Nedir ?
.NET tabanlı uygulamalarda zamanlanmış görevleri yönetmek ve arka planda çalışan işlemleri kolayca planlamak için kullanılan bir açık kaynak kütüphanedir. Hangfire, görevlerin belirli bir zaman diliminde çalıştırılmasını sağlar ve bu görevleri bir kuyruk sistemi üzerinden işler. Böylece, uygulamanızın ana akışıyla aynı iş parçacığında çalışmaktan ziyade, arka planda asenkron olarak görevleri gerçekleştirebilirsiniz.
Protected, Internal ve Default Access Modifiers Nedir ?
Protected Erişim Belirleyici:
protected
, bir sınıfın kendi içinde veya türetilen sınıflar içinde kullanılabilmektedir. Yani, bir üye (field, property, method vb.)protected
olarak işaretlendiğinde, bu üye sadece tanımlandığı sınıfın içinden veya bu sınıftan türetilmiş diğer sınıflar içinden erişilebilir.
Internal Erişim Belirleyici:
internal
, bir üyenin tanımlandığı assembly içinde (proje veya derleme içinde) kullanılabilmektedir. Yani,internal
olarak işaretlenmiş bir üye, tanımlandığı proje içinde erişilebilir, ancak bu projeden başka bir assembly’den erişilemez.
Default (Package-Private)
Eğer bir üye (field, metod, sınıf) hiçbir access modifier belirtilmeden tanımlanırsa, bu üye o paket içindeki diğer sınıflar tarafından erişilebilir. Yani, aynı paket içindeki diğer sınıflar bu üyelere erişebilir, ancak paket dışındaki sınıflar erişemez.
Middleware Nedir ?
Middleware ile web uygulamasında client’tan gelen request’e karşılık verilecek response’a arada farklı işlemler gerçekleştirmek ve sürecin gidişatına farklı yön vermek isteyebiliriz. Bunu yapma işlemine middleware denilebilir. Örneğin Run,Use ve Map bir middlewaredir. (app.Use, app.Run)
Immutable Ve Mutable Kavramları Nedir ?
Immutable (Değişmez) Nesneler:
- Değişmez nesneler, bir kez oluşturulduktan sonra durumlarının değiştirilemez olduğu nesnelerdir. Yani, bir kez değer atandıktan sonra, bu değer değiştirilemez. Eğer bir değişiklik yapılması gerekiyorsa, yeni bir nesne oluşturulmaktadır ve eski nesne değiştirilmemektedir. Primative olan değişkenlerin değerleri bellekte(stack) tutulduğu için başka bir değer atandığında eski değerin üzerine yazılmış olur, fakat diğer kalan tüm tipler değerlerin adresleri heap’ta tutulduğu için gerçek değerleri değil adresleri değişmiş oluyor.
Mutable (Değiştirilebilen) Nesneler:
- Mutable nesneler, durumlarının zamanla değiştirilebileceği nesnelerdir. Yani, bir nesnenin özellikleri üzerinde değişiklik yapılabilmektedir.
Const, Readonly Ve Static Kavramları Nedir ?
const (Constant):
const
kelimesi, bir sabit değeri temsil eden bir değişken tanımlamak için kullanılmaktadır. Birconst
değişkeni tanımlandıktan sonra değeri değiştirilemez ve bu değer derleme zamanında belirlenmelidir.
readonly (Read-Only):
readonly
kelimesi, bir alanın sadece tanımlandığı yerde veya sınıfın kurucu metodlarında değeri atanabilen, ancak daha sonra değiştirilemeyen bir alan (field) tanımlamak için kullanılmaktadır. Farkı, değeri derleme zamanında belirlenmek zorunda olmadığı ve sadece kurucu metotlarda atanabilecek olmasıdır.
static (Static):
static
kelimesi, bir alanın sınıfa ait olduğunu ve sınıfa özgü olmadan kullanılabileceğini belirtir. Ayrıca, bir metotun sınıfa ait olduğunu ve nesne oluşturulmadan çağrılabileceğini ifade eder.
Garbage Collector Nedir ?
Garbage Collector (GC), programın çalışma zamanında bellek yönetimini otomatik olarak gerçekleştiren bir bileşendir. GC, programın belleğini dinamik olarak yönetir ve artık kullanılmayan nesnelerin bellekten temizlenmesinden sorumludur.
.NET Framework’teki nesneleri üç farklı nesil olarak sınıflandırır ve bu nesillerin yönetimini gerçekleştirir. Bu nesiller şunlardır:
- Genç Nesil (Young Generation – Gen 0):
- Bu nesil, henüz bir veya birkaç GC döngüsüne katılmamış yeni oluşturulmuş nesneleri içerir.
- Bu nesildeki nesneler, kısa bir süre yaşar ve genellikle ilk GC döngüsünde temizlenir.
- Genç nesildeki bir nesnenin yaşam süresi, bir GC döngüsünden diğerine kadar geçen süre içinde kalma olasılığına dayanır.
- Orta Yaş Nesli (Middle-Aged Generation – Gen 1):
- Gen 0’dan kurtulan nesneler, genellikle Gen 1’e taşınır.
- Gen 1, Gen 0’dan daha uzun süre yaşayan nesneleri içerir.
- Genç nesilde yaşam süresini geçirmiş ve GC döngülerinden sağ kurtulmuş nesneler burada yer alır.
- Eski Nesil (Old Generation – Gen 2):
- Gen 1’den kurtulan nesneler, genellikle Gen 2’ye taşınır.
- Bu nesil, genellikle sistem başlangıcından bu yana sürekli olarak hayatta kalmış olan nesneleri içerir.
- Gen 2’deki nesnelerin temizlenmesi, genellikle daha maliyetli bir işlemdir ve daha nadir gerçekleşir.
- Eski nesildeki nesneler genellikle uygulamanın yaşam süresi boyunca sürekli olarak kullanılan büyük nesnelerdir.
Genç nesilin kısa ömürlü nesneleri içermesi, sıklıkla GC’nin yüksek hızda çalışmasına ve genellikle genç nesildeki nesnelerin hızlı bir şekilde temizlenmesine olanak tanır. Gen 2 ise genellikle daha büyük ve daha dayanıklı nesneleri içerir, bu nedenle temizleme işlemleri daha nadir ve maliyetli olabilir. Garbage Collector, genç nesil nesnelerini daha sık temizleyerek bellek verimliliğini artırmayı hedefler.
Dispose() ve Finalize() Nedir ?
Dispose = IDisposable interface’inden türemiş nesneler using(){} bloğu içinde oluşturulursa,using bloğundan çıkılır çıkılmaz GC(Garbage Collector)’ye devredilir ve hemen silinirler(Dispose edilirler).
Finalize = Finalize
metodu, nesne bellekten temizlenirken çağrılan bir metodudur. Ancak, .NET Garbage Collector tarafından, tam olarak ne zaman çağrılacağı belirsizdir. Bu nedenle, belirli bir zamanlamayla nesnenin kaynaklarını serbest bırakmak için güvenilmemesi gereken bir yöntemdir.
Yıkıcı Metot denilebilir ~Yık()
Interface ve Abstract Class Arasındaki Fark Nedir ?
Abstract Class | Interface |
Bir sınıf yalnızca bir abstract sınıfı inheritance yoluyla implement edebilir. Çoklu kalıtım (multiple inheritance) desteklenmez. | Bir sınıf birden fazla interface’i inherit edebilir, çoklu kalıtım (multiple-inheritance) desteklenir. |
Kendi constructor’ına sahip olabilir ve constructor içerisinde işlemler gerçekleştirebilir. | Constructor içermez, yani arayüzlerin bir yapıcı metodu yoktur. |
İçerik olarak, veri alanları (fields) ve property’ler gibi öğeleri içerebilir. | İçerisinde yalnızca metodların imzaları yer alır, içi dolu metod bulunduramazlar. Genellikle sadece metotları ve sabit değişkenleri içerir. |
Soyut sınıflar biraz daha performanslıdır. | Soyut sınıfa göre biraz daha yavaştır çünkü ilgili sınıftaki gerçek yöntemin aranması zaman alabilir. |
Metot ve değişkenlere farklı erişim modifikatörleri uygulanabilir | Arayüzlerin metotları varsayılan olarak public ve abstract olarak kabul edilir. Değişkenler genellikle public , static , ve readonly olarak kabul edilir |
Count Ve Length Arasındaki Fark Nedir ?
- Length ifadesi genellikle dizilerde kullanılır.
- Dizi uzunluğunu ifade eder.
- Count ifadesi genellikle koleksiyon türlerinde (List, HashSet, vb.) kullanılır.
- Koleksiyon elemanlarının sayısını ifade eder.
- Koleksiyon elemanlarının sayısını ifade eder.
Equals ve “= =” Arasındaki Fark Nedir ?
Equeals ilgili metodun içeriğinin aynı olup olmadığını kontrol ederken, == operatörü adreslerini kontrol eder. O yüzden değerleri aynı iken bile işaret edilen adresler farklıysa size false cevabı dönebilir.
Mocklama Nedir Ve Neden Yapılır ?
Mocklama, yazılım geliştirme süreçinde, bir nesnenin veya servisin simüle edilmesi veya taklit edilmesi anlamına gelir. Bu, yazılım birim testlerinde veya test odaklı geliştirmede sıklıkla kullanılan bir tekniktir. Mock nesneler, gerçek nesnelerin yerine geçerek kontrol edilebilir bir ortam sağlarlar.
Mocklama, birim testlerin birbirinden bağımsız ve izole bir şekilde çalışmasına olanak tanır. Bir testin başarısız olması diğer testleri etkilemez.
Void Metotları Test Etmek Neden Daha Zordur ?
Çünkü void metotlar geriye bir sonuç döndürmemektedir. Verimli bir test yapılabilmesi için de sonuç dönmeli ve beklenen değerle karşılaştırmamız gerekmektedir.
AsNoTracking Nedir ?
İşlevsel olarak veritabanından sorgu neticesinde elde edilen nesnelerin takip mekanizması ilgili fonksiyon tarafından kırılarak, sistem tarafından izlenmelerine son verilmesini sağlamakta ve böylece tüm verisel varlıkların ekstradan işlenme yahut lüzumsuz depolanma süreçlerine maliyet ayrılmamaktadır.
Static Kod Analizi Nedir ?
Statik kod analizi, derlenebilir durumdaki bir uygulama projesinin kaynak kodları incelenerek güvenlik zafiyetlerinin tespit edilmesidir. Projede temiz kod yazımını kolaylaştırır. Örneğin SonarQube.
Error Ve Exception Farkı Nedir ?
Error sınıfı doğrudan bizim kodumuzla ilgili olmayan hatalar için kullanılır ve bu hatalar kontrolümüz dışındadır. Exception sınıfı ise doğrudan yazdığımız kodla ilgili bizim kontrolümüzde olan hatalar için kullanılır. Error :OutOfMemoryError gibi hande edilemeyen hatalardır. Fakat exception tipindeki hataları try-catch ile ele alabiliriz.
HTTP Kodları Ne Anlama Gelmektedir ?
Durum Kodu | Anlamı |
1xx | Bilgi Vermek |
100 | Devam |
2xx | Başarılı Durumlar |
200 | Ok (Tamam) |
201 | Created(Oluşturuldu) |
202 | Accepted(Obaylandı) |
3xx | Yönlendirme Durumları |
301 | Kalıcı Taşındı |
4xx | İstemci Hataları |
400 | Bad Request |
401 | Unauthorized (Yetki Yok) |
402 | Payment Required |
403 | Forbidden (Yasaklandı) |
404 | Not Found (Sayfa Bulunamadı) |
415 | Unsupported Media Type |
5xx | Sunucu Hatası |
500 | Internal Server Error |
502 | Geçersiz Ağ Geçidi |
505 | HTTP Version Not Supported |
Yield Keywordu Ne Anlama Gelmektedir ?
Yield anahtar kelimesi, koleksiyonun her öğesini bir kez döndürmek için kullanılır. Avantajı kod tekrarını azaltır ve verimliliği arttırır. Dezavantajı ise sadece bir değer döndürebilmektedir.
Managed ve Unmanaged Kod Nedir ?
Uygulamalarda bellek yönetimi Managed ve Unmanaged olarak iki şekilde gerçekleşmektedir. Managed uygulamalarda bellek yönetimi .NET tarafından,Garbage Collector ile yürütülerek işlemler için hafızada yer açma, işlemler bittiğinde ya da artık kullanılmadığında hafızayı temizleme gibi işlemler gerçekleştirilir. .Net uygulamalarında varsayılan olarak bu şekilde gerçekleşir. Unmanaged uygulamalarda ise bellek yönetimi kullanıcının kendisi tarafından manuel olarak yapılması gerekmektedir.
Overloading Nedir ?
Bir metotla birden fazla işlemi gerçekleştirmek için o metotla aynı isme sahip yeni metotlar tanımlanabilir.Tanımlanan yeni metotlar farklı parametrelere sahip olmalıdır ya da tanımlanan parametrelerin isimleri aynı ise türleri farklı olmalıdır.
Override Nedir ?
Miras alınan sınıftaki metodun ezilmesi işlemini sağlar, yani metodun içini değiştirmektir. Bir metodu override (geçersiz kılma) etmek için önce o metodun override edilmesine izin verilmesi gerekir. Bunun için iki yol vardır. Birincisi virtual ve ikincisi abstract anahtar kelimeleridir.
“Virtual” anahtar kelimesi temel sınıftaki metodun geçersiz kılınmasına izin verirken “abstract” anahtar kelimesi geçersiz kılma işlemini zorunlu kılar
Constructor Metot Nedir ?
Constructor, sınıfın bir örneği oluşturulduğunda otomatik olarak çağrılır ve genellikle sınıfın başlatılması, başlangıç değerlerinin atanması veya diğer ön ayarlamaların yapılması için kullanılır.
Bir constructor, sınıfın adıyla aynı isimde olmalıdır ve geri dönüş türü yoktur. İki tür constructor bulunmaktadır: parametresiz constructor (default constructor) ve parametreli constructor.
- Default Constructor (Parametresiz Constructor)
- Parametre Alan Constructor
- Constructor Overloading
- Static Constructor
Framework ve Kütüphane Farkı Nedir ?
Kütüphaneler projeye sonradan dahil edilir. Frameworkler projenin temelindedirler. Kütüphane kullanırken geliştirici kodun akışını kendi kontrol eder. Framework ise kodun akışını kendisi yönetir.
Pass by Reference Ve Pass by Value Nedir ?
- Pass by value fonksiyona parametre gönderirken o parametrenin bir kopyasının oluşturulup gönderilmesi ve metod içerisinde yapılan değişikliklerden metod içerisinde ki yeni değerin etkilenmesi,
- Pass by reference fonksiyona parametre gönderirken o parametrenin ram’de adresinin gönderilip metod içerisindeki yapılan değişiklerden orjinal değerin etkilenmesi.
Out ve Ref Nedir ?
Eğer bir metoda değişkenimizi parametre olarak gönderiyorsak birebir kopyasını göndermiş oluruz.Ve metod içerisinde o değişkenle ilgili yapılan değişikliklerden orjinal değer etkilenmez. Ancak bazen değer tiplerini de referansları ile metodlara parametre olarak vermek isteyebiliriz. Referans yolu ile metoda parametre olarak geçtiğimiz değişken üzerinde yapılacak bütün değişiklikler orjinal değeri etkileyecektir çünkü artık o metod içerisinde değişkenin bir kopyası değilde RAM’de ki adresi bulunmaktadır.
Metodu tanımlarken referans yolu ile iletilmek istenen değişkenin önüne “ref” yazılmalıdır.
ref = değişken metoda parametre olarak geçilmeden önce bir başlangıç değeri almak zorundadır.
out = değişken metoda parametre olarak geçilmeden önce bir başlangıç değeri almak zorundadır.
Checked ve Unchecked Nedir ?
Büyük değer aralığına sahip tipte tutulan değişkeni, küçük değer aralığına sahip bir tipte tutulan değişkene dönüştürmeye çalışıyorsak eğer olası veri kaybetme durumuyla karşı karşıyayız demektir.
Örneğin int tipte bir değişkeni decimal tipe çevirirsek sorun olmayacaktır çünkü decimal daha geniş bir tiptir. Ama tam tersini yaptığımızda hata almamız muhtemeldir.
Kısacası değişkenimizin türünü daha küçük bir tipe çevirirken veri kaybı oluyorsa program hata veriyor. Checked bloğu içerisinde cast işlemi yapılıyorsa, veri kaybı olduğu durumda çalışma zamanı hatası verecektir.
Unchecked kullanırsak değişkenimizin türünü daha küçük bir tipe çevirirken veri kaybı oluyorsa program hata vermeden devam edebiliyoruz.
static void Main(string[] args)
{
checked
{
decimal sayi = 9999999990;
int Sayi2 = (int)sayi;
}
}
Stored Procedure Nedir ?
Hazırlamış olduğumuz T-SQL kodunu kayıt edebildiğimiz SQL komutlarıdır. Böylece komutumuzu tekrar tekrar kullanılabilir hale getirebiliriz.
Trigger Nedir ?
Trigger (Tetikleyici), en genel anlamda kayıt ekleme, silme ve güncelleme sonucunda otomatik olarak devreye giren özel bir tür Stored Procedure olarak kabul edilir. Klasik manada Trigger, veri değişiminin hemen ardından loglar üzerinden otomatik devreye giren özel bir tür Stored Procedure’dür.
Örnek verecek olursak, satış tablosunda satış işlemi gerçekleştiğinde ürünün stok miktarının eksiltilmesi
Argüman ve Parametre Nedir ?
Argüman: bir metodu çağırırken içindeki değişkenlerdir
Parametre : metod tanımlarken kullanılan değişkenlerdir
Thread, ThreadPool ve Task Nedir ?
Thread(iş parçacığı) kendi program ve memory alanına sahip temel bir CPU kullanım birimidir. Bir zamanlayıcı tarafından bağımsız bir şekilde yönetilebilen talimatların en küçük bölümüdür. Thread’ler .NET’ e ait bir yapı değildir, OS’daki iş parçacıklarıdır.
Task yapılması gereken görevleri temsil eden bir nesnedir. Bir işi paralel olarak yürütmek istediğimizde bu yapıyı kullanırız. Async ve await anahtar kelimelerini kullanarak asenkron(eş zamanlı çalışan) uygulamalar gerçekleştirebiliriz.
ThreadPool threadlerin bulunduğu koleksiyondur, yapması için iş göndermek ve alabileceği thread sayısını belirtmekten başla bir kontrol sağlamaz.
Task’leri Eş Zamanlı Çalıştırmanın Bazı Yöntemleri Nelerdir ?
- async await
- Task.WaitAll ve Task.WhenAll
Race Condition Nedir ?
Race Condition
birden çok thread’in paylaşılan bir hafıza alanına aynı anda ulaşıp o alanı değiştirmesiyle meydana gelir. Race Condition
‘lar genellikle uygulamanın doğru çalışmasını bozdukları için bug
olarak adlandırılırlar.
Configure.Await(false) = Kilitlenmiş bir thread’de devamlılığı sağlamak için farklı bir thread ile işlem yapabilmesine izin vermektir.
Threadler Kaç Farklı Şekilde Çağırılabilir ?
- Thread Sınıfını Kullanarak
- Thread Pool’u Kullanarak
Her iki yöntemde de iş parçacığı başlatma ve yönetme işlemleri farklı şekillerde gerçekleşir. Thread Pool’u genellikle kısa süreli ve yoğun olmayan işler için uygundur, çünkü Thread Pool’daki iş parçacıkları tekrar kullanılır ve yeniden kullanılabilirlik açısından avantaj sağlar. Thread sınıfı ise daha özel durumlar ve özelleştirilmiş kontrol gerektiren durumlar için kullanılabilir.
Try Catch Avantajı ve Dezavantajı Nedir ?
En önemli avantajı hatayı yakalayıp fırlatmaktır bilindiği gibi, fakat bunun şöyle yan bir etkisi bulunmaktadır. Kodun işleminin başarıyla beklemesini beklediği için zaman kaybına sebep olmaktadır. Belki bunu bir çoğumuz ihmal etmektedir. Buna iyi bir çözüm ise loglama olabilir.
Dependecy Injection Hangi Şekillerde Yapılabilir?
- Constructor Injection (Yapıcı Metot Enjeksiyonu)
- Property Injection (Özellik Enjeksiyonu)
- Method Injection (Metot Enjeksiyonu)
Bir try/catch/finally yapisi düsünün. try bünyesinde bir unchecked exception olustugunda finally blogu devreye girer mi?
Evet, finally
bloğu, try
bloğu içinde bir hata (exception) olsun ya da olmasın her zaman çalıştırılır.
Finally ve Finalize Nedir ?
finally
bloğu, bir try-catch
yapısının bir parçasıdır ve her durumda çalıştırılmasını istediğiniz kodu içerir. Bu blok, try
bloğu içindeki kod çalıştırıldıktan sonra veya catch
bloğu içinde bir exception yakalandıktan sonra her zaman çalıştırılır.
finalize
metodunu C# dilinde kendiniz çağırmazsınız; bu, garbage collector tarafından kullanılır. finalize
metodu, bir nesne yok edildiğinde (garbage collector tarafından toplandığında) çağrılır.
Ancak, C# dilinde finalize
metodunun doğrudan çağrılması önerilmez. Bunun yerine IDisposable
arayüzünü kullanarak Dispose
metodunu uygulamak ve IDisposable pattern’ini takip etmek daha uygundur.
Web Servisleri Nedir ? Soap ve Rest Farkı Nedir ?
Web servisleri, farklı uygulamaların birbirleriyle iletişim kurmalarını sağlayan yazılım bileşenleridir. Bu servisler, HTTP protokolü üzerinden veya başka protokoller aracılığıyla iletişim sağlarlar. Web servisleri, farklı platformlar ve programlama dilleri arasında veri paylaşımını ve etkileşimi kolaylaştırmak için kullanılır.
SOAP, web servisleri arasındaki iletişimi tanımlayan bir protokoldür. XML tabanlı bir mesajlaşma protokolüdür ve genellikle HTTP, SMTP veya TCP gibi protokoller üzerinden iletişim sağlar
REST, web servisleri için bir mimari stildir. RESTful servisler, kaynaklar (resources) üzerinden temsil edilen durumları kullanır ve HTTP metodları (GET, POST, PUT, DELETE vb.) üzerinden bu kaynaklarla etkileşimde bulunur. REST, genellikle JSON veya XML formatında veri değişimi sağlar.
SOAP, bir protokoldu, REST ise bir mimari stildir. SOAP, XML tabanlı bir mesajlaşma protokolüdür, REST ise HTTP protokolü üzerinden çalışır.
SOAP, genellikle XML formatında veri alışverişi yapar. REST ise JSON daha yaygın olarak tercih edilir.
SOAP, özellikle büyük ve karmaşık sistemlerde kullanılabilecek kapsamlı bir protokoldür. REST ise daha hafif, basit ve genellikle web uygulamalarında tercih edilen bir yaklaşımdır.
XML ve JSON Arasındaki Fark Nedir ?
XML, karmaşık ve daha az esnektir. JSON, daha küçük dosya boyutlarına ve daha hızlı veri iletimine sahiptir.
Unit Test İle Integration Test Arasındaki Fark Nedir ?
Integration Test bize bir şeyin çalışıp çalışmadığını söylerken, Unit Test neden çalışmadığını söyler. Unit Test yazılımcı perspektifinden bakarken, Integration Test kullanıcı perspektifinden yazılır
Unit Test = Uygulamamızın ufak bir bölümünü bağımsız bir şekilde test etmeye yarar. Örneğin araba fiyatlarını listeleyen bir metodu.
Integration Test = Birbirleri ile bağlı bir şekilde çalışan bir kaç modülü test edebilmemizi sağlayan test türüdür.
Design Pattern Nedir ? Ve Örnekleri Nedir ?
Design patterns yazılım geliştirmede yaygın olarak karşılaşılan zorluklar için yeniden kullanılabilir nesne yönelimli yazılımlardır. Yinelenen tasarım sorunlarına zaman içinde test edilmiş yanıtlardır. Hem bir çözümün açıklamasını hem de belirli bir sorunu ele alırken kullanımını açıklar.
Bir tasarım kalıbı, bırakıp hemen kullanmaya başlayabileceğiniz bir kütüphane veya çerçeve değildir. Birçok geliştiricinin daha önce üstesinden geldiği bir sorunla karşılaştığında kullanılması önerilen, yerleşik bir düşünme tekniğidir. Özetle tasarım kalıpları, halihazırda yapılmış olanı yapmaktan kaçınmanıza yardımcı olur.
- Dependency Injection (Bağımlılık Enjeksiyonu):
- .NET Core, bağımlılık enjeksiyonunu destekler ve bu tasarım deseni, bileşenler arasındaki bağımlılıkları azaltmak ve test edilebilirliği artırmak için yaygın olarak kullanılır.
- Repository Pattern:
- Repository pattern, veritabanı işlemlerini soyutlamak ve iş mantığını veritabanı erişiminden ayırmak için kullanılır. .NET Core uygulamalarında Entity Framework Core gibi ORM (Object-Relational Mapping) araçlarıyla birlikte sıkça kullanılır.
- Unit of Work Pattern:
- Unit of Work pattern, bir işlem boyunca bir veya birden fazla repository üzerinde yapılan işlemleri gruplandırmak için kullanılır. Genellikle Entity Framework Core ile birlikte kullanılır.
- Singleton Pattern:
- Singleton pattern, bir sınıfın tek bir örneğini oluşturmak ve bu örneğe global bir erişim noktası sağlamak için kullanılır. .NET Core’da servislerin ve uygulama genelinde paylaşılan nesnelerin oluşturulmasında kullanılabilir.
Coupling ve Cohesion Nedir ?
Coupling yazılım modulleri arasında bağlılığın derecesidir. Bu modüllerin birbirne bağlılığının ölçüsüdür.
Peki Cohesion nedir. Yazılım dünyasında cohesion coupling in tam tersidir. Coupling arttıkça cohesion azalır, cohesion arttıkca coupling azalır.Cohesion modullerin içindeki elemanların birbirine aitlik derecesidir. Peki nedir bu elemanlar? Bir sınıfı örnek verecek olursak; bu elemanlar property’lere, metodlara karşılık gelmektedir. Bu metodlar ve propertyler birbirine ne kadar benzer ise cohesion o kadar yüksektir.
Kısacası coupling modullerin birbirleri arasındaki bağlılık derecesi, cohesion ise bu modullerin içindeki elemanların birbirine bağlılık derecesidir.
Yazılım projelerinde genellikle yüksek cohesion, düşük coupling istenir. Bir yazılım projesinde cohesion ne kadar yüksek, coupling ne kadar düşük olursa, maintainablity yani sürdürülebilirlik, reusablity yani tekrar kullanılabilirlik o kadar yüksek olur.
Tip Kontrolleri Hakkında Bilgi Verebilir Misiniz ?
GetType = Bir değişkenin tipini öğrenmek için kullanılır.(isim.GetType().ToString())
TypeOf = Bir değişken tipinin başka bir değişken türüne ait mi diye bakılır.(yas.GetType() == typeof(int))
as ve is = is kontrolü geriye false gönderir ama as kullanırsak null döner.
Implicit ve Explicit Nedir ?
C#’ta bilinçli ve bilinçsiz olmak üzere iki tür veri dönüşümü söz konusudur. Bilinçsiz olarak yapılan tür dönüşümü Implicit Conversion şeklinde tarif edilirken, bilinçli dönüşüme ise Explicit Conversion diye nitelendirilmektedir.
Operatörlere Aşırı Yükleme= Eğer ki aralarında ilişki olmayan sınıflar arasında Implicit ve Explicit Conversion yapmak istiyorsanız bu sınıfların dönüşüm antlaşmalarını oluşturmanız gerekecektir.
public static implicit operator Mile(Kilometer kilometer)
{
// Kilometreleri mil birimine dönüştür
double miles = kilometer.Value * 0.621371;
return new Mile(miles);
}
Not=Bir sınıf içerisinde aynı işleve sahip hem implicit hem de explicit metot bulunamaz.
Comparable ve Comparator Nedir ?
IComparable
ve IComparer
arayüzleri, sıralama işlemlerini özelleştirmek için kullanılır. Bu arayüzler, bir nesnenin diğerine göre sıralanma kriterlerini belirlemek ve karşılaştırma mantığını özelleştirmek amacıyla uygulanır.
IComparable
Arayüzü:
IComparable
arayüzü, bir nesnenin kendisini başka bir nesne ile karşılaştırmak için kullanılır. Bu arayüz, bir sınıfın nesnelerini doğrudan Array.Sort
veya List.Sort
gibi sıralama işlevlerinde kullanılabilir hale getirir.
IComparer
Arayüzü:
IComparer
arayüzü, iki farklı nesneyi karşılaştırmak için bir yardımcı sınıf sağlar. Bu arayüzü uygulayan sınıflar, karşılaştırma mantığını özelleştirir.
Neden Static Keyword’ünü Kullanmaktan Kaçınmalıyız ?
OOP’ye zıt bir yapıdır. Çünkü nesneye yönelimli programlamada yeni bir nesne oluştururuz. Daha sonra o nesneden belirtilen değişkenlere erişebiliriz. Ogrenci ogrenci = new Ogrenci(); tarzında kullanırız. Fakat static değişken kullandığımızda sadece sınıf ismi ve değişkeni kullanmanız yeterlidir. Ogrenci.staticValue ; Bu da nesneye yönelimli programlama mantığını bozar.
Throw ve Throw New Exception Arasındaki Fark Nedir ?
throw
ifadesi kullanıldığında, yakalanan istisnai durumun türü değiştirilmez. Yani, orijinal hatanın türü ve bilgileri korunur.throw new Exception()
ifadesi kullanıldığında, yeni bir istisnai durum oluşturulur ve bu durumun türü, mesajı ve diğer özellikleri belirtilebilir.throw
ifadesi, hatayı yakalayan blok içindeki kodun devam etmesine izin verir. Yani, yakalanan istisnai durumu inceleyebilir ve buna göre kodu yönlendirebilirsiniz.throw new Exception()
ifadesi, bir istisnai durum oluşturur ve bu durum atıldığında genellikle kod akışını durdurur. Yani, hemen ardından gelen kodlar çalıştırılmaz.
Record Nedir ?
record
ifadesi, immutability (değişmezlik) ve veri taşıma amacıyla kullanılan özel bir referans tipidir. record
ifadesi, genellikle hafif veri taşıma nesneleri, DTOs (Data Transfer Objects) veya sadece veri taşıma amaçlı kullanılan sınıflar için kullanışlıdır.
Değiştirilebilir ve kalıtım ihtiyacı olan nesneler için class kullanımı tercih edilebilir.
Değer eşitliği ve içerik karşılaştırmaları için record tercih edilebilir.
– Kısa ve net veri gösterimi için record tercih edilebilir.
Concurrent ve Parallel Nedir ?
- Concurrent (Eşzamanlı):
- Concurrent, birçok işlemin aynı anda başladığı ve devam ettiği bir durumu ifade eder. Bu, işlemlerin birbirine karışmasına izin veren veya aynı anda gerçekleşen bir yapıyı ifade edebilir. Fakat, gerçek paralel çalışma olmayabilir. Örneğin, bir iş parçacığı (thread) kullanılarak bir işlemin parçalanması ve bu parçaların sırayla veya eşzamanlı olarak çalıştırılması şeklinde olabilir.
- Parallel (Paralel):
- Parallel, işlemlerin aynı anda (gerçek paralel olarak) yürütüldüğü durumu ifade eder. Bu genellikle çok çekirdekli işlemcilerin ve paralel programlamayı destekleyen algoritmaların kullanıldığı durumları kapsar. C# dilinde
Parallel
sınıfı, bu tür paralel programlamaya olanak tanır.
- Parallel, işlemlerin aynı anda (gerçek paralel olarak) yürütüldüğü durumu ifade eder. Bu genellikle çok çekirdekli işlemcilerin ve paralel programlamayı destekleyen algoritmaların kullanıldığı durumları kapsar. C# dilinde
Sync: Bir iş yapar, sonra diğerlerini yapar.
Concurrent: Aynı anda birden çok iş yapar.
Parallel: Aynı anda bir kopya üzerinden birden çok iş yapar.
Async: Başka bir işe başlamak için diğer işin bitmesini beklemez.
Await kelimesi çalıştıracağı task’in işini bitirmesini beklerken diğer işlemlerin asenkron olarak devam etmesini sağlayan özelliği yani non-blocking olarak çalışmayı sağlar.
Class Library Nedir ?
Class Library adından da anlaşıldığı gibi sınıf kütüphaneleridir. Kısaca, projelerimizde kullanacağımız iş yapan sınıflarımızı projemizden soyutlayıp, ayrı bir uygulama gibi yazıp, gerektiğinde bütün projelerimizde kullanamak üzere oluşturduğumuz sınıflar topluluğudur.
.NET Framework Nedir ve .Net Core İle Farkları Nelerdir ?
.NET Framework yeni nesil windows uygulamaları oluşturulması, çalıştırılması ve yönetilmesi gibi işlemler için gerekli altyapıyı sağlayan bir platformdur.
.NET Framework öncelikle Windows odaklı ve eski nesil uygulamalar için kullanılırken, .NET Core ve onun devamı olan .NET 5 ve sonraki sürümler çok platformlu, hafif ve modüler uygulama geliştirmeyi destekler.
Derlemek Nedir ?
Derleyici, yüksek seviye bir programlama dilinde yazılmış bir kaynak kodun, başka bir hedef dile veya bilgisayarın/işlemcinin anlayabileceği makine diline çevirme işlemidir.
CTS, CIL, CLR ve CLS Nedir ?
CLR – Common Language Runtime
.Net framework altında bulunan dillerden herhangi biriyle program yazdığımızda kodlar ilk olarak CIL (common intermadiate language) diğer bir deyişle IL dediğimiz byte kodlara dönüşür. Bu IL kodları aslında çalıştırılabilir kodlar değildir ve çalıştırılabilmesi için bir ara programa ihtiyaç vardır. Bu ara program da CLR’dır. CLR dönüştürülmüş olan byte IL kodlarını alıp bir JIT (Just-In-Time) derleyicisini etkinleştirerek makine koduna dönüştürür ve çalıştırır.
CLS- Common Language Specification
CLS için .Net framework çatısı altında bulunan programlama dillerinin ortak noktalarını barındırır ve programımızın diğer dillerle olan etkileşimini sağlar. Diller arasında ortak kullanılan yapılar ve onların birtakım kuralları bulunmaktadır. Yazdığınız kodların diğer programlama dilleriyle geliştirilen projelerde de kullanabilir olması istiyorsanız, Common Language Specification kurallarına uyumlu kodlar yazmamız gerekmektedir. Bu kurallara uygun geliştirdiğiniz kodlar, CLS desteği olan diller tarafından yorumlanabilir ve böylece diller arasında ki iletişim sağlanmış olur.
CTS- Common Type System
CTS CLR’ın bir alt kümesidir diyebiliriz. Şöyle ki; Common Type System sayesinde programlama dillerinde kullanılan veri türlerinin(int,double,byte,string etc.) arasında da uyum sağlanmış olur.
Örnek olarak; .Net framework altında bulunan bütün dillerde int,double,float vs. gibi tiplerin ram’da kapladıkları yer aynıdır ve bu dillerden biri için derlenen kodlar referans olarak diğerinde de kullanılabilmektedir. Bu nedenle Framework içerisinde bulunan tüm dillerde CTS den dolayı ayni kurallara sahip veri tiplerini kullanılır farklı olan şey syntax’dır.
MIME Nedir ?
MIME (Multipurpose Internet Mail Extensions), internet üzerinde medya türlerini ve dosya formatlarını tanımlamak için kullanılan bir standarttır. MIME, özellikle e-posta gönderimi ve internet üzerinden dosya transferi gibi iletişim protokollerinde kullanılır.
.Net State Management Nasıl Çalışır ?
İki şekilde yapılabilir. Birinci seçenek server side ikinci seçenek client side.
Istemci Tarafı (Client-Side State Management)
- Hidden Field
- View State
- Cookies
- Control State
- Query Strings
Sunucu Tarafı (Server-Side State Management)
- Session
- Application
Session ve Cookie Farkı Nedir ?
Session, cookie gibi data saklamaya yarar fakat cookie den büyük bir farkı vardır. Session da bilgiler server tarafında tutulur. Bu yüzden server da oluşabilecek problemlerde sessionlar da etkilenir. Bununla beraber sessionların yüksek trafikli durumlarda kullanılması tavsiye edilmez, çünkü sessionlar bellekte (in-memory) tutulduğu için yoğunlukla beraber belleğin şişmesine sebep olabilir.
Buna çözüm olarak alternatif yollar vardır. Örneğin session bilgilerini Redis üzerinde tutmak.
Stringbuilder ile String arasındaki Fark Nedir ?
string (System.String) : Immutabledır. Yaptığımız her işlem sonunda yeni bir memory üzerinden value okunur. Daha önce var olan memory boşa kalır ve garbage collector bu memory temizler. Yani biz ne zaman elimizde olan string değişkenini güncellersek, yeni bir object oluşur ve değişkenimiz bu objeyi referans edinir. eski obje referanssız kalarak yukarıda belirttiğim gibi çöpe atılmayı bekler.
String.Builder : Mutabledır. Yani elimizdeki string’i StringBuilder classından oluşturup append etmek vs gibi operasyonları yaptığımızda, memory’de yeni bir object oluşmaz. StringBuilder’i initialize ettiğimizde elde ettiğimiz objenin üzerinde değişiklikler yapılır.
FirstOrDefault() ve SingleOrDefault() Arasındaki Fark Nedir ?
Örneğin elimizde bir dizi olsun. Eğer bu diziden 2 den büyük sayılar için SingleOrDefault() dersek ve birden fazla 2 den büyük sayı varsa hata verecektir. FirstOrDefault() dersek 2 den büyük ilk sayıyı alacaktır. Eğer sadece Sıngle() dersek şartımıza uyan değer yoksa InvalidOperationException hatası verecektir. SingleOrDefault olduğu için değer bulamayınca 0 değeri geri dönecektir.
Nullable Tür Nedir Ve Nasıl Kullanılır ?
C#’ta Nullable
türü, değer tiplerine (int
, float
, double
, DateTime
gibi) null değerini atayabilmemizi sağlayan bir yapıdır. Değer tipleri normalde null değeri alamazlar; ancak Nullable
türü kullanılarak bu kısıtlama aşılabilir.
Nullable
türü, genellikle “?” işareti kullanılarak belirtilir. Örneğin, int?
, double?
gibi.
Caching Nedir ?
Cache önceden elde edilmiş verilerin sonradan kullanılmak üzere önbellekte saklanmasıdır. Sık kullanılan ve nadir güncellenen ya da üretilmesi maliyetli verilere erişim böylelikle hızlanmış olur. Verinin nerede nasıl saklanacağı Caching olarak adlandırılır. In-Memory olarak aynı sunucu önbelleğinde veya Distributed olarak farklı bir sunucu önbelleğinde depolanabilmektedir.