C#nedir?com
 
YAZAR HAKKINDA
Bilen YAVUZ
Bilen YAVUZ
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
1 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: 1000000 decimal fonksiyon kullandigimiz operator public return static topla(i ushort ytl(1 ytl(2 ytl.kurus ytl.lira ytl’ye C# / VC#/.NET Bilen YAVUZ
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 19.12.2005
Okunma Sayısı : 19785
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 10.8.2020
Turhal Temizer
Mac OS/X Removing CUDA 10.8.2020
Burak Selim Şenyurt
Sekiz Saatlik Sonsuz Döngü 10.8.2020
Burak Selim Şenyurt
Switch Case Kullanmadan Kod Yazılabilir mi? 10.8.2020
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
C#'ta Tip Çevirimleri
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Tip çevrimleri (type casting) , tip güvenli (type safe) bir platform olan .NET Framework ile kod geliştirirken çok sık kullandığımız bir mekanizmadır. Peki bu kadar çok kullandığımız bu mekanizmanın yapabileceklerini biliyor musunuz? Bu makalede tip çevrimi konseptini, gizli ve açık çevrimleri tanıyacaksınız. Sonra da kendi yazdığımız sınıflar için nasıl tür çevrimini implement ederiz?’i öğreneceksiniz.

Tip Çevrimleri (Type Casting)

Bu yıl (2005) ocağını hepimiz hatırlarız. Hayatımıza ytl diye bir kavram girdi yıl başında. Bütün herşeyi etkileyen bu değişim yazılım sektörünü de büyük zahmetlere soktu. Önceden altı sıfırlı paramızdan bu altı sıfırın çıkarılması neden yazılımları bu kadar etkiledi. Eskiden bol sıfırlı olarak çalışan yazılımlarımız kuruş konseptine geçerken biraz zorlandılar.

Açık ve Gizli Çevrimler :

Bu sorunu aşmada çok sık kullandığımız ama çok kimseninde merak edip araştırmadığı bir teknik hayatımızı kurtarabilirdi “Tip çevrimleri” . İsterseniz kavrama çok alışık olmayan arkadaşlar için tip çevrimini örnekleyelim önce.

int i;
float f;

f = i; //(implicit) gizli tür çevrimi
i = (int)f; // (explicit) açık tür çerimi

Yukarıda görülebileceği gibi iki farklı türde i ve f değişkenlerimiz var. Biz bunları bir birine atarken gizli ve açık tür değişimleri yapabiliyoruz.

Kendi Sınıflarımız İçin Tip Çevrimi
Peki bu tür değişimlerini kendi sınıflarımız için implement edemez miyiz ? Gelin yukarıda bahsettiğim ytl problemini tür değişimleri ile çözelim.

Önce eski tl ile kullandığımız bir fonksiyonumuz olsun.

static int Topla(int a, int b)
{
      return a + b;
}

İşlemin daha kolay anlaşılması için önce basit bir fonksiyon ile başlamak istedim. Şimdi kendi ytl sınıfımızı oluşturalım. Ve bu sınıf int türü için aldığı tl değerlerini ytl ye çevirsin gizli olarak. Ytl değerlerini ise gizli olarak int’e çevirsin.

public class YTL
{
     private uint lira;
     public uint Lira { get { return lira; } }

     private ushort kurus;
     public ushort Kurus { get { return kurus; } }

     public YTL(uint lira, ushort kurus)
    {
          if (kurus > 99)
               throw new ArgumentException("Kuruş 99’dan büyük olamaz");

         this.lira = lira;
         this.kurus = kurus; 
    }

/// <summary>
/// tl’yi ytl’ye çevirir
/// </summary>
/// <param name="tl"></param>
/// <returns></returns>
static public implicit operator YTL(int tl)
{
     if (tl < 0)
         throw new ArgumentException("TL sıfırdan küçük olamaz");

     YTL ytl = new YTL(0, 0);
     ytl.lira = (uint)(tl / 1000000);
     ytl.kurus = (ushort)((tl - ytl.lira * 1000000) / 10000);

     if ((tl - ytl.lira * 1000000 - ytl.kurus * 10000) > 4999)
          ytl.kurus++;

     return ytl;
}

/// <summary>
/// ytl’yi tl’ye çevirir
/// </summary>
/// <param name="ytl"></param>
/// <returns></returns>
     static public implicit operator int(YTL ytl)
    {
          return (int)(ytl.Lira * 1000000 + ytl.Kurus * 10000);
    }

}


Şimdi ise bu ytl sınıfını eski tl fonksiyonunda kullanalım.

YTL i = new YTL(1, 50);
YTL j = new YTL(2, 50);
YTL k = Topla(i, j);
int p = k;
Console.WriteLine(p.ToString());
Console.ReadLine();

Yukarıdaki satırlar sorun olmaksızın çalışır ve p “4000000” değerini üretir.


Hatta YTL fonksiyonuna ToString() methodunuda eklersek

public override string ToString()
{
     return this.lira.ToString() + " yeni lira, " + this.kurus.ToString() + " yeni kuruş.";
}
ve şu satırları çalıştırırsak

YTL i = new YTL(1, 50);
YTL j = new YTL(2, 50);
YTL k = Topla(i, j);
Console.WriteLine(k.ToString());
Console.ReadLine();

Ekranda “4 yeni lira, 0 yeni kuruş.” Yazısını görürüz.

Açık ve Gizli Çevrimin Farkı

Burada dikkat edilmesi gereken bir konu tür çevrimi operatörlerinin önündeki “implicit” işaretidir. Bu fonksiyonları eğer “explicit” işaretleseydik durum şöyle olurdu.

/// <summary>
/// tl’yi ytl’ye çevirir
/// </summary>
/// <param name="tl"></param>
/// <returns></returns>
static public explicit operator YTL(int tl)
{
    if (tl < 0)
        throw new ArgumentException("TL sıfırdan küçük olamaz");
    YTL ytl = new YTL(0, 0);
    ytl.lira = (uint)(tl / 1000000);
    ytl.kurus = (ushort)((tl - ytl.lira * 1000000) / 10000);

    if ((tl - ytl.lira * 1000000 - ytl.kurus * 10000) > 4999)
        ytl.kurus++;

    return ytl;
}

/// <summary>
/// ytl’yi tl’ye çevirir
/// </summary>
/// <param name="ytl"></param>
/// <returns></returns>
static public explicit operator int(YTL ytl)
{
    return (int)(ytl.Lira * 1000000 + ytl.Kurus * 10000);
}

Ve bu sınıfları kullanırken açık tür çevrimi yapardık.

YTL i = new YTL(1, 50);
YTL j = new YTL(2, 50);
YTL k = (YTL)Topla((int)i, (int)j);
Console.WriteLine(k.ToString());
Console.ReadLine();

İsterseniz tür çevrim operatörlerini ayrı ayrı açık (explicit) ve gizli (implicit) olarak işaretleyebilirsiniz.

CLR’ın Tip Çevrim Mucizesi ?

Bu kadarı sizi şaşırttı mı ? daha eğlence yeni başlıyor.?Şimdi aşağıdaki fonksiyonu incelemenizi istiyorum.

static decimal Toplad(decimal a, decimal b)
{
    return a + b;
}


Bu fonksiyon yukarıdaki topla fonksiyonun decimal versiyonu. Şimdi YTL sınıfını bu fonksiyon ile nasıl kullandığıma bakın.

YTL i = new YTL(1, 50);
YTL j = new YTL(2, 50);
YTL k = Topla(i, j);
YTL p = (int)Toplad(i, j);
Console.WriteLine(k.ToString());
Console.WriteLine(p.ToString());
Console.ReadLine();

Yukarıdaki kodu çalıştırdığımızda ise kod düzgün çalışır ve p 4 ytl 0 kuruş değer üretir. Bizim sınıfımız int’e gizli , int’ de decimal ’a gizli çevrilebildiği için “Toplad” fonksiyonunu ytl ile kullandığımız zaman JIT ytl yi önce int’e sonra da decimal’a çevirebiliyor. Fonksiyon decimal sonuç üretince , decimal int’e açıktan çevrilebildiği için, bizim sadece sonucu int’e açıktan çevirmemiz yeterli oluyor, çünkü biz int’i gizli olarak ytl’ye çevirebiliyoruz.

Özetlemek gerekirse özellikle eski kütüphanelerini yeni tipler ile kullanmak isteyen arkadaşlar eğer tür çevrimini iyi kullanabilirlerse bir çok zahmetten kurtulurlar. Bitirmeden önce dikkatinizi çekmek istedğim iki konu var.

1. “YTL” “int” sınıfından türemiyor. Yani alt üst sınıf ilişkisi yok.
2. int’ten yani eski liradan yeniye geçişdeki değer kaybı. Sonuçta kanun ile belirlenen bir değer kaybı olduğu için sorun yaratmaz ancak, siz başka sınıflar arasında tür çevrimleri yaparken bu değer kaybını göz önünde bulundurmayı unutmayın.


Hepinize iyi kodlamalar


Makale:
C#'ta Tip Çevirimleri C#, Visual C# ve .NET Bilen YAVUZ
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor