C # Mülakat Soruları
SORU
C # Mülakat Soruları

SORU
(mülakat klasiği: field vs property + inheritance)
class A
{
public int X = 1;
public virtual int P => X;
}
class B : A
{
public new int X = 2;
public override int P => X;
}
A obj = new B();
Console.WriteLine($"{obj.X} {obj.P}");
Çıktı hangisi?
A) 1 1
B) 1 2
C) 2 1
D) 2 2
Cevap 👉 B
Açıklaması
=> = “şu expression’ı döndür”
Getter / metot kısayolu
Bu soru field hiding + property override + referans tipi birleşimi olduğu için satır satır gidelim. Önce kodu etiketleyerek yazıyorum, sonra çıktıyı bağlayacağım.
Kod (satır satır açıklamalı)
class A
{
public int X = 1; // field (A sınıfına ait alan)
X→ fieldpublic→ her yerden erişilebilir- Değer:
1 - Virtual değil → polymorphism’e girmez
public virtual int P => X; // property (expression-bodied, virtual)
}
P→ propertygetvar,setyok (read-only)=> X→return X;virtual→ override edilebilir- Polymorphism burada başlıyor
class B : A
{
B, A’dan inheritance alıyor
public new int X = 2; // field (A.X'i gizler - hiding)
new→ method/field hidingA.Xsilinmez, gizlenirBiçindenXdenince →B.X = 2- Polymorphism yok, compile-time kararı
public override int P => X; // property override (polymorphism)
}
override→A.P’nin yerine geçer- Runtime’da gerçek nesne (
B) dikkate alınır - Buradaki
X→ B.X
A obj = new B(); // base class referansı, derived nesne
- Referans tipi:
A - Gerçek nesne:
B - Bu satır polymorphism’in klasik başlangıcı
Console.WriteLine($"{obj.X} {obj.P}");
obj.X
Xfield- `virtual değil**
- Compile-time kararı
- Referans tipi
A→A.X - Değer: 1
obj.P
Pvirtual property- Runtime kararı
- Gerçek nesne
B→B.P B.P→return X;BiçindekiX→2
Nihai çıktı
1 2
Doğru cevap
👉 B) 1 2
SORU
class A
{
protected int x;
public A()
{
x = 5;
}
public virtual int Value
{
get { return x; }
}
}
class B : A
{
public B()
{
x = 10;
}
public override int Value
{
get { return x * 2; }
}
}
A obj = new B();
Console.WriteLine(obj.Value);
Bu kodun çıktısı nedir?
A) 5 B) 10 C) 20 D) Compile-time error
Açıklması
class A
protected int x;
- field
protected→ sadece A ve A’dan türeyen sınıflar erişebilir
public A()
{
x = 5;
}
- constructor
Anesnesi oluşturuluncax = 5atanır
public virtual int Value
{
get { return x; }
}
- Polymorphism sadece
virtual/overrideile olur - property
virtual→ override edilebilirreturn x;
class B : A
public B()
{
x = 10;
}
- B constructor
- 👉 Constructor sadece çalışır. Ezmez, gizlemez.
- Önce A constructor çalışır →
x = 5 - Sonra B constructor çalışır →
x = 10 - Yani son durumda
x = 10
public override int Value
{
get { return x * 2; }
}
- override property
- Runtime’da bu çalışır
x * 2
Kritik satır (polymorphism)
A obj = new B();
- Referans tipi:
A - Gerçek nesne:
B
Console.WriteLine(obj.Value);
Valuevirtual- Runtime’da B.Value çağrılır
x = 10x * 2 = 20
Çıktı
20
✅ Doğru cevap: C
Aynı Soru İçin Different Explanation :)
class A
{
protected int x;
public A()
{
x = 5;
}
public virtual int Value
{
get { return x; }
}
}
class B : A
{
public B()
{
x = 10;
}
public override int Value
{
get { return x * 2; }
}
}
A obj = new B();
Console.WriteLine(obj.Value);
Çıktı ne olurdu soru
1) Sınıflar ve scope (kapsam)
class A { ... } scope’u
protected int x;
- field (alan).
protected: A sınıfının içinde ve A’dan türeyen sınıfların içinde erişilebilir. Yani B sınıfı x’e direkt erişebilir.
public A() { x = 5; }
- constructor:
Anesnesi oluşturulurken çalışır.
public virtual int Value { get { return x; } }
- property: dışarıya bir değer döndüren “kontrollü erişim”.
- virtual: “alt sınıf isterse bunu override edebilir” izni.
class B : A { ... } scope’u
B, A’dan inheritance alıyor.
public B() { x = 10; }
Boluşturulurken çalışır.xprotected olduğu için erişebilir ve değer atar.
public override int Value { get { return x * 2; } }
A.Value’yi override eder: “A’daki davranışın yerine bu geçsin.”- Burada
Valueartıkx * 2döndürür.
2) En kritik kısım: Nesne oluşturma sırası (constructor zinciri)
Şu satır çalışınca:
A obj = new B();
- Referans tipi: A
- Gerçek nesne: B
Ama nesne yaratılırken constructorlar zincir halinde çalışır:
- Önce base class constructor (
A()) çalışır
x = 5;
- Bu noktada
x= 5
2. Sonra derived class constructor (B()) çalışır
x = 10;
Bu noktada x = 10 (aynı field’a yeni değer)
✅ Yani nesne tamamen kurulduğunda x artık 10.
Burada “hiding” yok.
xyeniden tanımlanmadı (new int xgibi bir şey yok). Sadece aynı field’ın değeri constructor’da güncellendi.
3) Polymorphism: virtual + override ile runtime seçimi
Şu satır:
Console.WriteLine(obj.Value);
Valuebir property.AiçindeValuevirtual.BiçindeValueoverride.
Bu yüzden çağrı yapılınca C# şunu yapar:
- “Referans tipi A olsa bile, gerçek nesne B ise, override edilmiş versiyonu çalıştır.”
Yani çalışacak olan:
B.Value
Ve B.Value şunu döndürür:
get { return x * 2; }
x şu an 10 olduğu için:
x * 2=10 * 2= 20
Dolayısıyla çıktı:
20
4) Neden “compile-time error” değil?
A obj = new B();geçerli (upcasting).Valueproperty’siA’da var,public, erişilebilir.B,A’nınValue’sini doğru şekildeoverrideetmiş (imza aynı).xerişimiprotectedolduğu içinBiçinde sorun yok.
메타데이터
- post_id
- 8dcbd0f63121
- slug
- c-mülakat-soruları-8dcbd0f63121
- url
- https://medium.com/@hedaguler25/c-m%C3%BClakat-sorular%C4%B1-8dcbd0f63121
- canonical_url
- https://medium.com/@hedaguler25/c-m%C3%BClakat-sorular%C4%B1-8dcbd0f63121
- author_url
- https://medium.com/@hedaguler25
- status
- ok
- fetched_at
- 2026-08-22 18:17:17