Frage zu Begriffen wie Deklaration im Bezug auf Variablen



  • Hey Leute,
    lern zur Zeit in der Hochschule C#, komme ja "privat von C++" und wollte mal was zwecks den Begriffen Deklaration, Definition, Initialisierung und Zuweisung fragen. Vielleicht könnte mir jemand kurz erklären, vll anhand von Beispielen was in C# wann was ist 😃 . Wäre sehr cool, damit ichs glei von Anfang an verstehe und nicht verwechsel.

    Danke schonmal für die Hilfe.

    Lg freeG



  • Die Begriffe bedeuten in C# das gleiche wie in C++. 🙂



  • Deklaration und Definition werden häufig synonym verwendet und bedeuten:

    string a, b, c;
    

    Initialisierung:

    string x = "Blub";
    

    Zuweisung:

    x = "Muh";
    


  • inflames2k schrieb:

    Die Begriffe bedeuten in C# das gleiche wie in C++. 🙂

    Gibt's in C# überhaupt Deklarationen?



  • @fr33g
    Das ist in C# alles Nebensache. Copy-Constructor gibts keinen, Zuweisungsoperator kann nicht überladen werden, es gibt keine deterministischen Destruktoren und man hat eine Refrerenzsemantik. Die Referenzen sind am ehesten mit C++ Pointern zu vergleichen.

    In irgendeinem Unterverzeichnis vom Visual Studio fliegt der C# Standard als Word-doc rum. Wenn Du es also dennoch genau wissen willst, würde ich ihn dir empfehlen, statt hier auf eine unvollständige Liste von Beispielen zu hoffen.

    In C# gibt es im Gegensatz zu C++ wirklich nur wenig zu beachten um keine Katastrophe anzurichten. Z.B. das Disposal-Pattern, Unterscheidung von Value-Types und Reference-Types oder auch Hybride wie die string-Klasse (Immutable Reference-Type). Und selbt wenn man solche Sachen ignoriert geht selten etwas richtig schief.

    Die Denkweise beim programmieren ist trotzdem eine andere. V.a. wegen der Referenzsemantik und dem GC.



  • "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC#\Specifications\1031\CSharp Language Specification.doc"

    Kapitel 3.3 Deklarationen.

    Ich habe mir das jetzt nicht ganz durchgelesen. Aber die Unterscheidung Definition <-> Deklaration ist bei weitem nicht so rigide wie in C++.


  • Administrator

    hustbaer schrieb:

    Gibt's in C# überhaupt Deklarationen?

    Man kann externe Methoden deklarieren:
    http://msdn.microsoft.com/en-us/library/e59b22c5.aspx

    Ansonsten fällt mir nichts ein, was man in C# nur deklarieren kann, ohne auch gleich eine Definition zu haben.

    Grüssli



  • @Dravere
    Ah, stimmt, guter Hinweis. An die hatte ich nicht gedacht.



  • µ schrieb:

    Die Referenzen sind am ehesten mit C++ Pointern zu vergleichen.

    Ich empfinde es immer als sehr gefährlich Anfängern, besonders wenn diese von C++ kommen Referenzen als "so eine Art" Zeiger zu verkaufen, denn genau das sind sie eben nicht. Wenn überhaupt, dann müßte man Referenzen mit einem Handle vergleichen.

    Zeiger sind Speicheradressen an denen Objekte liegen. Einfach, direkt und simpel und woller potentieller Fehlerquellen wie dangling pointer etc. und vor allem zu einem der Grundprobleme der C++ Speicherverwaltung: Speicher Fragmentierung.

    C# Referenzen sind dagegen nur Nummern auf einen Eintrag in einer Tabelle der Speicherverwaltung. Du sagst der Speicherverwaltung das Du auf Objekt Nr. 15 zugreifen willst und diese liefert Dir dann den Zugriff auf das Objekt. Aber anders als im Falle von Zeigern haben Objekte keine festen Speicheradressen, daher braucht man auch die Referenzen. Im Gegensatz zum Ansatz mit Zeigern, wo der Speicherort eines Objektes über dessen gesamte Lebenszeit fest bleibt können referenzierte Objekte ihren tatsächlichen Speicherort während ihrer Lebenszeit beliebig verändern. Gerade im Falle der .NEt GC passiert das auch potntiell bei jedem GC-Lauf weil diese regelmässig eine "Defragmentierung" des Speichers vornimmt (wird auch oft als KOmprimierung bezeichnet).

    Hat dies praktische Auswirkungen? Das kommt drauf an. Solange jemand mit reinem managed Code arbeitet braucht man sich keine Gedanken über den physikalischen Ort von Objekten zu machen. KOmnbiniert man hingegen C++/CLI mit nativem C++ kann das nicht-verständnis von Referenzen katastrophale Folgen haben. Da natives C++ keine Referenzen kennt werden in diesem Scenario echte C++-Zeiger aus den Referenzen extrahiert und an die native Schicht übergeben. Dumm nur wenn dann die GC jede Objekte verschiebt... schon hat man einen ungültigen Zeiger in der nativen Schicht. (bei INteresse zu dem Thema mal pin_ptr googlen)

    Das ist auch der technische Beweis warum Referenzen keine Zeiger sind. Wären sie "so wie zeiger" müsste man in der Lage sein reibungslos Referenzen in Zeiger zu verwandeln, aber genau das geht nicht (ohne Krücken wie pin_ptr).

    Anstatt Anfängern zu sagen: Referenzen sind sowas wie Zeiger, soltle man imho besser sagen: Referenzen sind ein neues Konzept das Du Dir genauer anschauen solltest.



  • loks schrieb:

    Ich empfinde es immer als sehr gefährlich Anfängern, besonders wenn diese von C++ kommen Referenzen als "so eine Art" Zeiger zu verkaufen, denn genau das sind sie eben nicht.

    Doch, eigentlich schon.

    loks schrieb:

    Wenn überhaupt, dann müßte man Referenzen mit einem Handle vergleichen.

    Ok, tun wir das. Und Handles sind auch eine Art Zeiger.



  • @loks: D.h. Ein Zugriff auf ein Objekt über eine Referenz bedeutet immer eine doppelte Indirektion? Kann man das irgendwo nachlesen?



  • @loks
    "Ich empfinde es immer als sehr gefährlich Anfängern..."
    Ach bitte..

    Vielleicht sollte ich noch ein paar Warnschilder um meine Aussage aufstellen:

    :warning:  :warning:  :warning:  "Die Referenzen sind [b]am ehesten[/b] mit C++ Pointern [b]zu vergleichen[/b]."  :warning:  :warning:  :warning:
    

    Nicht dass irgendein Idiot kommt und uns alle gefährdet...


Log in to reply