Bu yazıda daha önce sunumlarda kullandığım bazı bilgileri paylaşacağım. C#'da doğru bildiğimiz yanlışları, mitleri, çalışma şekillerini inceleyeceğiz.
Soru 1: C# Kapalı Kaynaktır
A) Evet
B) Hayır
Soru 2: C#, C++ Gibi kendisinden daha alt seviye dillere göre daha yavaştır
A) Evet
B) Kısmen
C) Hayır
Soru 3: Her şey object'den mi türer?
A) Doğru
B) Yanlış (neden?)
Soru 4: int ve Inr32 arasındaki fark nedir?
A) Aynıdır
B) Int32 sarmalayıcı (wrapper) sınıftır
C) int derleme şekline göre 32 ya da 64bit olmaktadır
Soru 5: ForEach döngüsü kurabilmek için en az hangisi gerekir
A) Nesne dizi olmalıdır
B) Nesneye IEnumerable arayüzü uygulanmış olmalıdır
C) Nesnenin GetEnumerator() metodu olmalıdır
Soru 6: ADO.net ile işi biten bağlantıyı dispose etmeden önce close ile kapatmalı mıyız?
A) Evet
B) Hayır (neden?)
Soru 7: Bir a değişkeni için a == a her zaman true mudur?
A) Evet
B) Hayır (neden?)
Soru 8: Aşağıdaki kodun çıktısı ne olur?
int[] dizi = { 0, 2, 4 };
int deger = dizi[dizi[0]++];
Console.WriteLine(deger);
A) Patlar
B) 0
C) 1
D) 2
Cevaplar
1. Soru
C# ve .net açık kaynak ve ücretsizdir.
2. Soru
Teknik olarak C#'ın kendisini C++ ile yeniden yazmak mümkündür. Dolayısıyla şayet c++ konusunda çok uzmansanız bu soruya evet daha yavaştır denilebilir. Fakat, kim o kadar uzman ki? C# JIT esnasında işlemciye en uygun kodu üreterek benzer şekilde yazılmış c++ kodundan daha hızlı çalışabilir. Veya bir çok C++ kütüphanesinin uygulaması C# daki halinden daha performanslı değildir. Bu soruya "kısmen" demek sanırım daha doğru olacaktır. Şayet birisi x dili y dilinden daha hızlı mı diye düşünüyorsa ve bu dert ettiği ilk şey ise daha bu dünyaya yeni adım atmış demektir. Önemli olanın problemi en uygun maliyet ile çözmek olduğunu hatırdan çıkartmamak lazım.
3. Soru
Her şey object'den türememektir. Pointer türleri için base class yoktur.
Console.WriteLine(typeof(int*).BaseType?.ToString());
4. Soru
Bu ikisi birebir aynı şeydir. Benzer şekilde decimal = Decimal, string = String. İnsanların burada bir fark olduğunu düşünmelerinin sebebi Java gibi dillerde bunların gerçekten farklı olması olabilir.
Aşağıdaki kodu inceleyin:
using System;
namespace ConsoleApp8
{
class Program
{
static void Main(string[] args)
{
int a = int.Parse("5");
Int32 b = Int32.Parse("5");
Console.WriteLine(a + b);
}
}
}
Burada hem int hem de Int32 kullanılmıştır. Fakat bu kod IL koduna dönüştürüldüğünde C# kodundaki farklılık kalmamaktadır.
.entrypoint
.locals init (
[0] int32 a,
[1] int32 b
)
IL_0000: nop
IL_0001: ldstr "5"
IL_0006: call int32 [mscorlib]System.Int32::Parse(string)
IL_000b: stloc.0
IL_000c: ldstr "5"
IL_0011: call int32 [mscorlib]System.Int32::Parse(string)
IL_0016: stloc.1
IL_0017: ldloc.0
IL_0018: ldloc.1
IL_0019: add
IL_001a: call void [mscorlib]System.Console::WriteLine(int32)
IL_001f: nop
IL_0020: ret
5. Soru
Nesnenin GetEnumerator() metodu olmalıdır
6. Soru
Arka planda Close metodu zaten çağrıldığından işlem gereksizdir.
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = (DbConnectionOptions) null;
this._poolGroup = (DbConnectionPoolGroup) null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
7. Soru
Her zaman değil. Örneklerden birisi:
double a = double.NaN;
Console.WriteLine(a==a);
8. Soru
Cevap : 1. Nasıl mı? Kodu bir hatırlayalım.
int[] dizi = { 0, 2, 4 };
int deger = dizi[dizi[0]++];
Console.WriteLine(deger);
Adım adım çalıştıralım.
int deger = dizi[dizi[0]++]; // dizi[0] değeri okunur : 0;
int deger = dizi[0]; // okunan değer 0 olduğu için dizinin ilk değerine bakılacak ama henüz içerideki işlem bitmedi
dizi[0]++ //okuma dizinin 0. elemanının değeri 1 arttırılır ve değer 1 olur.
int deger = dizi[0]; // deger değişkenine dizi[0] atanır. dizi[0]'ı n mevcut değeri 1dir.
Umarım eğlenceli bir yazı olmuştur. Yeni yazılarda görüşmek üzere.