Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gon

Treue Seele

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

31

11.07.2008, 12:19

achso ;)

32

18.07.2008, 12:59

Okey es ist jetzt definitiv, dass wir in der Schule C# und VB.net lernen werden. Das ganze wird dann so Ablaufen, dass wir beide Sprachen paralell machen werden und wir uns Aussuchen können, welche Sprache wir machen wollen. Ich werde mich dann natürlich an C# halten.

Unser Leher hat uns follgendes Buch empfholen, welches sich anscheinend an komplette Programmierneulinge wendet: http://www.amazon.de/Einstieg-Visual-200…6378294&sr=8-29
Ich bin jetzt am Überlegen, ob ich mir auf Grund der schon recht soliden C++ Vorkentnisse nicht evtl ein anderes Buch besorgen sollte.
Ich kann noch nicht beurteilen wie schwierig es ist eine andere Programmiersprache zu lernen, wenn man schon Vertraut mit Objekt orientierer Programmierung ist und schon an einem etwas größerem Projekt "2D Super Mario Spiel" gearbeitet hat, ich denke aber das es vieleicht beonders am Anfang etwas langweilig sein kann..

Gibt es vieleicht ein besonders gutes Buch für Leute die bereits weitergehende Erfahrungen mit C++ gesammelt haben und nun noch C# erlernen wollen?[/img]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

33

18.07.2008, 13:18

wenn du mit C++ schon recht fit bist, dann isses absolut kein problem C# zu lernen. ich programmier auch grad was für ne firma damit. die sprache lernt man da so nebenbei automatisch^^

wichtigste ressource is für mich die msdn.

es gibt da aber auch ein ganz gutes open book:
http://www.galileocomputing.de/openbook/visual_csharp/

34

18.07.2008, 23:47

Hi nochmal,

Das Galileobuch ist ganz schön Umfangreich "über 1000 Seiten"^^

Hab jetzt noch ein anderes Recht gutes Buch gefunden, welches einen recht guten Einstieg bietet.

Ich hätte auch noch eine kleine Frage:

Der Autor des Buches erzeugt ständig Klasseninstanzen auf dem Heap ohne den Speicher wieder freizugeben. Ist dies in C# echt kein Problem?

Auf einer Seite stand zwar, dass Speicher automatisch wieder freigeben wird aber woher, weiß das Programm, wann welcher Speicher wieder freigegben werden soll?

ThePhil

Frischling

Beiträge: 23

Beruf: Schüler

  • Private Nachricht senden

35

19.07.2008, 10:26

Zitat von »"Abcd1234"«

Der Autor des Buches erzeugt ständig Klasseninstanzen auf dem Heap ohne den Speicher wieder freizugeben. Ist dies in C# echt kein Problem?

Auf einer Seite stand zwar, dass Speicher automatisch wieder freigeben wird aber woher, weiß das Programm, wann welcher Speicher wieder freigegben werden soll?



Ja das ist kein Problem!
Der Garbage-Collector "sucht" sich einfach Instanzen die keiner mehr braucht und löscht sie dann.
Woher er das weiß? Naja vl ein Referenzcounter im Hintergrund oder sowas ;)
Weis auch nicht so genau *g*

Anonymous

unregistriert

36

19.07.2008, 12:07

ThePhil
FALSCH! Wie in Java ist auch der GC in .NET misserabel implementiert (zwar nicht ganz so schlimm, aber dennoch misserabel), aber es geht nicht anders - wenn man sich mal genauer damit beschäftigt, fällt einem auch auf warum.

Anfürsich ist es kein Problem alles auf dem Heap zu stopfen. Wird jedoch ein Objekt (Sei es ein Int, String oder eine andere Klasse) nicht durch ein:

C-/C++-Quelltext

1
GC.SuppressFinalize(this);
explizit freigegeben, wird das Objekt erst am Programmende ordentlich freigegeben, oder beim nächsten "Cleaning-Flush".

Aus diesem Grund, gibt es in C# das using-Statement, die am Ende immer ein Dispose aufruft, dafür muss das Objekt jedoch IDisposeable implementieren. Es ist auch sogesehen die einzige Möglichkeit das RAII-Prinzip in C# einzubinden.

Hier mal paar Links zum durchlesen:
http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx
http://msdn.microsoft.com/en-us/library/system.idisposable.dispose(VS.80).aspx

Jedoch die vereinfachte Aussage: "C#/Java entfernen das Objekt wenn es keine Referenz mehr hat" ist schlichtweg falsch.


edit:
Oder hier ein Auszug aus dem germangamedev.de FAQ:

Zitat

Frage: Was ist das using-Statement?
Betroffene Sprachen: C#

In vielen C#-Programmen findet man ein sog. using-Statement. Ein gutes Beispiel findet sich in einem typischen XNA-Projekt in der "Program.cs":

Quellcode

1
2
3
4
5
6
7
static void Main (string[] args)
{
    using (Game1 game = new Game1 ())
    {
        game.Run ();
    }
}


Dieses Statement ist die einzigste Möglichkeit um in C# das sog. RAII-Prinzip (Resource Acquisition Is Initialization) abzubilden, welches in C++ oft mit std::auto_ptr realisiert wird bzw. mit boost-Container.

Hin und Her, dieses Statement ist eine Kurzschreibweise für folgendes Statement:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void Main (string[] args)
{
    {
        MeineKlasse meineInstanz = new MeineKlasse ();
        
        try 
        {
           meineInstanz.MachWas ();     
        }
        finally 
        {
            if (meineInstanz != null)
                meineInstanz.Dispose ();
        }
    }
}


Wie man hier sehr gut sehen kann, hat dieses Statement bereits beim erstellen einen eigenen Scope und am Ende einer erfolgreichen durchführung ein Dispose des erstellten Objekts durchgeführt wird.

Die Dispose-Methode findet man nur in Objekten die von dem Interface IDisposeable abgeleitet sind. Es empfiehlt sich, da man das RAII-Prinzip so oft wie nur möglich einhalten sollte, ein using-Statement immer zu benutzen, wenn eine Klasse IDisposeable anbietet und ein Objekt nur innerhalb eines Objektes benutzt wird.

Das using-Statement kann man übrigends auch schachteln, damit sie sich den selben Scope teilen:

Quellcode

1
2
3
4
5
6
7
8
9
static void Main (string[] args)
{
    using (Game1 game_one = new Game1 ())
    using (Game2 game_two = new Game2 ())
    {
        game_one.Run ();
        game_two.Run ();
    }
}


Weiterführende Links
Microsoft Developer Network: using Statement (C# Reference)
Microsoft Developer Network: IDisposable Interface (System)
Microsoft Developer Network: IDisposable.Dispose Method (System)
Wikipedia: Resource Acquisition Is Initialization

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

37

19.07.2008, 14:02

Zitat von »"unsigned long"«


FALSCH! Wie in Java ist auch der GC in .NET misserabel implementiert (zwar nicht ganz so schlimm, aber dennoch misserabel), aber es geht nicht anders - wenn man sich mal genauer damit beschäftigt, fällt einem auch auf warum.


Naja das kommt darauf an was du als miserabel bezeichnest. Ich habe mit dem Garbage Collector von Java zumindestens ziemlich gute Erfahrungen gemacht. Natürlich kommt man damit sicher nicht an manuelle Speicherverwaltung ran, doch wenn man bedenkt, was einem das an Bequemlichkeit beim Entwickeln bringt ist es für viele Anwendungen ziemlich nützlich.
Kommt letztenendes natürlich auf die Anforderungen für die Anwendung an, die Java Speicherverwaltung funktioniert zumindestens für viele Serveranwendungen ziemlich gut.

Zitat von »"unsigned long"«


Jedoch die vereinfachte Aussage: "C#/Java entfernen das Objekt wenn es keine Referenz mehr hat" ist schlichtweg falsch.

Jupp, aber, je nach Anforderungen, reicht es zu wissen, dass sich Java/C# um nicht mehr benötigten Speicher kümmert. Wann er ihn freigibt ist dann schnuppe.

Mal zum Forum bezogen:
In der Spieleprogrammierung ist ein Garbage Collector denke ich generell relativ falsch angebracht. Man benötigt viel Speicher, man benötigt ihn schnell und man kann es sich nicht leisten mittem im laufenden Spiel mit dem garbage collecten anzufangen, das schlägt auf die Performance.

Aber es gibt Anwendungen in die Anforderungen ans Speichermanagment nicht so "hart" sind, daher ist das Konzept dennoch ziemlich nützlich.

PS: Ich habe mir dein FAQ Eintrag für C# mal durchgelesen, das sieht mal ziemlich nützlich aus. Ein ziemlicher Pluspunkt Java gegenüber würde ich sagen, ich sollte mir doch mal C# aneignen bald.

Anonymous

unregistriert

38

19.07.2008, 14:56

xardias
Kann es dir nur Empfehlen, auch im gamedev ist C# Java um Welten überlegen - allein schon wegen der Performance. C# benutzt im gegensatz zu Java einen geteilten GC. In Java kann man nicht sagen: "Lösch mir nun diese Referenz oder allokier mir soundsoviel Speicher und ich verwalte den", in C# geht das aber :)

Danke zum FAQ-Eintrag, er ist jedoch noch nicht fertig -braucht halt noch was bis alles fertig ist :lol:

39

22.07.2008, 13:53

Zitat

RAII-Prinzip (Resource Acquisition Is Initialization) abzubilden, welches in C++ oft mit std::auto_ptr realisiert wird bzw. mit boost-Container.

Genau bis zu dieser Zeile bin ich gekommen. Auch wenns hier steht, RAII hat nichts mit auto_ptr zu tun. Und von oft kann garnicht die Rede sein, ich hab noch nie auto_ptr benutzt (naja, manchmal fuer Exceptions waers angebracht gewesen, aber die treten bei mir nicht auf).

Anonymous

unregistriert

40

22.07.2008, 14:15

knivil
könntest du etwas genauer sein?

Werbeanzeige