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ć. : ]
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.
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.
@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);
...
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.