C# get ve set nedir

ahmet5847 (92) 6 yıl önce sordu

class Program
    {
        static void Main(string[] args)
        {
            Turk T1 = new Turk();
            T1.Dil = "türkçe ";

            T1.Konus();
            

        }
    }

    abstract class Insan
    {
        public abstract string Dil { get; set; }

        public abstract void Konus();
    }

    class Turk : Insan
    {
        public string _dil;
        public override string Dil
        {
            get
            {
                return _dil;
            }

            set
            {
               _dil = value;
                
            }
        }

        public override void Konus()
        {
            Console.WriteLine("{0} dilini konuşuyor", Dil);
        }
    }
}

 

burdaki set in işlevi nedir ? Dil in değerini _dil'e mi aktarıyor ?

toprak34 6 yıl önce

@alattin

Toplam 2 cevap


alattin (17125) 6 yıl önce cevapladı

Dil, bir property.. Bu ne demek anlatmaya çalışayım. Örneğin bir class yani sınıfımız var. Bu sınıfın içinde bazı veriler saklamak ve daha sonra kullanmak istiyoruz. İşte property dediğim şey bu işe yarar. Property int, string, bool ve daha pek çok veri türünü saklar.

Bir class içinde değişken tanımladığında ve buna dışardan değer atamak istediğinde  property kullanırsın. Bir property içinde get ve set gibi ifadeler olur.

property'e değer atamak istediğinde set, içindeki değeri okumak istediğinde get çalışır.

Koduna dönersek;

Turk T1 = new Turk();
T1.Dil = "türkçe ";

burada senin oluşturduğun Turk sınıfından bir örnek türetiliyor ve Dil özelliğine "türkçe" değerini atıyorsun. Bu esnada set bölümünü çalışıyor.

Eğer get bölümünü çalıştırmak ve ekrana yazdırmak isteseydin

Console.Write(T1.Dil);

yeterli olacaktı ki burada property'nin get bölümünü çalışacaktı.

abstract tamamen farklı. abstract ifadesi temel bir sınıf tanımlamak için kullanılır. Bu şu anlama gelir bir class, abstract  ifadesi kullanıyorsa doğrudan kullanılmaz, başka sınıfların bunu miras alması gerekir. Bir nevi şablon gibi düşün.  abstract  sınıftan bir kopta oluşturamazsın. Aslında _dil değişkeni public değil private olsa daha anlamlı olurdu. Neden?

 private string _dil;


Senin örneğindeki kod C# ve farklı dillerde kullanılan bir tekniği içeriyor. Şimdi eğer _dil private olsaydı, buna dışardan erişmek mümkün olmayacaktı. Yani sen şu şekilde _dil'e erişemeyecek, değerini değitiremeyecektin:

Turk T1 = new Turk();
T1._dil = "Fransızca";

Ama uygulaman gereği sen bunun değerini değiştirmek, bazen de atanan değer üzerinde işlem yapmak isteyebilirsin. O zaman  ne yapacaksın? 

İşte bu durumda public property tanımlıyorsun. Bu public property, private olan değişkenin değerini değiştiriyor ve okuyabiliyor. Bir nevi aracı gibi.

Bildiğin üzere private, sadece  bulunduğu kapsamsan erişilebilir, metodun içindeyse sadece metodun içinden, class'ın içindeyse sadece class'ın içinden gibi. Fakat public öyle değildir, herkese açıktır. Anlaşılabilir olsun diye basitçe anlatmaya çalışıyorum.

private string _dil;
public string Dil
{
            get
            {
                return _dil;
            }
            set
            {
               _dil = value;
                
            }
}

Yukarıdaki kodu  C#'da şu şekilde de yazabilirsin:

public string Dil{get;set;};

Buna da otomatik property deniyor. Senin için hem private alanı(_dil) hem de public özelliği otomatik tanımlar (Dil)

  class Program
    {
        static void Main(string[] args)
        {
            // Turk sınıfından yeni bir örnek türetiyorsun.
            Turk T1 = new Turk();
            // T1 adındaki nesnenin Dil özelliğine erişiyor ve değer atıyorsun.
            // Doğal olarak aslında _dil değişkeninin değerini değiştiriyorsun
            T1.Dil = "türkçe ";
            // T1 içindeki Konus() metodunu çağırıyorsun.
            T1.Konus();
        }
    }

    abstract class Insan
    {
        public abstract string Dil { get; set; }

        public abstract void Konus();
    }

    class Turk : Insan
    {
        //  public string _dil; bu satır private olursa daha mantıklı olur
        private string _dil;

        //private olan _dil'e dışardan nasıl erişeceksin? cevabı Dil property'sinde
        // Dil sana dışardan private olan _dil değişkenine erişmeni sağlar.
        // Dışardan erişmekten kasıt, kapsam dışı. Örneğin  static void Main bölümüden erişim dışardan erişim olarak adlandırılır.
        public override string Dil
        {
            get
            {
                return _dil; //private olan _dil değişkeninin değerini döndür
            }

            set
            {
                _dil = value; // private _dil değişkenine değer atama;

            }
        }

        public override void Konus()
        {
            Console.WriteLine("{0} dilini konuşuyor", Dil);
            Console.ReadLine(); // pencereyi kapatmadan beklemek için
        }
    }

 

ahmet5847 6 yıl önce

@alattin yani benim düşündüğüm gibi property değerini get kodu ile _dil e mi aktarıyoruz ayrıca c# neden get ve seti _dil yerine Dil yaptığımda hata verdiğinide anlamadım abstract yüzünden mi ?

alattin 6 yıl önce

@ahmet5847 yoruma yazamak yerine cevabımı düzenledim.

ahmet5847 6 yıl önce

@alattin her şeyi çok güzel anlatmışsınız fakat

ahmet5847 6 yıl önce

1 . set property değer atamaksa yazdığımız kod yani _dil = value _dil in değerini al demek mi yoksa _dil e ata demek mi ?

ahmet5847 6 yıl önce

attığın kod bloğını çalıştırdığımda process is terminated due to stackoverflowexception hatası alıyorum nedenini anlamadım

alattin 6 yıl önce

_dil=value demek property'e atanan değeri al _dil değişkenine ata demek. Hangi kod blogu çalışmıyor anlamadım @ahmet5847

ahmet5847 6 yıl önce

cevap olarak attığım kod bloğu çalışmıyor abi senide uğraştırdım ama :D @alattin bizde öğrenmeye çalışıyoruz

alattin 6 yıl önce

Kodda hata alman normal. Çünkü public override string Dil { get { return Dil; } set { Dil = value; } } ile property içinde kendine değer atamaya ve değer okumaya çalışıyorsun. Bu property private _dil değişkenine erişim için kullanılmalı @ahmet5847

alattin 6 yıl önce

@ahmet5847 çalışan kodu açıklamaları ile birlikte cevabıma ekledim.

ahmet5847 6 yıl önce

Allah razı olsun sitenin sahibiydin galiba abi sen bilirsin ama konuyu benim gibi acemiler için sabitleyebilirsin :D @alattin

alattin 6 yıl önce

Allah senden de razı olsun @ahmet5847 bu tür sorular yeni öğrenenler için çok faydalı

ahmet5847 (92) 6 yıl önce cevapladı

namespace Uygulama
{
    class Program
    {
        static void Main(string[] args)
        {
            Turk T1 = new Turk();
            T1.Dil = "türkçe ";

            T1.Konus();
            

        }
    }

    abstract class Insan
    {
        public abstract string Dil { get; set; }

        public abstract void Konus();
    }

    class Turk : Insan
    {
        

        public override string Dil { get { return Dil; }  set { Dil = value; } }


        public override void Konus()
        {
            Console.WriteLine("{0} dilini konuşuyor", Dil);
        }
    }
}