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.
class Musteri { public string AdSoyad; public ulong TCNo; public int OdaNo; }
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.
class Musteri { private string AdSoyad; private ulong TCNo; private int OdaNo; public string adsoyad { get { return AdSoyad; } set { AdSoyad = value; } } public ulong tcno { get { return TCNo; } set { if (value.ToString().Length == 11) TCNo = value; else Console.WriteLine("HATA! TC Kimlik Numarası 11 Haneli Olmalıdır."); } } public int odano { get { return OdaNo; } set { if (value > 0 && value <= 120) OdaNo = value; else Console.WriteLine("HATA! Oda Numarası 1-120 Aralığında Olmalıdır. "); } } } class Program { static void Main(string[] args) { Musteri m1 = new Musteri(); m1.adsoyad = "Serdar Yılmaz"; // adsoyad özelliğinin SET metodu çalıştı. m1.tcno = 14548617718; // tcno özelliğinin SET metodu çalıştı. m1.odano = 110; // odano özelliğinin SET metodu çalıştı. // adsoyad, tcno ve odano özelliklerinin GET metodu çalıştı. Console.WriteLine("Ad/Soyad:{0} - Tc No:{1} - Oda No:{2}", m1.adsoyad, m1.tcno, m1.odano); } }
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.
private string AdSoyad; public string adsoyad { get { return AdSoyad; } private set { AdSoyad = value; } }
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
Çok güzel, açık ve anlaşılır yazmışsınız, kafamda soru kalmadı saolun
Teşekkür ederim kafamdaki karışıklık sayenizde gitti. Elinize Sağlık.
Kolay ve anlaşılır şekilde. Teşekkür ederim kendi adıma. Emeğinize sağlık
sen nasıl bir kralsın abi
Hocam örnekte şu kısmı anlamadım rica etsem açıklar mısınız:
”
private string AdSoyad;
public string adsoyad
{
get
{
return AdSoyad;
}
private set
{
AdSoyad = value;
}
}
”
Burada madem set’e özel if else tanımlamayacağız o zaman neden get ve set kullandık?
knk if else ile değil sadece metot çağırılınca çalışacaklar.
Serdar Bey, gerçekten güzel bir anlatım. Udemy’den kurslar aldım. Teknik olarak iyi anlatımlar var, ancak sizin anlatımınız oldukça sade ve anlaşılır.
Bir bilişim öğretmeni olarak sizin örneği öğrencilerime anlatırken kullanmak isterim, sizin için de sakıncası yoksa..
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.
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.
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?
Hocam merhabalar.
public string AdSoyad;
public string AdSoyad { get; set; }
aralarındaki fark nedir anlatır mısınız?
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 ?
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.
Teşekkürler.
Serdar bey oldukça faydalı bir anlatım olmuş teşekkürler emeğiniz için
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
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
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
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.
olması lazım değilmiydi
11 15 This.AdSoyad 23 28 This.TCNo 37 42 OdaNo satırlarında
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/
abi adamsın
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…