Variable Speicherbeschaffung?

Drache2

Erfahrenes Mitglied
Hallo.

Bin seit neueren von C++ auf C# umgestiegen, und wollte gerne mal wissen,
ob man in C# auch wärend der Laufzeit mithilfe von Zeigern Speicherplatz beschaffen kann.

In C++ ist das mit Strukturen möglich.
(So ist da inetwa der Code):
Code:
struct a{

int b;
struct a *next;
} *first;

int main(){

*first=new struct a;
first->next=NULL;
.
.
.
}
In C# hab ich davon keinen Plan.
Nun will ich wissen wie ich das in C# hinkriege.

Weil, irgentwie hab ich auch das Gefühl,
dass Strukturen in C# anders sind als in C++.
Stimmt das auch?
Währe nett wenn auf beide Fragen eine Antwort gegeben werden kann.
Gruß Drache2.
 
Hallo,

ich kann dir nicht alle Fragen beantworten, aber beim Speicher von structs ist zu beachten, dass auch mit new das Struct auf dem stack abgelegt wird. Ein struct ist im C# immer ein Wertetyp und kann auch nicht mit null belegt werden.

Ob man aber ein struct mit dem gleichen typen im struct als Varaible halten kann weiß ich leider nicht

mfg
wensi
 
In C++ besteht der Trick ja aus Zeigern.
Die gibs ja leider nicht in C#.

Um ehrlich zu sein, ich hab auch noch nichts gans kapiert,
was man in C# mit nem struct machen darf/kann.
Oder ist der Syntax bei structuren anders als in C++?
Warum nimmt man denn nich gleich eine Klasse dafür?
(Diese Tuts im Inet erklären leider nicht alles...)
 
hallo

naja, structs sind eingeltich nur dafür da mehrere unterschiedliche Werte zu speichern und Klassen verwendest du, wenn du ne Funktion dahinter brauchst.
In C# kannst du bei structs z.B. Konstruktoren überladen und auch Funktionen im struct implementieren. Mir wurde aber gesagt, dass man, wenn man Funktionen verwendet eigentlich wieder Klassen verwenden sollte.

Ein weiterer nachteil von structs im c# ist dass man sie nur casten kann und nicht mit is oder as den Typen dahinter abfragen oder eben auch casten kann.

Das mit den Zeigern ist im c# so ne Sache. Du kannst bei Wertetypen schon den Zeiger übergeben(ref und out Parameter) aber ob es da was in der Richtung wie im c++ gibt weiß ich leider nicht weil ich eigentlich fast nur Klassen verwende.

mfg
wensi
 
hm.
Nunja. Mich irretirt noch, dass man Klassen meistenms erst mit new Klassenname
"erstellen" muss.
Dadurch sind doch die dadrin entghaltenen Variabeln zwar unter dden angegeben Namen erreichbar, aber NUR global, wen se public und static sind...
Und, wie übergebe ich Klassen an Funktionen?
Z.B. will ich die Klasse Spieler1 (dei ich foher in der
Main Funktion mit new "erstellt" habe) an eine Funktion weitergeben,
sodass diese auf die Inhalte zugreifen kann.

Müsste ich dazu die Funktion z.B. folgender Maßen schreiben?:

Code:
class Klasse{

public void Funktion (class Spieler){

//Berechnuingen

}

}

Oder geht das auch anders, bzw. einfacher?
 
Hallo,

der Zugriff auf Varaiblen von Klassen sollte in c# mittel Propertys geregelt werden. Mit diesen Propertys kannst du dann den lesenenden oder schriebenden oder beides zulassen.

z.B.:
public class Klasse
{
private double mWert = 0.0;

//Property
public double Wert
{
get{ return mWert;}
set{ mWert = Value}
}

}


public class Test
{
private Klasse t;
public Test()
{
t = new Klasse();
t.Wert = 10.0;
double d = t.Wert;

}
}



Die Übergabe von Klassen ist in c# e immer nur die Übergabe eines Zeigers da im c# Klassen immer auf dem Heap erzeugt werden.

void DoSomething( Klasse test )
{
test.Wert = 5.0;
}

Du musst dir praktisch keine Gedanken machen bei der Übergabe der Klasse ob es ein Zeiger oder das Objekt direkt ist, weil immer nur die REferenz übergeben wird.

mfg
wensi
 
Vielen dank.
Das hilft doch schon sehr weiter.
Aber Speicherbeschaffung im Heap,
was dann in der Laufzeit passieren muss gibs in C# nicht, oder?
Das ist dann nähmlich eine schwere Einbuße.
Weil man ja nicht für alles feste Arrays nutzen kann.
Über eine Möglichkeit den Speicvherplatz Variabel anlegen zu können würde ich mich freuen^^.

Gruß Drache2.
 
hallo,

sorry, ich glaub ich kann dir diese Frage nicht beantworten, aber du kannst natürlcih schon Arrays auch variabel im c# anlegen

Klasse[] aKlassen = new Klassen[zähler];

aber ob ich deine Frage damit beantworten kann weiß ich leider nicht

mfg
wensi
 
Aber Speicherbeschaffung im Heap,
was dann in der Laufzeit passieren muss gibs in C# nicht, oder?
Wenn du zur Laufzeit einen Speicherblock brauchst, kannst du sowas machen:
C#:
int nSize = 1000;
byte [] buffer = new byte[nSize];
C# ist streng typisiert, d.h. man muss den Speicher anhand der zu verarbeitenden Datentypen festlegen

Gruß
MCoder
 
Ok. Das kenn ich ja schon aus C++.

Nur, wenn man daraus jezt ein element löschen will oder eins reinschieben, oder zumindest hinten anhängen möchte, was dann?

Weil, so kann man den nun reservierten Speicherplatz nicht mehr erweitern oder ein element daraus löschen.

Mit löschen meine ich, dass der dann reservierte speicherplatz auch wieder frei verfügbar ist und nicht mmehr dem block angehört.
 

Neue Beiträge

Zurück