[X] Einführung in C# .Net



  • Einführung in C#.NET

    1. Übersicht
    2. Typen
    3. Enumerationen (Enums)
    4. Felder (Arrays)
    5. Boxing & Unboxing
    6. Overflow Checks
    7. Deklarationen
    8. Anweisungen (Statements)
    9. Klassen und Strukturen

    1 Übersicht

    In diesem Artikel möchte ich eine kleine Einführung in C#.NET geben und kurz und bündig erklären, was C#.NET ist; Besonderheiten und Ähnlichkeiten zu anderen Sprachen sind auch mit ein Thema.

    Wirklich neu:
    Referenz- und Output-Parameter
    • Rectangular Arrays
    • Unified type system
    • Versionierung

    Syntaktische Schönheiten:
    • Delegates
    • Indexers
    • Operator overloading
    foreach-Statements
    • Boxing/Unboxing
    • Attribute
    •...

    2 Typen (Types)

    Primitive Datentypen:
    Zu den primitiven Datentypen gehören:

    primitiver Typ     Long Form        in Java        Range
    
    sbyte               System.SByte     byte           -128 .. 127
    byte                System.Byte      ---            0..255
    short               System.Int16     short          -32768 .. 32767
    ushort              System.UInt16    ---            0 .. 65535
    int                 System.Int32     int            -2147483648 .. 2147483647
    uint                System.UInt32    ---            0 .. 4294967295
    long                System.Int64     long           -2[h]63[/h].. 2[h]63[/h]-1
    ulong               System.UInt64    ---            0 .. 2[h]64[/h]-1
    float               System.Single    float          ±1.5E-45 .. ±3.4E38(32 Bit)
    double              System.Double    double         ±5E-324 .. ±1.7E308(64 Bit)
    decimal             System.Decimal   ---            ±1E-28 .. ±7.9E28 (128 Bit)
    bool                System.Boolean   boolean        true,false
    char                System.Char      char           Unicodecharacter
    

    Kompatibilität unter den Typen

    Alle Typen sind kompatibel zu "Object". Ebenso können alle Typen Variablen vom Typ Object zugewiesen werden und es sind alle Objekt-Operationen auf sie anwendbar.

    Unterschied zwischen Werttypen (value types) und Referenztypen (reference types):

    Werttypen:
    Werttypen enthalten Werte, die in ihnen gespeichert werden. Sie werden auf dem Stack gespeichert. Bei einer Zuweisung wird der Wert kopiert. Die Initialisierung von Werttypen kann wie folgt aussehen:

    int n = 0;
    // oder
    bool b = false;
    
    //z.B.:
    int i = 99;
    int j = i;
    

    Referenztypen:
    Im Gegenteil zu Werttypen werden in Referenztypen, wie der Name schon sagt, Referenzen zu Objekten gespeichert. Bei Zuweisungen wird ebenfalls die Referenz kopiert, keine Werte. Referenzen werden auch nicht auf dem Stack, sondern auf dem Heap gespeichert und werden immer mit null initialisiert.

    string s = "cool";
    string s1 = s;
    

    3 Enumerationen

    Liste von namenhaften Konstanten, deren Deklaration direkt im Namespace geschieht.

    Beispiel:

    enum Farbe{rot, gelb, blau, gruen, lila} // hier sind die Variablen automatisch 0, 1, 2...
    enum WochenTage_mit_d{dienstag=2,donnerstag=4}
    enum WochenTage_mit_d:byte{dienstag=2,donnerstag=4}
    
    //Verwendung:
    Farbe c = Farbe.blau;
    WochenTage_mit_d WTmd = WochenTage_mit_d.dienstag | WochenTage_mit_d.donnerstag;
    if ((WochenTage_mit_d.dienstag & WTmd) != 0) 
    Console.WriteLine("Wochentag ist mit D!");
    

    Was kann man mit Enumerationen machen?
    Die Operatoren sind:

    // Vergleichsoperatoren ==; <=; >=; <; >
    if(c == Farbe.blau)//...
    if(c > Farbe.gelb && c < Farbe.lila)//...
    //weitere sind +; -; ++; --;
    c = c+2;
    c--;
    //oder gleich
    c++;
    // dann noch &; |;  ~
    if ((c & Farbe.rot) == 0)// ...
    c = c | Farbe.blau;
    c = ~ Farbe.rot;
    

    ⚠ Der Compiler prüft nicht, ob der Enum-Typ einen gültigen Wert annimmt.

    Enumerationen können Integern nur nach explizitem Cast zugewiesen werden!
    Enumerationen erben vom Typ Object, somit: Equals, ToString, ...
    Die Klasse System.Enum unterstützt Operationen wie GetName, Format, GetValues, ...

    4 Felder (Arrays)

    Eindimensionale Arrays:

    int[] a = new int[3];
    

    Mehrdimensionale Felder:
    "ausgefranzte":

    int[][] ausgefr = new int[5][];
    ausgefr[0] = new int[3];
    a[1] = new int[4];
    

    Solche Felder sind nicht sehr schnell und brauchen mehr Speicher als
    rechteckige Felder:

    int[,] re = new int[2, 3];
    

    Hier sind die Zugriffe effizienter und die Felder kompakter.

    5 Boxing und Unboxing

    Boxing ist das Stichwort zur Umwandlung von Structs, Enums oder primitiven Datentypen in ein Objekt. Objekten können somit andere Typen zugewiesen werden. Das könnte dann so aussehen:

    int nZahl=5;
    object obj = nZahl;
    

    Unboxing ist genau das Gegenteil***, nämlich*** aus einem Objekt einen Werttyp machen. Das sieht dann so aus:

    int Zahl_aus_obj = (int)obj;
    

    und schon hat man aus dem Objekt einen Integer gemacht.

    6 Overflow Checks

    Standardmäßig werden Overflows nicht abgefangen, somit kann es zu unerwünschtem Verhalten kommen. Da es aber auch sein kann, dass man mit Overflows arbeitet (Zufallszahlen) kann man manuell Overflows abfangen.

    int grosse_Zahl = 999999;
    grosse_Zahl *= grosse_Zahl; 
    // ergibt nicht mathematisch richtiges Ergebnis aber auch keinen Fehler
    
    // wenn man es abfangen [kor]will, sollte[/kor] man es besser so machen:
    grosse_Zahl = checked(grosse_Zahl*grosse_Zahl);
    //wirft OverflowException
    

    Man kann aber nicht nur einzelne Operationen mit checked prüfen, man kann auch ganze Blöcke prüfen:

    checked{
    grosse_Zahl *= grosse_Zahl; 
    }
    //wirft ebenso Overflow Exception
    

    Wenn man allerdings das komplette Assembly geprüft ausführen will, kann man checked als Compiler-Parameter angeben.
    csc /checkedTest.cs

    7 Deklarationen

    Folgende Grafik soll zeigen, wie Dateneinheiten deklariert werden können.

    Variablen sind in niederen Deklarationsräumen verfügbar. Es dürfen somit keine Variablennamen aus höheren verwendet werden, da Namen nicht mehrfach in demselben Deklarationsraum benutzt werden dürfen. Zwei gleichnamige Namensräume in unterschiedlichen Files führen zu einem Deklarationsraum. Dies hat zur Folge, dass Variablen auch in diesen anderen Files verfügbar sind. Andere Namespaces müssen importiert oder spezifiziert werden. So benutzt man z.B. meist

    using System;
    

    8 Anweisungen (Statements)

    Die gelisteten Ausdrücke dürften aus anderen Programmiersprachen bekannt sein, deshalb sind sie nur sehr karg kommentiert. Es soll mehr eine Beispielsammlung sein.

    //Zuweisungen
    z += 58*R;
    //Methodenaufrufe
    string str = "h.e.l.l.o";
    string[] geteilt = s.Split('.');
    s = String.Join(" ",geteilt);
    //if-Abfragen
    if(x>=0 && x<=10)
        x++;
    else if (x>=20 && x<=30)
        x +=5;
    else
        x=0;
    //switch
    switch(Font)
    {
        case "Überschrift 1": "Heading 1":
            Fontsize = 24;
            break;
        case "Überschrift 2": "Heading 2":
            Fontsize = 20;
            break;
        case null:
            Console.WriteLine("Kein Schema angegeben");
            break;
        default:
            Console.WriteLine("Kenne die Grösse nicht");
            break;
    }
    //auch gotos sind in switch-Anweisungen möglich
    
    //Schleifen
    while (i>n)
    {
        sum+=i;
        i--;
    }
    do
    {
        sum += a[ i ];
        i++;
    }
    while (i<n);
    
    for (int i=0; i<n; i++)
    sum+=i;
    // Schleife für Arrays (z.B. auch Strings)
    int[] x = {1,2,3,4,5,6,7,8,9};
    foreach (int z in x) sum +=z;
    

    9 Klassen und Strukturen

    - Klassen:

    • Objekte liegen auf dem Heap (Referenztypen)
    • Erzeugung von Objekten mit new

    Stack s = new Stack(255);
    

    • können erben, vererben und Interfaces implementieren (alle Klassen von object abgeleitet)
    • dürfen Destruktor besitzen

    Konstruktoren:

    Konstruktoraufruf erzeugt neues Objekt auf dem Heap und initialisiert es
    • überladbar
    • this ruft anderen Konstruktor auf (im Kopf des Konstruktors)
    • erst Initialisierungen, dann Konstruktoren
    • kein Konstruktor => parameterloser Default-Konstruktor (nur dann)

    - Strukturen:

    • Objekte liegen auf dem Stack (Werttypen)
    • Können mit new erzeugt werden (ohne new sind Felder nicht initialisiert)
    • Felder dürfen bei der Deklaration nicht initialisiert werden

    struct rechteck
    {
        int laenge = 0;// Compiler-Fehler
        int breite;//OK
        ...
    }
    

    • Konstruktoren müssen mindestens einen Parameter besitzen
    • können Interfaces implementieren (aber nicht erben oder vererben)
    • dürfen keinen Destruktor besitzen

    Konstruktoren:

    Konstruktor-Aufruf erzeugt neues Objekt auf dem Stack!
    • haben immer einen parameterlosen Default-Konstruktor
    • => keinen eigenen parameterlosen Konstruktor anlegen

    ➡ Es gibt keine anonymen Klassen (wie in Java)
    ➡ Es gibt keine Templates (wie in C++)



  • aufgrund deiner kopfschmerzen bin ich noch mal drübergegangen. warn noch vier fünf kleine fehler drin. nichts schlimmes.

    Mr. B



  • Aber Polofreak hat sich hier heute leider noch nicht sehen lassen und aufgrund des fehlenden Profils muss der Artikel leider doch noch bis nächstes Mal warten.

    Aber trotzdem ein grosses Danke an Michael und Mr.B für die schnelle Reaktion. 👍



  • Mr. B schrieb:

    aufgrund deiner kopfschmerzen bin ich noch mal drübergegangen. warn noch vier fünf kleine fehler drin. nichts schlimmes.

    Mr. B

    Ich würd gern sehen, was ich übersehen hab. Du hast leider keine kor-Tags verwendet. Kannst du mir die Stellen sagen (ich hab nur zwei Stellen gefunden, an denen du eien Satz in zwei aufteilst)?



  • Also erst einmal Sätze verbunden oder getrennt, dann einmal ein Wort ausgelassen, weil sich das stilistisch grässlich anhörte (wo, weiß ich auch nicht mehr und ich hab kein Bock, deswegen den ganzen Text nochmal durchzugehen) und die Leerzeichen nach den Aufzählungszeichen gesetzt.

    Letzter Abschnitt:

    Michael E. schrieb:

    Konstruktoren:

    Konstruktor-Aufruf erzeugt neues Objekt auf dem Stack!
    •haben immer einen parameterlosen Default-Konstruktor
    •=> keinen eingenen parameterlosen Konstruktor anlegen

    "keinen eigenen eingenen parameterlosen Konstruktor anlegen"

    Und vllt. noch was, was ich jetzt vergessen habe...

    Mr. B



  • Danke.



  • Hi zusammen erst mal tut mir leid dass ich mich nicht so schnell gemeldet hatte, mir ist was echt wichtig es dazwischen gekommen. Danke fürs Korrektur lesen, jeztt muss ich die Korrekturen nur noch übernehmen, oder?



  • Polofreak schrieb:

    Hi zusammen erst mal tut mir leid dass ich mich nicht so schnell gemeldet hatte, mir ist was echt wichtig es dazwischen gekommen.

    Kein Thema.

    jeztt muss ich die Korrekturen nur noch übernehmen, oder?

    Und wir brauchen noch ein Profil von dir.

    MfG

    GPC



  • werde ich hoffentlich diese Woche soweit erledigen, ist aber auf meiner PrioritätenListe ziemlich weit oben 😉
    Allerdings stehen da momentan sooooo viele Sachen drin 🙄
    Aber ich krieg das schon gemanaget



  • Ich nörgel ja ungern, aber wo bleibt das Profil? Wenn's bis Freitag (spätestens Samstag) nicht da ist, geht der Artikel nicht raus!

    MfG

    GPC



  • tut mir leid werd mich nach der Mittagspause dran setzen. Ist nicht genörgelt, sondern nur richtig!
    Ich hab mir einfach ein bisschen zu viel aufgeladen. Diplomarbeit Diplomprüfung Ausarbeitungen Bewerungen und Bewerbungsgespräche ... könnte noch ewig weiter machen. soll keine Entschuldigung sein, setz mich nachher dran.



  • Morgen,

    Polofreak schrieb:

    tut mir leid werd mich nach der Mittagspause dran setzen. Ist nicht genörgelt, sondern nur richtig!
    Ich hab mir einfach ein bisschen zu viel aufgeladen. Diplomarbeit Diplomprüfung Ausarbeitungen Bewerungen und Bewerbungsgespräche ... könnte noch ewig weiter machen. soll keine Entschuldigung sein, setz mich nachher dran.

    du brauchst dich nicht zu entschuldigen. Die aufgezählten Punkte haben natürlich Priorität. Aber ich muss halt auch ein bisschen planen können, also kein Problem soweit.

    MfG

    GPC



  • Aaah, jetzt muss ich schon wieder nörgeln... wo bleibt dieser Artikel als [E] Post?? Den brauchen wir, damit wir ihn veröffentlichen können. Nimm die aktuellste Version deines Artikels aus diesem Thread, kopier ihn und erstell nen neuen Thread mit dem Präfix [E] hier in der Redaktion. Danke.

    MfG

    GPC



  • Und bitte übernimm die Korrekturen in deinem Profil in den ersten Beitrag, damit das auch fertig ist. ⚠



  • GPC schrieb:

    Aaah, jetzt muss ich schon wieder nörgeln... wo bleibt dieser Artikel als [E] Post?? Den brauchen wir, damit wir ihn veröffentlichen können. Nimm die aktuellste Version deines Artikels aus diesem Thread, kopier ihn und erstell nen neuen Thread mit dem Präfix [E] hier in der Redaktion. Danke.

    MfG

    GPC

    done

    estartu schrieb:

    Und bitte übernimm die Korrekturen in deinem Profil in den ersten Beitrag, damit das auch fertig ist. ⚠

    done



  • Polofreak schrieb:

    GPC schrieb:

    Aaah, jetzt muss ich schon wieder nörgeln... wo bleibt dieser Artikel als [E] Post?? Den brauchen wir, damit wir ihn veröffentlichen können. Nimm die aktuellste Version deines Artikels aus diesem Thread, kopier ihn und erstell nen neuen Thread mit dem Präfix [E] hier in der Redaktion. Danke.

    MfG

    GPC

    done

    Wo isser?

    estartu schrieb:

    Und bitte übernimm die Korrekturen in deinem Profil in den ersten Beitrag, damit das auch fertig ist. ⚠

    done

    Danke 🙂



  • Einführung in C#.NET

    1. Übersicht
    2. Typen
    3. Enumerationen (Enums)
    4. Felder (Arrays)
    5. Boxing & Unboxing
    6. Overflow Checks
    7. Deklarationen
    8. Anweisungen (Statements)
    9. Klassen und Strukturen
    10. Refernz

    1 Übersicht

    In diesem Artikel möchte ich eine kleine Einführung in C#.NET geben und kurz und bündig erklären, was C#.NET ist; Besonderheiten und Ähnlichkeiten zu anderen Sprachen sind auch mit ein Thema.

    Wirklich neu:
    • Referenz- und Output-Parameter
    • Rectangular Arrays
    • Unified type system
    • Versionierung

    Syntaktische Schönheiten:
    • Delegates
    • Indexers
    • Operator overloading
    • foreach-Statements
    • Boxing/Unboxing
    • Attribute
    •...

    2 Typen (Types)

    Primitive Datentypen:
    Zu den primitiven Datentypen gehören:

    primitiver Typ     Long Form        in Java        Range
    
    sbyte               System.SByte     byte           -128 .. 127
    byte                System.Byte      ---            0..255
    short               System.Int16     short          -32768 .. 32767
    ushort              System.UInt16    ---            0 .. 65535
    int                 System.Int32     int            -2147483648 .. 2147483647
    uint                System.UInt32    ---            0 .. 4294967295
    long                System.Int64     long           -2[h]63[/h].. 2[h]63[/h]-1
    ulong               System.UInt64    ---            0 .. 2[h]64[/h]-1
    float               System.Single    float          ±1.5E-45 .. ±3.4E38(32 Bit)
    double              System.Double    double         ±5E-324 .. ±1.7E308(64 Bit)
    decimal             System.Decimal   ---            ±1E-28 .. ±7.9E28 (128 Bit)
    bool                System.Boolean   boolean        true,false
    char                System.Char      char           Unicodecharacter
    

    Kompatibilität unter den Typen

    Alle Typen sind kompatibel zu "Object". Ebenso können alle Typen Variablen vom Typ Object zugewiesen werden und es sind alle Objekt-Operationen auf sie anwendbar.

    Unterschied zwischen Werttypen (value types) und Referenztypen (reference types):

    Werttypen:
    Werttypen enthalten Werte, die in ihnen gespeichert werden. Sie werden auf dem Stack gespeichert. Bei einer Zuweisung wird der Wert kopiert. Die Initialisierung von Werttypen kann wie folgt aussehen:

    int n = 0;
    // oder
    bool b = false;
    
    //z.B.:
    int i = 99;
    int j = i;
    

    Referenztypen:
    Im Gegenteil zu Werttypen werden in Referenztypen, wie der Name schon sagt, Referenzen zu Objekten gespeichert. Bei Zuweisungen wird ebenfalls die Referenz kopiert, keine Werte. Referenzen werden auch nicht auf dem Stack, sondern auf dem Heap gespeichert und werden immer mit null initialisiert.

    string s = "cool";
    string s1 = s;
    

    3 Enumerationen

    Liste von namenhaften Konstanten, deren Deklaration direkt im Namespace geschieht.

    Beispiel:

    enum Farbe{rot, gelb, blau, gruen, lila} // hier sind die Variablen automatisch 0, 1, 2...
    enum WochenTage_mit_d{dienstag=2,donnerstag=4}
    enum WochenTage_mit_d:byte{dienstag=2,donnerstag=4}
    
    //Verwendung:
    Farbe c = Farbe.blau;
    WochenTage_mit_d WTmd = WochenTage_mit_d.dienstag | WochenTage_mit_d.donnerstag;
    if ((WochenTage_mit_d.dienstag & WTmd) != 0) 
    Console.WriteLine("Wochentag ist mit D!");
    

    Was kann man mit Enumerationen machen?
    Die Operatoren sind:

    // Vergleichsoperatoren ==; <=; >=; <; >
    if(c == Farbe.blau)//...
    if(c > Farbe.gelb && c < Farbe.lila)//...
    //weitere sind +; -; ++; --;
    c = c+2;
    c--;
    //oder gleich
    c++;
    // dann noch &; |;  ~
    if ((c & Farbe.rot) == 0)// ...
    c = c | Farbe.blau;
    c = ~ Farbe.rot;
    

    ⚠ Der Compiler prüft nicht, ob der Enum-Typ einen gültigen Wert annimmt.

    Enumerationen können Integern nur nach explizitem Cast zugewiesen werden!
    Enumerationen erben vom Typ Object, somit: Equals, ToString, ...
    Die Klasse System.Enum unterstützt Operationen wie GetName, Format, GetValues, ...

    4 Felder (Arrays)

    Eindimensionale Arrays:

    int[] a = new int[3];
    

    Mehrdimensionale Felder:
    "ausgefranzte":

    int[][] ausgefr = new int[5][];
    ausgefr[0] = new int[3];
    a[1] = new int[4];
    

    Solche Felder sind nicht sehr schnell und brauchen mehr Speicher als
    rechteckige Felder:

    int[,] re = new int[2, 3];
    

    Hier sind die Zugriffe effizienter und die Felder kompakter.

    5 Boxing und Unboxing

    Boxing ist das Stichwort zur Umwandlung von Structs, Enums oder primitiven Datentypen in ein Objekt. Objekten können somit andere Typen zugewiesen werden. Das könnte dann so aussehen:

    int nZahl=5;
    object obj = nZahl;
    

    Unboxing ist genau das Gegenteil, nämlich aus einem Objekt einen Werttyp machen. Das sieht dann so aus:

    int Zahl_aus_obj = (int)obj;
    

    und schon hat man aus dem Objekt einen Integer gemacht.

    6 Overflow Checks

    Standardmäßig werden Overflows nicht abgefangen, somit kann es zu unerwünschtem Verhalten kommen. Da es aber auch sein kann, dass man mit Overflows arbeitet (Zufallszahlen) kann man manuell Overflows abfangen.

    int grosse_Zahl = 999999;
    grosse_Zahl *= grosse_Zahl; 
    // ergibt nicht mathematisch richtiges Ergebnis aber auch keinen Fehler
    
    // wenn man es abfangen will, sollte man es besser so machen:
    grosse_Zahl = checked(grosse_Zahl*grosse_Zahl);
    //wirft OverflowException
    

    Man kann aber nicht nur einzelne Operationen mit checked prüfen, man kann auch ganze Blöcke prüfen:

    checked{
    grosse_Zahl *= grosse_Zahl; 
    }
    //wirft ebenso Overflow Exception
    

    Wenn man allerdings das komplette Assembly geprüft ausführen will, kann man checked als Compiler-Parameter angeben.
    csc /checkedTest.cs

    7 Deklarationen

    Folgende Grafik soll zeigen, wie Dateneinheiten deklariert werden können.

    Variablen sind in niederen Deklarationsräumen verfügbar. Es dürfen somit keine Variablennamen aus höheren verwendet werden, da Namen nicht mehrfach in demselben Deklarationsraum benutzt werden dürfen. Zwei gleichnamige Namensräume in unterschiedlichen Files führen zu einem Deklarationsraum. Dies hat zur Folge, dass Variablen auch in diesen anderen Files verfügbar sind. Andere Namespaces müssen importiert oder spezifiziert werden. So benutzt man z.B. meist

    using System;
    

    8 Anweisungen (Statements)

    Die gelisteten Ausdrücke dürften aus anderen Programmiersprachen bekannt sein, deshalb sind sie nur sehr karg kommentiert. Es soll mehr eine Beispielsammlung sein.

    //Zuweisungen
    z += 58*R;
    //Methodenaufrufe
    string str = "h.e.l.l.o";
    string[] geteilt = s.Split('.');
    s = String.Join(" ",geteilt);
    //if-Abfragen
    if(x>=0 && x<=10)
        x++;
    else if (x>=20 && x<=30)
        x +=5;
    else
        x=0;
    //switch
    switch(Font)
    {
        case "Überschrift 1": "Heading 1":
            Fontsize = 24;
            break;
        case "Überschrift 2": "Heading 2":
            Fontsize = 20;
            break;
        case null:
            Console.WriteLine("Kein Schema angegeben");
            break;
        default:
            Console.WriteLine("Kenne die Grösse nicht");
            break;
    }
    //auch gotos sind in switch-Anweisungen möglich
    
    //Schleifen
    while (i>n)
    {
        sum+=i;
        i--;
    }
    do
    {
        sum += a[ i ];
        i++;
    }
    while (i<n);
    
    for (int i=0; i<n; i++)
    sum+=i;
    // Schleife für Arrays (z.B. auch Strings)
    int[] x = {1,2,3,4,5,6,7,8,9};
    foreach (int z in x) sum +=z;
    

    9 Klassen und Strukturen

    - Klassen:

    • Objekte liegen auf dem Heap (Referenztypen)
    • Erzeugung von Objekten mit new

    Stack s = new Stack(255);
    

    • können erben, vererben und Interfaces implementieren (alle Klassen von object abgeleitet)
    • dürfen Destruktor besitzen

    Konstruktoren:

    Konstruktoraufruf erzeugt neues Objekt auf dem Heap und initialisiert es
    • überladbar
    • this ruft anderen Konstruktor auf (im Kopf des Konstruktors)
    • erst Initialisierungen, dann Konstruktoren
    • kein Konstruktor => parameterloser Default-Konstruktor (nur dann)

    - Strukturen:

    • Objekte liegen auf dem Stack (Werttypen)
    • Können mit new erzeugt werden (ohne new sind Felder nicht initialisiert)
    • Felder dürfen bei der Deklaration nicht initialisiert werden

    struct rechteck
    {
        int laenge = 0;// Compiler-Fehler
        int breite;//OK
        ...
    }
    

    • Konstruktoren müssen mindestens einen Parameter besitzen
    • können Interfaces implementieren (aber nicht erben oder vererben)
    • dürfen keinen Destruktor besitzen

    Konstruktoren:

    Konstruktor-Aufruf erzeugt neues Objekt auf dem Stack!
    • haben immer einen parameterlosen Default-Konstruktor
    • => keinen eigenen parameterlosen Konstruktor anlegen

    ➡ Es gibt keine anonymen Klassen (wie in Java)
    ➡ Es gibt keine Templates (wie in C++)

    10 Referenz

    Die . NET-Technologie. Grundlagen und Anwendungsprogrammierung. von Wolfgang Beer, u. a. Dpunkt Verlag (Oktober 2002)



  • sorry jetzt isser da, wusste nicht dass du so schnell bist 😉



  • Kein Problem. 🙂


Anmelden zum Antworten