[X] Einführung in C# .Net
-
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 Strukturen1. Ü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 Detailswirklich neu:
•Referenz und output Parameter
•Objekte auf dem Stack (structs)
•Rectangular Arrays
•Enumerationen
•Unified type system
•goto
•VersionierungSyntaktische Schönheiten:
•Delegates
•Indexers
•Operator overloading
•foreach Statements
•Boxing/unboxing
•Attribute
•...2. Typen (Types)
Primitive Datentypen:
zu den primitiven Datentypen gehörenprimitiver 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.cs6. 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 Strukturen1 Ü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 Detailswirklich neu:
•Referenz und output Parameter
•Objekte auf dem Stack (structs)
•Rectangular Arrays
•Enumerationen
•Unified type system
•goto
•VersionierungSyntaktische Schönheiten:
•Delegates
•Indexers
•Operator overloading
•foreach Statements
•Boxing/unboxing
•Attribute
•...2 Typen (Types)
Primitive Datentypen:
zu den primitiven Datentypen gehörenprimitiver 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.cs7 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 besitzenKonstruktoren:
•ü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 werdenstruct 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 besitzenKonstruktoren:
•haben immer parameterlosen Default-Konstruktor
•=> keinen eingenen parameterlosen Konstruktor anlegenEs 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 ParameterAlso 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 Strukturen1 Ü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 Detailswirklich neu:
•Referenz und output Parameter
•Rectangular Arrays
•Unified type system
•VersionierungSyntaktische Schönheiten:
•Delegates
•Indexers
•Operator overloading
•foreach Statements
•Boxing/unboxing
•Attribute
•...2 Typen (Types)
Primitive Datentypen:
zu den primitiven Datentypen gehörenprimitiver 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.cs7 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 besitzenKonstruktoren:
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 werdenstruct 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 besitzenKonstruktoren:
Konstruktor-Aufruf erzeugt neues Objekt am Stack!
•haben immer parameterlosen Default-Konstruktor
•=> keinen eingenen parameterlosen Konstruktor anlegenEs 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 wievoid 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
-
ach ja da war noch die Frage was ist Versionierung Das .NET Framework bietet zusätzlich zur Side-by-Side-Execution eine konfigurierbare Versionskontrolle. Ein Verweis auf ein Shared Assembly erfolgt stets nicht nur über den Namen, sondern auch über die Versionsnummer. Jedes Assembly hat eine viergliedrige Versionsnummer der Form a.b.c.d, z.B. 1.8.19.72. Dies vermeidet die "DLL-Hell"
nun klar?
-
Artchi schrieb:
•Enumerationen
Gibts auch in C++... wenn nicht sogar in auch in C99.
Gibt's auch in C89 :p
-
Ah tut mir ja leid!
Ich weiß ich hatte mir was dabei gedacht leider weiß ich nicht mehr was! Aber jetzt ist es ja eh draussen.
-
gibt es noch jemand der mir thematisches Feedback geben könnte? Ansonsten ändere ich morgen kurz vor Feierabend den Status mal um eins nach vorn!
-
Gibt es niemanden mit thematischem Feedback??
-
Mir erscheint deine 70/10/5/15-Einteilung der Programmiersprachen verwirrend.
Ähnlichkeiten zu Java:
•Objectorientierung (einfach Vererbung)
•Interfaces
•Exceptions
•Threads
•Namespaces (wie Packages)
•Garbage Collection
•Reflection
•dynamisches Code-loading
•...Seit wann ist Objektorientierung mit einfacher Vererbung eine Java-Spezialität?
Seit wann ist Exception Handling eine Java-Spezialität?
Seit wann sind Threads eine Java-Spezialität? Oder willst du auf die native Unterstützung hinaus?
Du stellst Namespaces wie Packages dar, aber die Technik dahinter ist grundverschieden! Ein Effekt mag ähnlich sein, aber gerade Namespaces würde ich wirklich eher C++ zuschreiben! Und Packages habe ich in C# noch nicht gesehen ...Außerdem schweigst du dich zu den Ähnlichkeiten zu VB.Net aus, das würde mich aber auch mal interessieren
-
Vielleicht kennt sich auch einfach keiner aus.
Kennst du wen, der hier angemeldet, aber nicht im Team ist und was dazu sagen könnte?
Den würde ich dann als Korrekturleser zulassen.PS: Ups, zeitgleich...
Das Angebot bleibt.