[X] Einführung in C# .Net



  • hatte in letzter Zeit viel zu tun mit einem kleinen Projekt zu Netzwerkprogrammierung in C# .Net, deshalb bin ich kaum zum Artikel gekomen. Wollte einfach nur melden dass ich es nicht vergessen habe, sondern dass ich momentan einfach nicht dazu gekommen bin. Ich denke das ein weiterer TEil diese Woche fertig wird. aber steter Tropfen hölt den Stein.
    bis demnächst



  • Einführung in C# .Net:

    1.Übersicht
    2.Typen
    3.Enumerationen (Enums)
    4.Boxing & Unboxing
    5.Overflow Checks
    6.Deklarationen
    7.Anweisungen(Statements)
    8.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.

    C# .Net ist eine Programmiersprache die sehr ähnlich ist wie Java
    ca 70% sind wie in Java, 10% C++, 5% Visual Basic und nur 15% sind ganz neu

    Ähnlichkeiten zu Java:
    •Objectorientierung (einfach Vererbung)
    •Interfaces
    •Exceptions
    •Threads
    •Namespaces (wie Packages)
    •Garbage Collection
    •Reflection
    •dynamisches Code-loading
    •...

    Ähnlichkeiten zu C++:
    •überladen (von Operator)
    •Pointer Arithmetic in unsicherem (unsafe) Code
    •syntaktische Details

    wirklich neu:
    •Referenz und output Parameter
    •Objekte auf dem Stack (structs)
    •Rectangular Arrays
    •Enumerationen
    •Unified type system
    •goto
    •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 Festwert-Typen(value Types) und Referenz-Typen (reference-Types)

    Festwert-Typen:
    Festwert-Typen enthalten Werte die in ihnen gespeichert werden, sie werden auf dem Stack gespeichert. Bei einer Zuweisung wird der Wert kopiert. Die Initialisierung von Festwerttypen kann wie folgt aussehen:

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

    Referenz-Typen:
    Im Gegenteil zu Festwert-Typen werden in Referenztypen, wie der Name schon sagt, Referenzen zu Objekten gespeichert, und bei Zuweisungen wird ebenfalls die Referenz kopiert; keine Werte. Referenzen werden auch nicht auf dem Stack sodern 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 annimt.

    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, ...

    ??. Felder (Arrays)

    Eindimmensionale 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 sind kompakter

    4. Boxing und Unboxing

    Boxing ist das Stichwort zur Umwandlung von (Structs, Enums oder Integern ...) 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 geau das Gegenteil; aus einem Objekt ein Werttyp machen. Das sieht dann so aus:

    int Zahl_aus_obj = (int)obj;
    

    und schon hat man aus dem Objekt ein Integer gemacht.

    5.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 Assemblie geprüft ausführen will kann man checked als Kompilerfunktion angeben.
    csc /checkedTest.cs



  • Wird ja langsam 🙂

    Polofreak schrieb:

    Einführung in C# .Net:

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

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

    Erklärung soweit richtig, aber Beispiel extrem ungünstig gewählt weil bei string so einiges anders läuft als bei normalen Objekten 🙂

    string x = "cool";
                string x2 = x;
                MessageBox.Show(x2);
                x = "Hallo";
                MessageBox.Show(x2);
    

    Was gibts als Ausgabe? Richtig, 2x cool 🙂 Liegt an dem überladen = Operator bei String. Genauso wie == bei String die Werte statt die Referenz vergleicht wie bei anderen Objekten. Es ist einfach der natürlichen Benutzungsweise von string als Wert angepasst. Nimm lieber irgend nen beliebiges anderes Objekt.



  • Nabend,

    bissle pingelig, aber was solls ;).

    Bei 'Kompatibilität unter den Typen' die rote Unterstreichung (Word Rechtschreib-
    pruefung? 🙂 ) wegmachen. Die stoert doch sehr ;).

    mfg
    v R



  • Hat nichts mit pingelig zutun, sondern ist einfach Prinzip!



  • Was ich noch vergessen hatte:

    Der Name "Festwerttyp" ist meiner Meinung nach auch blöd gewählt. Im englischen heißen die value types, also sollte man auch im Deutschen einfach nur Wertetypen sagen, weil mit fest haben die nichts zu tun. Festwert hört sich für mich eher nach Konstanten an.

    Und dann ist mir eben aufgefallen das du string ja bei beiden Arten von Typen als Beispiel verwendest. Einmal die Zuweisung wie bei einem Wertetyp und dann das Verhalten wie von Referenztypen, das ja aber nicht ganz funktioniert bei strings 😉 Vielleicht sollte man das ein wenig klarstellen, das strings zwar wirklich Referenztypen sind, aber sich eher wie Wertetypen verhalten.



  • Wow bin es gar nicht gewohnt soviel feedback zu bekommen, aber ich find es Klasse, so weiß ich 1. dass das auch jemand liest, und zweitens kann es so nur besser werden, also als aller erstes mal vielen Dank fürs feedback. So nun zum Feedback selber Das mit den roten Wellen Linien ist mir auch schon aufgefallen, werde ich auf jeden Fall noch korrigieren, ich glaub ich muss es aber nochmal neu schreiben, drum mach ich es jetzt grad nicht auf die Schnelle.
    Das mit den Festwerttypen hasste schon recht, hab glaub auch gelegentlich Werttypen geschrieben werde ich gleich noch überarbeiten. Das mit dem String muss ich mir nochmal in Ruhe Anschauen, mit dem was du da geschrieben hast. Wenn ich es nochmal durchgegangen bín melde ich mich nochmal.



  • Einführung in C# .Net:

    1.Übersicht
    2.Typen
    3.Enumerationen (Enums)
    4.Boxing & Unboxing
    5.Overflow Checks
    6.Deklarationen
    7.Anweisungen(Statements)
    8.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.

    C# .Net ist eine Programmiersprache die sehr ähnlich ist wie Java
    ca 70% sind wie in Java, 10% C++, 5% Visual Basic und nur 15% sind ganz neu

    Ähnlichkeiten zu Java:
    •Objectorientierung (einfach Vererbung)
    •Interfaces
    •Exceptions
    •Threads
    •Namespaces (wie Packages)
    •Garbage Collection
    •Reflection
    •dynamisches Code-loading
    •...

    Ähnlichkeiten zu C++:
    •überladen (von Operator)
    •Pointer Arithmetic in unsicherem (unsafe) Code
    •syntaktische Details

    wirklich neu:
    •Referenz und output Parameter
    •Objekte auf dem Stack (structs)
    •Rectangular Arrays
    •Enumerationen
    •Unified type system
    •goto
    •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 Wert-Typen(value Types) und Referenz-Typen (reference-Types)

    Wert-Typen:
    Wert-Typen 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;
    // oder
    string s = '\0'
    
    //z.B.:
    int i = 99;
    int j = i;
    

    Referenz-Typen:
    Im Gegenteil zu Wert-Typen werden in Referenztypen, wie der Name schon sagt, Referenzen zu Objekten gespeichert, und bei Zuweisungen wird ebenfalls die Referenz kopiert; keine Werte. Referenzen werden auch nicht auf dem Stack sodern 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 annimt.

    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, ...

    ??. Felder (Arrays)

    Eindimmensionale 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 sind kompakter

    4. Boxing und Unboxing

    Boxing ist das Stichwort zur Umwandlung von (Structs, Enums oder Integern ...) 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 geau das Gegenteil; aus einem Objekt ein Werttyp machen. Das sieht dann so aus:

    int Zahl_aus_obj = (int)obj;
    

    und schon hat man aus dem Objekt ein Integer gemacht.

    5.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 Assemblie geprüft ausführen will kann man checked als Kompilerfunktion angeben.
    csc /checkedTest.cs

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

    Variablen sind in niederen Deklarationsräumen verfügbar und es dürfen somit keine Variablennamen aus höheren verwendet werden, da Namen nicht mehrfach im gleichen Deklarartionsraum benutzt werden dürfen. Zwei gleichnamige Namensräumen in unterschiedlichen Files führen zu einem Deklararionsraum. 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;
    

    7. Anweisungen Statements
    Die gelisteten Ausdrücke dürften aus anderen Programmiersprachen bekannt sein, deshalb sind sie nur sehr karg kommentiert. Es soll mehr eine Beispielesammlung 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;
    

    TODO: Tabelle Vergleich mit C++
    Referenztypen mit String anschauen



  • Talla schrieb:

    ...
    Und dann ist mir eben aufgefallen das du string ja bei beiden Arten von Typen als Beispiel verwendest. Einmal die Zuweisung wie bei einem Wertetyp und dann das Verhalten wie von Referenztypen, das ja aber nicht ganz funktioniert bei strings 😉 Vielleicht sollte man das ein wenig klarstellen, das strings zwar wirklich Referenztypen sind, aber sich eher wie Wertetypen verhalten.

    Das versteh ich nicht! Welchen Typ würdest du denn nehmen um die Referenztypen zu demonstrieren? und das Beispiel funktioniert so!



  • Tut mir leid dass hier nichts geht! Aber über die :xmas1: :xmas2: :xmas1: -Zeit hatte ich eh schon wenig zu tun was aber noch sehr erschwerend dazu kommt mein Notebook ist gestorben!!!!!!

    Sobald ich aus dem Urlaub zurück komme werde ich wieder ein wenig schreiben, dass ich vielleicht auf die 01/06 Ausgabe fertig werde!



  • sorry ich hab in letztem weiter gemacht hab versehentlich editiert statt zitiert, tut mir leid, das nächste mal schreib ich es wieder über Zitat

    mfg

    Polo



  • Aber der Stand ist immer noch [A], richtig?
    Sonst pass das mal an, damit auch wer reinguckt. 😉



  • ich bin noch dran tut mir leid dass es so lange dauert aber ich konnte ja nicht damit rechnen, dass mein Notebook stirbt, und jetzt nach der Herztransplantation bin ich voll in den Klausuren. Aber ich bin noch dran und hab es nicht vergessen



  • Schon okay, danke dass du dich gemeldet hast. 🙂



  • 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.

    C# .Net ist eine Programmiersprache die sehr ähnlich ist wie Java
    ca 70% sind wie in Java, 10% C++, 5% Visual Basic und nur 15% sind ganz neu

    Ähnlichkeiten zu Java:
    •Objectorientierung (einfach Vererbung)
    •Interfaces
    •Exceptions
    •Threads
    •Namespaces (wie Packages)
    •Garbage Collection
    •Reflection
    •dynamisches Code-loading
    •...

    Ähnlichkeiten zu C++:
    •überladen (von Operator)
    •Pointer Arithmetic in unsicherem (unsafe) Code
    •syntaktische Details

    wirklich neu:
    •Referenz und output Parameter
    •Objekte auf dem Stack (structs)
    •Rectangular Arrays
    •Enumerationen
    •Unified type system
    •goto
    •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 Wert-Typen(value Types) und Referenz-Typen (reference-Types)

    Wert-Typen:
    Wert-Typen 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;
    // oder
    string s = '\0'
    
    //z.B.:
    int i = 99;
    int j = i;
    

    Referenz-Typen:
    Im Gegenteil zu Wert-Typen werden in Referenztypen, wie der Name schon sagt, Referenzen zu Objekten gespeichert, und bei Zuweisungen wird ebenfalls die Referenz kopiert; keine Werte. Referenzen werden auch nicht auf dem Stack sodern 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 annimt.

    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)

    Eindimmensionale 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 sind kompakter

    5 Boxing und Unboxing

    Boxing ist das Stichwort zur Umwandlung von (Structs, Enums oder Integern ...) 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 geau das Gegenteil; aus einem Objekt ein Werttyp machen. Das sieht dann so aus:

    int Zahl_aus_obj = (int)obj;
    

    und schon hat man aus dem Objekt ein 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 Assemblie geprüft ausführen will kann man checked als Kompilerfunktion angeben.
    csc /checkedTest.cs

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

    Variablen sind in niederen Deklarationsräumen verfügbar und es dürfen somit keine Variablennamen aus höheren verwendet werden, da Namen nicht mehrfach im gleichen Deklarartionsraum benutzt werden dürfen. Zwei gleichnamige Namensräumen in unterschiedlichen Files führen zu einem Deklararionsraum. 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 Beispielesammlung 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++;
    }
    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 am Heap (Referenztypen)
    •Erzeugung von Objekten mit [i]new*

    Stack s = new Stack(255);
    

    •können erben, vererben und Interfaces implementieren
    •dürfen Destruktor besitzen

    Konstruktoren:

    •überladbar
    •this ruft anderen Konstruktor auf (im Kopf des Konstruktors)
    •erst Initialisierungen dann Konstruktoren
    •kein Konstruktor => parameterloser Default-Konstruktor (nur dann)

    - Strukturen:

    •Objekte liegen am 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 min. einen Parameter besitzen
    •können Interfaces implementieren (aber nicht erben oder vererben)
    •dürfen keine Destruktor besitzen

    Konstruktoren:

    •haben immer parameterlosen Default-Konstruktor
    •=> keinen eingenen parameterlosen Konstruktor anlegen

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



  • Nur mal aus Neugierde: Woran unterscheidet sich eigentlich, ob ein bestimmter Typ als Referenz oder Wert genommen wird? (ist mir besonders bei deinen Beispielen aufgefallen: "string s='\0';" steht als Werttyp, "string s="cool";" als Referenztyp)

    Polofreak schrieb:

    wirklich neu:
    •Referenz und output Parameter

    Also Referenzparameter gibt es auch schon in C++

    •Enumerationen

    Was ist der entscheidende Unterschied zwischen C(++)-enum's und C# Enumerationen?

    •goto

    Goto kenne ich noch aus meiner BASIC-Zeit - und afaik gibt es das auch in C(++) (auch wenn es dort nur für "Notfälle" eingesetzt werden sollte).



  • EDIT: das kursive ist natürlich Blödsinn! String = Referenztyp!!!

    Hi erst mal Danke fürs Feedback, der erste Punkt ist in diesem Sinne etwas missverständlich string s="cool"; ist natürlich auch ein Werttyp, erst das danach folgende s1 ist ref Typ

    den Rest kommentiere ich nachher gleich nochmal



  • •Referenz und output Parameter

    Referenzen gibts, wie von CStoll gesagt, auch in C++.

    •Objekte auf dem Stack (structs)

    Ähm, gibts auch in C++ und C++/CLI.

    •Enumerationen

    Gibts auch in C++... wenn nicht sogar in auch in C99.

    •goto

    Gibts in C und C++ auch.

    •Versionierung

    Was ist das?



  • 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.

    C# .Net ist eine Programmiersprache die sehr ähnlich ist wie Java
    ca 70% sind wie in Java, 10% C++, 5% Visual Basic und nur 15% sind ganz neu

    Ähnlichkeiten zu Java:
    •Objectorientierung (einfach Vererbung)
    •Interfaces
    •Exceptions
    •Threads
    •Namespaces (wie Packages)
    •Garbage Collection
    •Reflection
    •dynamisches Code-loading
    •...

    Ähnlichkeiten zu C++:
    •überladen (von Operator)
    •Pointer Arithmetic in unsicherem (unsafe) Code
    •syntaktische Details

    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 Wert-Typen(value Types) und Referenz-Typen (reference-Types)

    Wert-Typen:
    Wert-Typen 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;
    

    Referenz-Typen:
    Im Gegenteil zu Wert-Typen werden in Referenztypen, wie der Name schon sagt, Referenzen zu Objekten gespeichert, und bei Zuweisungen wird ebenfalls die Referenz kopiert; keine Werte. Referenzen werden auch nicht auf dem Stack sodern 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 annimt.

    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)

    Eindimmensionale 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 sind kompakter

    5 Boxing und Unboxing

    Boxing ist das Stichwort zur Umwandlung von (Structs, Enums oder Integern ...) 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 geau das Gegenteil; aus einem Objekt ein Werttyp machen. Das sieht dann so aus:

    int Zahl_aus_obj = (int)obj;
    

    und schon hat man aus dem Objekt ein 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 Assemblie geprüft ausführen will kann man checked als Kompilerfunktion angeben.
    csc /checkedTest.cs

    7 Deklarationen

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

    Variablen sind in niederen Deklarationsräumen verfügbar und es dürfen somit keine Variablennamen aus höheren verwendet werden, da Namen nicht mehrfach im gleichen Deklarartionsraum benutzt werden dürfen. Zwei gleichnamige Namensräumen in unterschiedlichen Files führen zu einem Deklararionsraum. 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 Beispielesammlung 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++;
    }
    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 am Heap (Referenztypen)
    •Erzeugung von Objekten mit [i]new*

    Stack s = new Stack(255);
    

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

    Konstruktoren:

    Konstruktor-Aufruf erzeugt neues Objekt am 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 am 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 min. einen Parameter besitzen
    •können Interfaces implementieren (aber nicht erben oder vererben)
    •dürfen keinen Destruktor besitzen

    Konstruktoren:

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

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



  • öhm ich hab es mir nochmal angeschaut und ich weiß wirklich nicht was ich mir gedacht hab als ich das geschrieben hab, drum hab ich es jetzt einfach kurzer Hand raus genommen
    wegen dem Referenz parameter, meinte ich damit das Schlüsselwort ref, also sowas wie

    void Inc(ref int x) { x = x + 1; }
    void f() {
    int val = 3;
    Inc(ref val); // val == 4
    }
    

    Und noch was zu blödsinn von mir der Kommentar vorhin von wegen der String sei ein Wertty ist natürlich Humbuk!
    STRING = REFERENZ TYP


Anmelden zum Antworten