İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Özel Ders Başvuru Ücretsiz ön görüşme Ana Sayfa

C# CS0120 "An object reference is required" Hatası Nasıl Çözülür?

csharp-cs0120-an-object-reference-is-required-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. CS0120 hatası ne anlama gelir?
  2. Hata neden static Main içinde ortaya çıkar?
  3. Nesne oluşturarak hata nasıl düzeltilir?
  4. Üyeyi static yapmak ne zaman mantıklıdır?
  5. İki çözüm arasında nasıl karar verilir?

C# CS0120 hatası, static bir bağlamdan static olmayan bir alan, metot veya özelliğe onu taşıyan nesne üzerinden erişmeden ulaşılmaya çalışıldığında ortaya çıkar. Çözüm, ilgili sınıftan bir nesne oluşturup üyeyi bu nesne üzerinden çağırmak ya da üyenin gerçekten ortak davranış göstermesi durumunda onu static olarak tanımlamaktır.

Hangi yaklaşımın doğru olduğu, metodun belirli bir nesnenin durumuna ihtiyaç duyup duymamasına bağlıdır. Aşağıdaki iki bölümde hatanın anlamını ve özellikle klasik static Main içinde neden görüldüğünü inceleyelim.

CS0120 hatası ne anlama gelir?

CS0120 hatası, static bir bağlamdan static olmayan bir üyeye nesne oluşturmadan erişmeye çalıştığını gösterir. Microsoft'un İngilizce hata metni An object reference is required for the non-static field, method, or property 'member' biçimindedir. Visual Studio'nun Türkçe karşılığı ise Statik olmayan alan, yöntem veya 'member' özelliği için nesne başvurusu gereklidir şeklindedir. Hatanın ayrıntıları için Microsoft'un CS0120 açıklamasına bakabilirsin.

static üye, doğrudan sınıfa ait ortak bir üyedir. Bu üyeye erişmek için belirli bir nesneye ihtiyaç duyulmaz. Örnek, yani instance ise bir sınıftan oluşturulan belirli nesnedir. Bir sınıf içinde tanımlanan alan, metot ve özellik gibi yapılar da üye olarak adlandırılır.

Bu farkı bir apartman planı ve belirli bir daire üzerinden düşünebilirsin. Sınıf apartmanın genel planını temsil eder. Her dairede aynı bulunan ortak bir bilgi sınıfa ait static üye gibi düşünülebilir. Bir dairenin o anki sıcaklığı, sahibinin adı veya içindeki eşya gibi bilgiler ise belirli bir daireye aittir. Bu tür bilgiler için hangi daireden söz edildiğini gösteren bir nesne gerekir.

CS0120 derleme aşamasında oluşur. Derleyici, program başlatılmadan önce erişim biçiminde bir uyumsuzluk olduğunu tespit eder ve çalıştırılabilir bir sonuç üretmeden hata bildirir. Bu yönüyle, program çalışırken ortaya çıkabilen nesne referansı sorunlarından ayrılır.

Hata neden static Main içinde ortaya çıkar?

Hata neden static Main içinde ortaya çıkar?

static Main metodu, doğrudan belirli bir Hesaplayici nesnesine ait olmayan bir bağlamdır; bu nedenle static olmayan Topla metodu nesne üzerinden çağrılmadan kullanılamaz.

using System;

public class Hesaplayici
{
    public int Topla(int a, int b)
    {
        return a + b;
    }
}

public class Program : Hesaplayici
{
    public static void Main(string[] args)
    {
        int sonuc = Topla(3, 5); // CS0120
        Console.WriteLine(sonuc);
    }
}

Burada Topla metodu static olarak tanımlanmamıştır. Program sınıfı bu metodu miras alsa da Main static olduğu için belirli bir Program nesnesi üzerinden çalışmaz. Bu nedenle derleyici, Topla(3, 5) çağrısında CS0120 hatasını gösterir.

Hata iletisinde üye adı genellikle Hesaplayici.Topla(int, int) biçiminde görünür. Program bu aşamada çalışmadığı için konsola 8 yazılmaz; beklenen sonuç derleme hatasıdır ve hata konumu Topla(3, 5) çağrısıdır.

Yeni konsol uygulaması şablonlarında top-level statements kullanıldığında Main metodu dosyada görünmeyebilir. Derleyici bu giriş metodunu arka planda oluşturur, ancak static ve örnek üyelere erişim kuralları değişmez.

Nesne oluşturarak hata nasıl düzeltilir?

Static olmayan Topla metoduna erişmenin doğru yolu, Hesaplayici sınıfından bir nesne oluşturup metodu bu nesne üzerinden çağırmaktır. Hatanın İngilizce tam metni An object reference is required for the non-static field, method, or property 'member' şeklindedir. Visual Studio'nun Türkçe arayüzünde bu mesaj, “Statik olmayan alan, yöntem veya özellik için bir nesne başvurusu gereklidir” anlamıyla görülür. Microsoft'un CS0120 açıklaması da static olmayan üyeyi kullanmadan önce sınıftan bir örnek oluşturulmasını önerir.

Aşağıdaki kodda Topla metodu static değildir. Buna rağmen sınıf adı üzerinden çağrıldığı için derleyici CS0120 hatası üretir:

using System;

class Hesaplayici
{
    public int Topla(int a, int b)
    {
        return a + b;
    }

    static void Main()
    {
        Console.WriteLine(Hesaplayici.Topla(3, 5)); // CS0120
    }
}

Burada Hesaplayici sınıfın tür adıdır. Sınıftan oluşturulan örneği tutan hesaplayici değişkeni ise belirli bir nesneye başvurur. Düzeltme için önce nesne oluşturulur, ardından metot bu nesne değişkeni üzerinden çağrılır:

using System;

class Hesaplayici
{
    public int Topla(int a, int b)
    {
        return a + b;
    }

    static void Main()
    {
        Hesaplayici hesaplayici = new Hesaplayici();

        Console.WriteLine(hesaplayici.Topla(3, 5));
    }
}

Programın beklenen çıktısı 8 olur. Nesne oluşturulduktan sonra Hesaplayici.Topla(3, 5) yazmaya devam etmek hatayı çözmez; çünkü çağrı hâlâ sınıf adı üzerinden yapılır. Doğru kullanım hesaplayici.Topla(3, 5) biçimindedir. Topla ileride nesneye ait alanları veya özellikleri kullanacaksa bu yaklaşım daha anlamlı hâle gelir. Top-level statements kullanılan proje şablonlarında Main metodu görünmeyebilir, ancak erişim kuralı değişmez.

Üyeyi static yapmak ne zaman mantıklıdır?

Üyeyi static yapmak ne zaman mantıklıdır?

Bir metot belirli bir nesnenin alanlarına veya özelliklerine ihtiyaç duymuyorsa onu static yapmak değerlendirilebilir. Bu durumda metot sınıfa ait olur ve nesne oluşturmadan sınıf adı üzerinden çağrılır.

using System;

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

    static void Main()
    {
        Console.WriteLine(Hesaplayici.Topla(3, 5));
    }
}

Bu programın beklenen çıktısı yine 8 olur. Çünkü Topla yalnızca kendisine verilen parametrelerle sonuç üretir ve belirli bir nesnenin durumunu okumaz ya da değiştirmez.

Her üyeyi static yapmak ise uygun bir çözüm değildir. Metot nesneye ait verileri kullanacak veya o nesnenin durumunu değiştirecekse static tanımı, nesne modelini zayıflatabilir ve farklı nesnelerin kendi verilerini taşımasını zorlaştırabilir. Bu nedenle seçim, yalnızca CS0120 hatasını kaldırmaya göre değil, üyenin belirli bir nesneyle ilişkili olup olmadığına göre yapılmalıdır.

İki çözüm arasında nasıl karar verilir?

İki çözüm arasında karar verirken, metodun bir nesnenin durumuna ihtiyaç duyup duymadığına bakmalısın. Metot nesneye ait alanları veya özellikleri kullanıyorsa nesne oluşturup erişmek daha anlaşılırdır. Yalnızca aldığı parametrelerle çalışan ve nesneye özgü bir durum taşımayan metotlar için static yaklaşımı uygun olabilir.

  1. Metot instance alanı veya özelliği kullanıyor mu? Kullanıyorsa nesne oluşturmalı ve metodu o nesne üzerinden çağırmalısın. Kullanmadığında static seçeneğini değerlendirebilirsin.
  2. Aynı sınıftan oluşturulan nesneler farklı durumlar taşıyacak mı? Her nesnenin kendine ait değerleri olacaksa nesne üzerinden erişim gerekir. Tüm çağrılar ortak bir davranışa dayanıyorsa static yapı daha anlaşılır olabilir.
  3. Çağrı için nesnenin kimliği veya yaşam döngüsü anlamlı mı? Nesnenin ne zaman oluşturulduğu, hangi değerleri taşıdığı veya ne zaman kullanılmayı bıraktığı önemliyse metodu nesneye ait tutmak daha doğru bir model oluşturur.
  4. Metot yalnızca parametrelerden sonuç mu üretiyor? Sonuç hesaplanırken nesnenin alanlarına veya özelliklerine ihtiyaç duyulmuyorsa static kullanım kodu sadeleştirebilir.
Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bilgi, kod veya bağlantı sorununu kısaca yaz. Editör ekibimiz inceleyecek.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
Karar sorusu Nesne üzerinden erişim static yaklaşım
Metot instance alanı veya özelliği kullanıyor mu? Alan ya da özellik nesneye ait olduğu için metodu oluşturulan nesne üzerinden çağırmak gerekir. Nesne durumuna ihtiyaç yoksa değerlendirilebilir.
Nesneler farklı durumlar taşıyacak mı? Her nesnenin kendi verisini korumasını sağlar. Ortak ve nesneden bağımsız bir davranış için daha anlaşılır olabilir.
Nesnenin kimliği veya yaşam döngüsü anlamlı mı? Nesnenin oluşturulması ve yönetilmesi davranışın parçasıdır. Nesneye ait yaşam döngüsü bulunmadığında tercih edilebilir.
Metot yalnızca parametrelerden sonuç mu üretiyor? Ek nesne durumu varsa kullanılabilir.