statyczna metoda Main jak wywolac normalna metode

0

Hej, mam sobie program gdzie jest pnkt wejscia

 class Program
    {
        Figura figura;

        static void Main(string[] args)
        {

            init();

        }

private void init()
        {
            Console.WriteLine("dupa");
        }

no i wywala blad bo main jest statyczny a chyba musi byc?
Jak z tego wywolac jakas normalna metode init zeby zainicjowac program, przecież wszystko nie moze byc ststyczne... Szukam i szukam i znalezc nie moge:/

1

Statyczna metoda Main() jest pierwszą metodą jaka zostaje wywołana w twoim programie. Metoda ta jest statyczna, ponieważ można ją wywołać bez tworzenia obiektu. Na logikę rzecz biorąc nie możesz utworzyć obiektu przed uruchomieniem programu. Stwórz osobną klasę, której metody nie są statyczne i wtedy będziesz mógł używać "niestatycznych" metod.

class Program
{
    Figura figura;

    static void Main(string[] args)
    {
        MojaKlasa mk = new MojaKlasa();
        mk.init();
    }
}

public class MojaKlasa
{
   public void init()
   {
      Console.WriteLine("dupa");
   } 
}
0

no i wywala blad bo main jest statyczny a chyba musi byc?

Musi.

Jak z tego wywolac jakas normalna metode init zeby zainicjowac program, przecież wszystko nie moze byc ststyczne... Szukam i szukam i znalezc nie moge:/

No, nie powinno.

Ale nie powinno się też trzymać wszystkiego w jednej klasie. Możesz użyć klasy Program tylko jako punktu wejścia aplikacji, a już w nim stworzyć obiekt swojej klasy i na nim działać.


class MyFunctions
{
    public void Init()
    {
        // robienie czegoś
    }
}

class Program
{
    static void Main()
    {
        var mf = new MyFunctions();
        mf.Init();
    }
}

2
goku21 napisał(a):

Jak z tego wywolac jakas normalna metode init zeby zainicjowac program, przecież wszystko nie moze byc ststyczne...

A dlaczego wszystko nie może być statyczne? jaką masz korzyść tutaj że init będzie niestatyczne?

0

Pochodze z ActionScripta gdzie Konstruktory nie byly statyczne stad to pytanie;]
"A dlaczego wszystko nie może być statyczne? jaką masz korzyść tutaj że init będzie niestatyczne?"
Rozumiem ze jezeli w grze masz miniguna ktory strzela 1000x/sek to kazdy pocisk bedzie statyczna klasa?:> niezle podejscie;]

AdamWox dzieki za odpowiedz tylko to sie wydaje dziwne bo wymusza na kazdej klasie bazowej operator static, to nie jest dziwne waszym zdaniem? Czemu akurat klasa bazowa musi byc w C# statyczna, w innych jezykach to jest rozwiazane inaczej.

0
goku21 napisał(a):

Pochodze z ActionScripta gdzie Konstruktory nie byly statyczne stad to pytanie;]

Jeśli konstruktory nie byłyby statyczne, to byłyby instancyjne, a więc mogłyby być wywołane jedynie na rzecz już istniejącej instancji klasy, której by nie było, bo do utworzenia przecież potrzebny jest konstruktor. Ergo, w takim języku nie dałoby się niczego napisać.

I ciekawe, że przywołujesz tutaj temat konstruktorów, przecież w swoim kodzie nie masz żadnego.

AdamWox dzieki za odpowiedz tylko to sie wydaje dziwne bo wymusza na kazdej klasie bazowej operator static, to nie jest dziwne waszym zdaniem? Czemu akurat klasa bazowa musi byc w C# statyczna, w innych jezykach to jest rozwiazane inaczej.

Nie wiem skąd czerpiesz takie informacje. Nie jest to prawdą, w C# klasy bazowe nie tylko nie muszą, ale nawet nie mogą być statyczne.
A poza tym w swoim kodzie nie masz ani jednej klasy bazowej.

0

Jeśli konstruktory nie byłyby statyczne, to byłyby instancyjne, a więc mogłyby być wywołane jedynie na rzecz już istniejącej instancji klasy

Moze to initializer jak w Pythonie

0
goku21 napisał(a):

Pochodze z ActionScripta gdzie Konstruktory nie byly statyczne stad to pytanie;]
"A dlaczego wszystko nie może być statyczne? jaką masz korzyść tutaj że init będzie niestatyczne?"
Rozumiem ze jezeli w grze masz miniguna ktory strzela 1000x/sek to kazdy pocisk bedzie statyczna klasa?:> niezle podejscie;]

AdamWox dzieki za odpowiedz tylko to sie wydaje dziwne bo wymusza na kazdej klasie bazowej operator static, to nie jest dziwne waszym zdaniem? Czemu akurat klasa bazowa musi byc w C# statyczna, w innych jezykach to jest rozwiazane inaczej.

@goku21
Faktycznie, aż mnie ciekawi skąd ty to bierzesz? Main() nie jest konstruktorem, nie potrzebujesz tej metody w każdej klasie, nie potrzebujesz mieć wszystkich klas statycznych, wręcz powiedziałbym, że nie powinieneś mieć. Klasa bazowa w C# nie jest statyczna, tylko jej metoda Main() jest, aby można było wywołać ją

Program.Main();

zamiast

Program p = new Program(); 
p.Main();

Klasy niestatyczne mogą zawierać statyczne metody i właściwości

public class MojaKlasa

public MojaKlasa()
{
   //konstruktor, który nie jest statyczny
}

public void Init()
{
   //metoda niestatyczna
}

public static void init_static()
{
   //metoda statyczna
}

Jeśli chcesz się odwołać do Init() musisz mieć obiekt tej klasy, jeśli zaś chcesz się odwołać do init_static() to tego obiektu nie potrzebujesz.

MojaKlasa m = new MojaKlasa();
m.init();

MojaKlasa.init_static();
0
Kamil Żabiński napisał(a):
goku21 napisał(a):

Jak z tego wywolac jakas normalna metode init zeby zainicjowac program, przecież wszystko nie moze byc ststyczne...

A dlaczego wszystko nie może być statyczne? jaką masz korzyść tutaj że init będzie niestatyczne?

Wiem czym sie rozni statyczny od dynamicznego:> Hmm myslalem ze main to konstruktor ale faktycznie klasa nie jest oznaczona jako statyczna ale czy konstruktor sie wywola sam z siebie? Zaraz poeksperymentuje.

**somekind **na zdrowy rozum masz racje, gdzies musialby byc tworzony obiekt zeby klasa wejsciowa nie musiala byc statyczna ale W ACTIONSCRIPT 3.0 wlasnie tak to dziala. Jest Main ktory nie jest statyczny i wywoluje sie od razu po rozpoczeciu dzialania programu. Moze flashplayer inicializuje obiekt takiej klasy ktory jednoczesnie jest singletonem, tego nie wiem. Mam natomiast pewnosc ze klasa wejsciowa w as 3 NIE JEST statyczna.

**somekind **

Nie wiem skąd czerpiesz takie informacje. Nie jest to prawdą, w C# klasy bazowe nie tylko nie muszą, ale nawet nie mogą być statyczne.
A poza tym w swoim kodzie nie masz ani jednej klasy bazowej.>

Zainstalowalem visual studio 2017, utworzylem projekt klasyczny w C# (aplikacja konsoli .NET) i dostalem

class Program
    {

        static void Main(string[] args)
        {

        }
}

Z tego powodu zakladam ze jest to klasa bazowa (innej nie ma i pierwsza sie uruchamia) oraz jak widze jest statyczna:> Jezeli usune wyraz static z metody Main dostaje blad:

Program nie zawiera statycznej metody „Main” odpowiedniej jako punkt wejścia CSharp>
Z tego powodu zakladam ze klasy bazowe w C# musza byc statyczne.

1

Klasa ani nie jest bazowa bo zadna inna klasa po niej nie dziedziczy ani nie jest statyczna tylko ma metode statyczna

0
goku21 napisał(a):

Wiem czym sie rozni statyczny od dynamicznego:> Hmm myslalem ze main to konstruktor ale faktycznie klasa nie jest oznaczona jako statyczna ale czy konstruktor sie wywola sam z siebie? Zaraz poeksperymentuje.

Main to nie jest żaden konstruktor. To entry point aplikacji Windows.

**somekind **na zdrowy rozum masz racje, gdzies musialby byc tworzony obiekt zeby klasa wejsciowa nie musiala byc statyczna ale W ACTIONSCRIPT 3.0 wlasnie tak to dziala. Jest Main ktory nie jest statyczny i wywoluje sie od razu po rozpoczeciu dzialania programu. Moze flashplayer inicializuje obiekt takiej klasy ktory jednoczesnie jest singletonem, tego nie wiem.

Być może. Twórcy AS zapewne mogli sobie pozwolić na większą wolność w tym zakresie niż twórcy .NET frameworka.

Jak dla mnie to Ty mieszasz dwa pojęcia: zobaczyłeś ten jeden specyficzny przypadek statycznej metody Program.Main, która jest wymagana przez framework/system i próbujesz z tego wysnuć jakąś ogólną zasadę dotyczącą klas, klas bazowych i konstruktorów, czyli rzeczy, które z Program.Main nie mają nic wspólnego.

Mam natomiast pewnosc ze klasa wejsciowa w as 3 NIE JEST statyczna.

W C# też nie. class Program - tu nie ma żadnego static.

0
stivens napisał(a):

Klasa ani nie jest bazowa bo zadna inna klasa po niej nie dziedziczy ani nie jest statyczna tylko ma metode statyczna

Ok nie jest to klasa bazowa, myle pojecia. Ale jest to punkt wejscia w sensie musi to byc i sie tak nazywac, zeby program zaczol sie wykonywac, mam racje? Jezeli tak to jakie sa zalecenia do stworzenia jakiegos inita ktory nie bedzie statyczny i bedzie dalej inicjalizowal dzialanie programu (zaciagal i ustawial dane, budowal kontrolery itd)?

0

Napisz sobie klasę, która będzie miała metodę init, a potem w Main utwórz obiekt tej klasy i wywołaj metodę init.

0
somekind napisał(a):
goku21 napisał(a):

Wiem czym sie rozni statyczny od dynamicznego:> Hmm myslalem ze main to konstruktor ale faktycznie klasa nie jest oznaczona jako statyczna ale czy konstruktor sie wywola sam z siebie? Zaraz poeksperymentuje.

Main to nie jest żaden konstruktor. To entry point aplikacji Windows.

**somekind **na zdrowy rozum masz racje, gdzies musialby byc tworzony obiekt zeby klasa wejsciowa nie musiala byc statyczna ale W ACTIONSCRIPT 3.0 wlasnie tak to dziala. Jest Main ktory nie jest statyczny i wywoluje sie od razu po rozpoczeciu dzialania programu. Moze flashplayer inicializuje obiekt takiej klasy ktory jednoczesnie jest singletonem, tego nie wiem.

Być może. Twórcy AS zapewne mogli sobie pozwolić na większą wolność w tym zakresie niż twórcy .NET frameworka.

Jak dla mnie to Ty mieszasz dwa pojęcia: zobaczyłeś ten jeden specyficzny przypadek statycznej metody Program.Main, która jest wymagana przez framework/system i próbujesz z tego wysnuć jakąś ogólną zasadę dotyczącą klas, klas bazowych i konstruktorów, czyli rzeczy, które z Program.Main nie mają nic wspólnego.

Mam natomiast pewnosc ze klasa wejsciowa w as 3 NIE JEST statyczna.

W C# też nie. class Program - tu nie ma żadnego static.

Hehe no faktycznie mieszam, w AS3 punktem wejscia byl rownoczesnie konstruktor klasy Main, na dodatek ta klasa musiala sie tak nazywac zeby program sie uruchomil;p

    class Program
    {

        static void Main(string[] args)
        {

            Program program = new Program();

        }

        public void Program()
        {
            init();
        }

„Program”: nazwy składowych nie mogą być takie same jak nazwa zawierającego je typu

ale

    class Program
    {

        static void Main(string[] args)
        {

            Program program = new Program();

        }

        public Program()
        {
            init();
        }

Bez void juz dziala. Wiem ze konstruktor nie moze zwracac zadnego typu ale w C++ mozna bylo void dorzucic do konrstruktora;p Jak by nie bylo takie sa zalecenia czy lepiej zrobic jak napisal somekind czyli nie tworzyc konstruktora klasy program tylko po prostu wrzucic nowa klase init?

2

No ja bym zrobił nową klasę, bo wychodzę z założenia, że jedna klasa powinna robić jedną rzecz, więc jak coś już jest entry pointem, to nie ma sensu robić z tego jakiegoś stanu gry.

0

Przydałoby się przekazać argsy gdybyś chciał ich użyć…

class Program
{
    void MyMain(string[] args)
    {
        // co tam chcesz
    }

    static void Main(string[] args)
    {
        new Program().MyMain(args);
    }
}
1
goku21 napisał(a):

Hej, mam sobie program gdzie jest pnkt wejscia

 class Program
    {
        Figura figura;

        static void Main(string[] args)
        {

            init();

        }

private void init()
        {
            Console.WriteLine("dupa");
        }

no i wywala blad bo main jest statyczny a chyba musi byc?
Jak z tego wywolac jakas normalna metode init zeby zainicjowac program, przecież wszystko nie moze byc ststyczne... Szukam i szukam i znalezc nie moge:/

Jeśli potrzebujesz na szybko działający program to wszystkie metody w Program.cs zrób statyczne i się wywołają, ale to nie jest najlepsze rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1