C#'da sınıfları static ile oluşturursak ne olur?

II.Wilhelm

Hectopat
Katılım
11 Eylül 2020
Mesajlar
1.821
Çözümler
6
Yer
Almanya
Daha fazla  
Cinsiyet
Erkek
Meslek
König
Merhaba. Elimde static olmayan bir A sınıfı var. Ben bunu A a=new A(); diyerek örneğini oluşturabiliyorum. Peki bunu static A a =new A(); diyerek yaptığımda ne oluyor? Açıklayabilirseniz sevinirim.
C#:
namespace YazilimCalismasiConsole25
{
    internal class Program
    {
        static void Main(string[] args)
        {
            static A Anesnesi3 = new A(); // Hata Alınıyor
        }
    }

    class A
    {
        public A()
        {

        }
        public int prop1 { get; set; }
        public string prop2 { get; set; }
    }
    class B
    {
        static A Anesnesi = new A();
        public static void Metot()
        {
            static A Anesnesi2 = new A(); // Hata Alınıyor
        }
        public  void Metot2()
        {
            static A Anesnesi2 = new A(); // Hata Alınıyor
        }
    }

    static class C
    {
        static A Anesnesi4 = new A();
    }
 
}
 
Programlar bellek içinde stack, heap, static diye alanlar ayırır. Static olarak tanımlı nesneler, static alanda tutulur.

class scopunda static değişken, obje, metot tanımlanabilir global değişkenler, objeler ve metotlar olurlar. Metotların scoplarının içinde static tanımlanmaz çünkü tanımlanabilen ne varsa local olacağı için yasak gibi bir şeydir bu.

Tabi constlar dışında. Constlarda değişmez static sabitlerdir.
 
Son düzenleme:
Sıfır C# bilgimle zıplayayım hemen.
Static genelde (çoğu dilde) ya bir değişkeni kalıcı yapar, ya da metodu öyle yapar. Yani sınıfa ait static metot sınıfa ait olur. Her nesne için ayrı ayrı olmaz. Bellekte bir tane olur.

Örnekte hata aldığınız yerleri belirtmenizden C sınıfının singleton dediğimiz sadece tek nesnesi (instance demek daha doğru) olan bir sınıf olmuş gibi duruyor. Google amcaya sorunca hemen Microsoft abimiz "A static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated. In other words, you cannot use the new operator to create a variable of the class type. Because there is no instance variable, you access the members of a static class by using the class name itself." demiş. Dediğime aykırı bir şey göremiyorum.
C sınıfı içindeki Anesnesi4'e erişmek için C.Anesnesi4 yazmanız yeterli olmalı. Math.PI demenizden farksız.

Main'deki hata ilgimi çekti. Sanırım sebebi Main'in halihazırda static olması. Main static ise zaten Main'den bir tane vardır. İçindekiler zaten bir tanedir. Tekrar static demek saçma. Bunu bir integer değişken ile deneyerek görebiliyoruz.

Microsoft abimiz static member'lardan da bahsetmiş. Demiş ki: "C# does not support static local variables.", yani Main bu yüzden çalışmıyor. Yani B sınıfındaki metotlar bu yüzden çalışmıyor.

Dediğim kalıcı değişken olayı yokmuş C#'ta. Static'ler zaten class member'ı olarak tutulabildiği için oradan kullanıp duruyormuş millet.

 
Static'i Class'ı çağırırken değil, Class oluştururken yazmanız gerekiyor.

static class a olarak.

Static dediğimiz şey C#'da, @Vavien. hocamın dediği gibi kalıcı yapmaya yarar. Örnek vermek gerekirse harici bir sınıf çağırırken "using static" olarak çağırıyoruz ki kalıcı olsun.
 
Sıfır C# bilgimle zıplayayım hemen.
Static genelde (çoğu dilde) ya bir değişkeni kalıcı yapar, ya da metodu öyle yapar. Yani sınıfa ait static metot sınıfa ait olur. Her nesne için ayrı ayrı olmaz. Bellekte bir tane olur.

Örnekte hata aldığınız yerleri belirtmenizden C sınıfının singleton dediğimiz sadece tek nesnesi (instance demek daha doğru) olan bir sınıf olmuş gibi duruyor. Google amcaya sorunca hemen Microsoft abimiz "A static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated. In other words, you cannot use the new operator to create a variable of the class type. Because there is no instance variable, you access the members of a static class by using the class name itself." demiş. Dediğime aykırı bir şey göremiyorum.
C sınıfı içindeki Anesnesi4'e erişmek için C.Anesnesi4 yazmanız yeterli olmalı. Math.PI demenizden farksız.

Main'deki hata ilgimi çekti. Sanırım sebebi Main'in halihazırda static olması. Main static ise zaten Main'den bir tane vardır. İçindekiler zaten bir tanedir. Tekrar static demek saçma. Bunu bir integer değişken ile deneyerek görebiliyoruz.

Microsoft abimiz static member'lardan da bahsetmiş. Demiş ki: "C# does not support static local variables.", yani Main bu yüzden çalışmıyor. Yani B sınıfındaki metotlar bu yüzden çalışmıyor.

Dediğim kalıcı değişken olayı yokmuş C#'ta. Static'ler zaten class member'ı olarak tutulabildiği için oradan kullanıp duruyormuş millet.

Static'i Class'ı çağırırken değil, Class oluştururken yazmanız gerekiyor.

static class a olarak.

Static dediğimiz şey C#'da, @Vavien. hocamın dediği gibi kalıcı yapmaya yarar. Örnek vermek gerekirse harici bir sınıf çağırırken "using static" olarak çağırıyoruz ki kalıcı olsun.
Aldığım hataların sebebini anladım. Ama " static A a=new A(); " ve " A a= new A(); " arasındaki farklı hala anlayamadım.
 
Yazdığınız yere göre değişir. Sınıf içi ise static yazdığınızda tüm nesnelerin aynı a değişkeni olur. Diğer türlü hepsinin kendine has olur.

B sınıfı içinde yazdığınız static A Anesnesi = new A(); ifadesini ele alalım.
Main'de B elma = new B(); yazdığınızı varsayalım. elma.Anesnesi yazamazsınız. Çünkü Anesnesi static. Nesneye değil, sınıfa bağlı.
Ama başta B sınıfı içinde static olmadan yazsaydınız elma.Anesnesi deyip bir adet A sınıfı nesnesine erişebilirsiniz.
B sınıfı içinde static kullandığınız zaman B.Anesnesi şeklinde erişebilirsiniz ve tek olur. Her nesne için ayrı olmaz.
 
Şöyle söyleyeyim o zaman.

Açtığınız Class içinde bir nesne oluşturulmadan veya başka bir Class'a referans verilmeyen işlemlerde kullanılır. Yani Class nesne oluşturmuyorsa ve başka bir alandan referans gelmiyorsa static olarak tanımlanmalıdır.
 
Son düzenleme:
Yazdığınız yere göre değişir. Sınıf içi ise static yazdığınızda tüm nesnelerin aynı a değişkeni olur. Diğer türlü hepsinin kendine has olur.

B sınıfı içinde yazdığınız static A Anesnesi = new A(); ifadesini ele alalım.
Main'de B elma = new B(); yazdığınızı varsayalım. elma.Anesnesi yazamazsınız. Çünkü Anesnesi static. Nesneye değil, sınıfa bağlı.
Ama başta B sınıfı içinde static olmadan yazsaydınız elma.Anesnesi deyip bir adet A sınıfı nesnesine erişebilirsiniz.
B sınıfı içinde static kullandığınız zaman B.Anesnesi şeklinde erişebilirsiniz ve tek olur. Her nesne için ayrı olmaz.

Şöyle söyleyeyim o zaman.

Açtığınız class içinde bir nesne oluşturulmadan veya başka bir Class'a referans verilmeyen işlemlerde kullanılır. Yani class nesne oluşturmuyorsa ve başka bir alandan referans gelmiyorsa static olarak tanımlanmalıdır.
Çok teşekkür ederim. Şuan anlamış bulunmaktayım.
 

Yeni konular

Geri
Yukarı