Serdar YILMAZ / Software Developer
Bizimkisi Bir “Bug” Hikayesi...
Akbank Bankacılık Merkezi
Serdar Yılmaz C# – GET ve SET Metotları

C# – GET ve SET Metotları

dotnet

Set ve Get metotlarını birer kontrol mekanizması olarak düşünebiliriz. Olası problemleri önlemek, işlemleri güvenilir ve kontrollü bir şekilde gerçekleştirmek için Set ve Get metotlarını kullanırız.

Basit bir senaryo üzerinden konumuzu açıklamaya devam edelim. Otel otomasyonu için müşteri bilgilerini tutan bir sınıf tasarladığımızı düşünelim. Müşterinin ad-soyad, TC kimlik numarası ve oda numarası bilgilerini tutmak istiyorsak aşağıdaki gibi bir tasarım yapabiliriz.

Musteri sınıfının üyeleri public olarak bildirildiği için bu üyelere doğrudan erişilip değerler atanabilir. İşte bu noktada kontrolü elimize almamız lazım aksi taktirde TC kimlik numarası eksik/fazla girilebilir veya 120 odalı bir otelde oda numarası negatif veya 120’den büyük girilebilir. Amacımız dikkatsizlik sonucu yaşanabilecek olası sorunların önüne geçmek. Bu yüzden üyelere doğrudan erişimi engelleyip (Private), Get ve Set metotları ile kontrollü bir erişim sağlayacağız.

Sınıfın AdSoyad, TCNo, OdaNo üyelerini diğer sınıfların erişimine kapattık (private) ve bu üyelere olan erişimi adsoyad, tcno, odano özellikleri üzerinden kontrollü bir şekilde sağladık. (else bloklarında exception fırlatabilirdik ancak istisnai durum yönetimini anlatmadığımız için şimdilik es geçiyoruz.)

GET Metodu

Bir özelliğin değeri okunmak istenildiğinde o özelliğe ait GET metodu çalışır.

Console.WriteLine(m1.adsoyad);

m1 nesnesinin içerisindeki adsoyad özelliğinin Get metodu çalışacaktır.

SET Metodu

Bir özelliğe atama yapılmak istenildiğinde o özelliğe ait SET metodu çalışır. Atanan değere SET metodu içerisinde value anahtar sözcüğü ile erişilir. value anahtar sözcüğünün önceden belirlenmiş herhangi bir türü yoktur. Özelliğe atanacak değer hangi türden ise value da o türden olur.

m1.adsoyad=”Serdar Yılmaz”;

m1 nesnesinin içerisindeki adsoyad özelliğinin SET metodu çalışacaktır ve value ifadesi “Serdar Yılmaz” değerini alacaktır.

Bir özelliğin sadece GET metodunu tanımlayarak özelliği sadece okunabilir hale getirebiliriz.

Erişim Belirleyicisi Kullanımı

GET ve SET metotlarında erişim belirleyicilerini kullanarak erişimin sınırlarını belirtebiliriz.

Yukarıdaki örneğimizde SET metodu private olarak bildirildi. Bu yüzden diğer sınıflardan adsoyad özelliğinin değeri okunabilir ancak herhangi bir atama yapılamaz (set metoduna sadece sınıfın içinden erişilebilir). Eğer SET metodunu private olarak bildirmeseydik; adsoyad özelliği public olduğu için SET metodu da otomatikmen public olacaktı.

GET ve SET metotları için herhangi bir erişim belirteci bildirilmezse, varsayılan olarak özelliğin erişim belirtecini alırlar.

Serdar YILMAZ


Bu İçeriği Arkadaşlarınızla Paylaşmak İster misiniz?

16 Yorum

  1. Melih
    25 Ocak 2019 de 00:26 · Cevapla

    Merhabalar, get set metodlarının birde “get; set;” şeklinde hiç kelebek parantez açmadan kullanım şekli var. Bu konuya değinmemişsiniz. Bu konuda yardımcı olursanız çok sevinrim.

    • Serdar Yılmaz
      25 Ocak 2019 de 01:03 · Cevapla

      Merhaba,

      Eğer get ve set metotları içerisinde herhangi bir tanımlama yapılmayacaksa, get ve set metotları için süslü parantezlerle metot gövdesi oluşturmak yerine direkt “;” ile bitirilip, bir değişken gibi kullanılabilir.

      • Emre
        27 Şubat 2019 de 02:24 · Cevapla

        Merhaba,
        “Eğer get ve set metotları içerisinde herhangi bir tanımlama yapılmayacaksa, get ve set metotları için süslü parantezlerle metot gövdesi oluşturmak yerine direkt “;” ile bitirilip, bir değişken gibi kullanılabilir.”
        gibi kullanmak istediğimde Class program’da örneğin AdSoyad. dediğimde AdSoyad bir metot olarak gelmiyor. İngiliz anahtarı şeklinde bir simgeyle çıkıyor ve program classında değer ataması yapamıyorum. bunun sebebi nedir?

  2. Adile Çetinkaya
    6 Aralık 2018 de 15:57 · Cevapla

    Hocam ilk başta private olarak belirleyip
    private string AdSoyad;
    private ulong TCNo;
    private int OdaNo;
    neden daha sonra public olarak yazdınız
    public string adsoyad ?

    • Serdar Yılmaz
      6 Aralık 2018 de 23:56 · Cevapla

      Merhaba,
      “private ulong TCNo;” satırı ile tanımlamış olduğumuz TCNo değişkenini public olarak tanımlamış olsaydık; kullanıcı bu değişkene dilediği sayısal değeri atayabilirdi (TCNo=1; veya TCNo=100; gibi). Ancak T.C. Kimlik Numarası 11 haneli olmalıdır. Bu yüzden kullanıcının eksik veya fazla bir değer girmesini önlemek amacıyla doğrudan TCNo değişkenine atama yapmasına izin vermiyoruz(TCNo değişkenini private olarak tanımlamamızın nedeni bu). Bunun yerine;

      yukarıdaki kod blogu ile tcno adında bir özellik tanımlıyoruz. Bu özellik ile kullanıcının girmiş olduğu değerin 11 haneli olup/olmadığını kontrol ediyoruz ve eğer 11 haneli ise girmiş olduğu değeri TCNo değişkenine atıyoruz. Yani amacımız değişkenlere atanmak istenen değerleri kontrol etmek.

      private string AdSoyad;” satırı ile tanımlamış olduğumuz AdSoyad değişkenini public yapıp, adsoyad özelliğini tanımlamayada bilirdik. Sonuçta adsoyad özelliğinde herhangi bir kontrol yapılmamış. Kullanıcının girdiği değer direkt AdSoyad değişkenine aktarılmış. Ancak amacımız Get ve Set metotlarını öğrenmek olduğu için AdSoyad değişkenine de atamayı Get/Set metotları üzerinden yaptık. Ama siz isterseniz adsoyad özelliğinde; kullanıcının AdSoyad değişkenine sayısal bir değer girmesini önleyecek şekilde bir kontrol mekanizması kurabilirsiniz. Sonuçta AdSoyad değişkeni string olduğu için sayısal değerler de atanabilir ancak biz o değişkenin isim-soyisim bilgisini tutmasını istediğimiz için ve isim-soyisim bilgisinde de sayı olmaması gerektiği için adsoyad özelliğinde bunun kontrolünü yapabiliriz.

      • Adile Çetinkaya
        10 Aralık 2018 de 12:32 · Cevapla

        Teşekkürler.

  3. Hasan
    31 Ekim 2018 de 19:51 · Cevapla

    Serdar bey oldukça faydalı bir anlatım olmuş teşekkürler emeğiniz için

  4. adem
    20 Mayıs 2018 de 11:43 · Cevapla

    benim sorum şu olacak . c# veya java da Math.exp(90) yazdıgımızda sayı sonusz basamaklı cıkıyor. 4,1233123E+5 gibi bu sayıyı double nasıl yaparız. nasıl yuvarlarız ?teşekkurler

    • Serdar Yılmaz
      24 Mayıs 2018 de 16:53 · Cevapla

      Merhaba,

      Math sınıfı içerisindeki Exp() metodu zaten sonucu Double tipinde döndürmektedir.

      Exp() metodunun Math sınıfı içerisindeki bildirimi;
      public static double Exp(double d)

      Math.Exp(90) kodu geriye “1,22040329431784E+39” şeklinde double tipinde bir sayı döndürmektedir. Bu sayı ise sonsuz basamaklı değildir. Sadece daha okunabilir olması için farklı bir notasyon da gösterilmiştir. Sayının sonunda bulunan “E+39” ifadesi “10^39” anlamına gelmektedir. Ekrana 39 tane sıfır yazmak yerine “E+39” yazmak sonucu daha anlaşılır kılacaktır. Elde ettiğiniz bu sonuç üzerinde dilediğiniz aritmetik işlemi yapabilirsiniz.

      Eğer “1,22040329431784E+39” yerine, bu ifadenin açılımını görüntülemek istiyorsanız aşağıdaki kod satırı işinizi görecektir.

      double Sayi = Math.Exp(90);
      Console.WriteLine("Sonuç 1: " + Sayi);
      Console.WriteLine("Sonuç 2: " + Sayi.ToString("0." + new string('#', 339)));

      Ekran Çıktısı:
      Sonuç:1,22040329431784E+39
      Sonuç:1220403294317840000000000000000000000000

      • adem
        25 Mayıs 2018 de 10:36 · Cevapla

        serdar bee öncelikle teşekkür ederim. ben en çok sunun sıkıntısını yaşadım math.Exxp(90) +1 işleminin sonucunu yapamadım . yanı Math.Exp ile toplama cıkarma yapılamıyor. ama dedıgınız yontemı denıyecegım. 339 yazmıssınız #,339 onun anlamı nedir

        • Serdar Yılmaz
          25 Mayıs 2018 de 23:30 · Cevapla

          Double türünün hassasiyeti 16 bit dir yani sıfır içermeyen basamak sayısı maksimum 16 olabilir (Bknz: double (C# Reference)). Toplama ve çıkarma işlemleri ile alakalı sorunuzun cevabı burada yatmaktadır. Math.Exp(90) işleminin sonucu 1,22040329431784E+39 yani 1220403294317840000000000000000000000000 şeklindedir.

          Math.Exp(90) + 1 = (1220403294317840000000000000000000000000 + 1) işleminin sonucu 1220403294317840000000000000000000000001 olması gerekir ancak double’ın sıfır içermeyen basamak sayısı maksimum 16 olduğu için çıkan sonucun sadece “122040329431784” kadarını görebilmekteyiz. Geriye kalan basamakları 10’un kuvvetleri olacak şekilde ifade etmektedir.

          Double türünün yaklaşık aralığı ±5.0 × 10^(-324)±1.7 × 10^(308). Yani maksimum 339 basamaklı bir sayıyı tutabilmektedir. 339 yazmamızın nedeni bundan kaynaklanmaktadır. Özetle Double’ın sıfırdan farklı 16 basamak tuttuğunu gerisini 10’un kuvveti şeklinde ifade ettiğini bildiğimiz için sayının açılımını yazarken ilk 16 basamağını alıp, geriye kalan basamakları 0 olacak şekilde ekrana basıyoruz.

  5. Nurettin
    12 Mayıs 2018 de 22:40 · Cevapla

    olması lazım değilmiydi

  6. Nurettin
    12 Mayıs 2018 de 22:36 · Cevapla

    11 15 This.AdSoyad 23 28 This.TCNo 37 42 OdaNo satırlarında

    • Serdar Yılmaz
      14 Mayıs 2018 de 00:35 · Cevapla

      Merhaba,

      Bu uygulama için this anahtar sözcüğünü kullanma mecburiyetiniz bulunmamaktadır. This anahtar sözcüğünün kullanımı hakkında bilgin edinmek için aşağıdaki içeriğe göz gezdirebilirsiniz.

      https://www.srdrylmz.com/c-this-anahtar-sozcugu/

  7. umut
    20 Kasım 2017 de 01:55 · Cevapla

    abi adamsın

  8. murat
    16 Ekim 2017 de 13:02 · Cevapla

    Konu için teşekkürler, öğrenmiş oldum. Oldukça kullanışlı bi yapı.
    Kullanıcının girdiği veri kontrollerini ben farklı metotlarda yapıyordum zaten ama sanırm son bir kontrolu de bu sekilde eklesem iyi olur…

Bir Yorum Yapın