C# Bilgilerimizi Tazeyelim

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

file

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
file

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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir