none
sabit method ile sabit olmayan method farki. Program hata veriyor. Sorunu kavrayamadim. RRS feed

  • Soru

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CarsSpeedHandler
    {
        class Program
        {
            static void Main(string[] args)
            {
                Car c1 = new Car("Ismail", 120, 10);
                //string message = OnCarEngineEvent
                c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent));
                //c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent));   
                for (int i = 0; i < 10; i++)
                {
                    c1.Accelerate(10);
                }
                    Console.ReadLine();
            }
    
            public  void OnCarEngineEvent(string msg)
            {
                Console.WriteLine("Message from Car Object");
                Console.WriteLine("=> {0}", msg);
                Console.WriteLine("*************************");
            }
        }
        class Car
        {
            public int MaxSp { get; set; } 
            public int CurrSp { get; set; }
            public string PetName { get; set; }
            public Car()
            {
    
            }
    
            public Car(string petName, int maxSp, int currSp)
            {
                MaxSp = maxSp;
                CurrSp = currSp;
                PetName = petName;
                
            }
    
            public bool CarIsDead { get; set; }
    
            public delegate void CarEngineHandler(string message);
    
            private CarEngineHandler listOfCarHandlers;
    
            public void RegisterWithCarEngine (CarEngineHandler messageToMethod)
            {
                listOfCarHandlers = messageToMethod;
            }
    
            public void Accelerate(int baseSpeed)
            {
                if (CarIsDead)
                {
                    if (listOfCarHandlers != null)
                        listOfCarHandlers("Sorry but car is dead");
                }
    
                else
                {
                    CurrSp += baseSpeed;
                    if (10 == (MaxSp - CurrSp) && listOfCarHandlers != null)
                    {
                        listOfCarHandlers("Careful, you gonna blow!");
                    }
                    if (CurrSp > MaxSp)
                    {
                        CarIsDead = true;
                    }
                    else Console.WriteLine("Current Speed is {0}", CurrSp);
                }
            }
        }
    }
    

    yukaridaki kodta main methodu icindeki OnCarEngineEventi methodu static tanimlandiginda, 
                c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent)); 
    kismi hata vermiyor. lakin non-static tanimladigimda hata veriyor. bunun sebebini anlayamadim. sonnucta main methodu icinde bir method.

    ama hata veriyor. sorun nedir ?

    Severity    Code    Description    Project    File    Line    Suppression State
    Error    CS7036    There is no argument given that corresponds to the required formal parameter 'msg' of 'Program.OnCarEngineEvent(string)'    CarsSpeedHandler    C:\Users\User\source\repos\CarsSpeedHandler\CarsSpeedHandler\Program.cs    15    Active



    22 Aralık 2018 Cumartesi 19:14

Tüm Yanıtlar

  • Main metodu static bir metoddur ve static metodların içinde non-static metodlar kullanılamaz. Çünkü metodun static olması onun sınıfa ait olduğu anlamına gelir, non-static metod ise sınıftan üretilen nesneye ait bir metoddur. Dolayısıyla non-static bir metoda nesne üretilmeden erişilemez.
    22 Aralık 2018 Cumartesi 21:08
  • class Sinif
    {
        // Statik olmayan metod.
        public void Metod
        {
        }
    
        // Statik metod.
        public static void StatikMetod
        {        
        }
    }

    Kullanırken statik olan metoda doğrudan erişirsiniz.

    Statik olmayana erişmek için önce tanımladığınız sınıftan bir nesne türetmelisiniz.

    Yani statik metodu kullanmak için,

    Sinif.StatikMetod();

    yeterliyken diğer metodu kullanmak için,

    Sinif s = new Sinif();
    s.Metod();

    yazmalısınız.

    Sizin örneğinizde de Program isimli sınıf  içerisinde tanımlayacağınız metod ve değişkenler, doğrudan erişebilmeniz için statik olmak zorunda.


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    22 Aralık 2018 Cumartesi 21:26
  • kafam iyice karisti. mantigini anlamadim.
    22 Aralık 2018 Cumartesi 21:36
  • namespace StaticVsNonStatic
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Console.WriteLine(Topla(2,3));
                Yazdir(Topla(2,4));
                Console.ReadLine();
            }
    
            static int Topla (int sayi1, int sayi2)
            {
                return sayi1 + sayi2;
            }
    
            public void Yazdir(int sayi)
            {
                Console.WriteLine(sayi);
            }
        }
    }

    yine ayni hatayi aldim.

    Severity    Code    Description    Project    File    Line    Suppression State
    Error    CS0120    An object reference is required for the non-static field, method, or property 'Program.Yazdir(int)'    StaticVsNonStatic    C:\Users\User\source\repos\StaticVsNonStatic\StaticVsNonStatic\Program.cs    14    Active

    referanse bir tip taniladigimizda bellekte heap kisminda tutuluyor value degerler ise stack

    lakin bir static taniminda direkt bellek uzerinde hem heap hem stack fark etmeden yer tutuyor static tanimlar.

    bir mantik kuramadim. ref tip icinde bir method tanimlarkan satic olup olmamasi ne gibi sorun olabilir ki? sonucta ayni sinif altindalar. yukarida basit bir ornek yaptim ve mantigi anlamadim...

    heapte ki referans bellek numarasinda static mi yoksa non-static mi tutulup tutulmadigi neden onemli olsun ki? sonucta referans tipler bellek adresindeki ref numarasian gore islem yapmiyor mu cagrilma zamaninda?bu yuzden new ile oluturmuyormuyuz?

    peki non-static mantigi ile ters dusen ne? illa heap`de mi sakli olan baska bir referans olmali?

    eklme:

    yukarida verdigim ornekte Yazdir methodu Program Class atinda oldugu icin Heap icinde yazili olacak degil mi? peki bunun yukaridaki ramde tutulma mantigina gore nasil bir hatasi olabilir ?

    • Düzenleyen Rudvan 22 Aralık 2018 Cumartesi 21:49
    22 Aralık 2018 Cumartesi 21:41
  • Yine aynı hatayı yaptığınız için "yine aynı hatayı almanız" doğaldır. Örneğinizde Yazdır metodu statik olmayan bir metod. Bunu statik olan Main metodu içerisinde kullanabilmek istiyorsanız ya statik bir metoda dönüştürmelisiniz yada ait olduğu sınıfın bir örneğini türetmelisiniz. Sizin durumunuza uygun olan static void Yazdir() kullanmak.

    Elinizde bir otomobile ait üretim planları, ölçüler ve tasarımlar olduğunu düşünün. Bu tasarımı kullanarak yüzlerce otomobil üretebilirsiniz. Ama o tasarımlara binip bir yere gidemezsiniz. Bunun için en az bir tane otomobil üretmelisiniz. (Statik olmayan)

    Yada elinizde bir otomobil var ama ona ait teknoloji, tasarımlar, ölçüler ve üretim planları yok. Otomobile binip istediğiniz yere gidebilirsiniz. Ama ondan bir tane bile üretemezsiniz. (Statik)


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    • Düzenleyen MuratAKSARAY 23 Aralık 2018 Pazar 06:25 Otomobil
    23 Aralık 2018 Pazar 05:41