Czy wszystkie obiekty w C# muszą być tworzone dynamicznie?

0

Witajcie.
Od niedawna przerzuciłem się z C++ na C# i zauważyłem, że w C# każdy obiekt tworzony jest dynamicznie(?)
Tzn. Nie mogę sobie stworzyć tablicy w taki sposób: "int tab[const int]", lecz muszę tak: "int[] tab = new tab[int]".
Również jeżeli tworzę jakiś obiekt, to muszę posłużyć się keywordem 'new', czyli jeżeli stworzę jedynie coś takiego: "Klasa fu", to czy jest to odpowiednik wskaźnika z C++? Jeżeli tak, to dlaczego w kursie, z którego się uczę, autor mówi że keyword 'new' służy jedynie do wywołania konstruktora?
Pomóżcie mi to zrozumieć. : ]

0

Można powiedzieć, że dynamicznie. Klasa fu to jest tylko deklaracja referencji do obiektów typu Klasa. Najbliższym odpowiednikiem referencji w C# w C++ jest wskaźnik, ale to nie to samo. Musisz zdać sobie sprawę, że model pamięci w C++ to zupełnie inna bajka niż w C#. C# trzyma obiekty na zarządzanej stercie, natomiast w C++ obiekty mogą być i na stercie i na stosie.

Jakiś słaby ten kurs, albo źle zrozumiałeś autora. Bo to, że new jedynie wywołuje konstruktor to mocne niedopowiedzenie i przekłamanie(może jeszcze by uszło przy value types - typach wartościowych). Zajmuje się jeszcze choćby alokacją pamięci na stercie.

0

Można napisać Klasa fu;, ale oznacza to zmienną niezainicjowaną. Trzeba dać new żeby zmienną zaalokować i ewentualnie wywołać konstruktor.
Dotyczy to też struktur, mimo że w C# są one tworzone na stosie.

0

@Azarien: przy strukturach nie trzeba new żeby korzystać z obiektu. Trzeba zainicjalizować jego wszystkie składowe:

struct Foo
{
    public int x;
}

...
Foo foo;
foo.x = 10;
System.Console.WriteLine(foo.x);
...
0

no tak, tylko że w takiej sytuacji:

struct Foo
{
    public int x;
}
 
class p
{
    static bool negate(bool b)
    {
        return !b;
    }

    static void Main()
    {
        Foo foo;
        if (negate(false))
            foo.x = 10;
        System.Console.WriteLine(foo.x);
    }
}

my wiemy, że inicjalizacja jest, a kompilator wrzeszczy. Dodanie new pomoże, choć oczywiście może wprowadzać narzut.

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