[X] Einführung in C# .Net
-
hm hab das Buch leider grad nicht da, welches ich gerne drin hätte, mach es heute Abend wenn ich zu Hause bin! Ich hoffe das reicht noch
-
Entweder guckste noch schnell bei Amazon, ob du es wieder erkennst... oder du vertippst dich beim Abschreiben eben nicht.
...klar reicht das.
-
Ich schau mal, allerdings, weißt du wie weit die anderen Artikel sind? Wird da min einer auf nächsten Termin fertig?? Weil wenn nein dann ist es besser jedes mal einen wie jetzt mit druck noch nen zweiten.
-
CStolls zweiter Teil der STL-Serie geht dieses mal sicher raus. Deiner dazu wäre nicht schlecht.
Beim nächsten mal bin ich mit den Autotools sicher dabei und vermutlich geht der Socket-Artikel mit raus. Der macht schnell große Fortschritte.
MfG
GPC
-
Und der 3. Teil von CStolls Serie ist ja definitiv zu nächstem Monat fertig.
Aber wie gesagt: Es wäre schön, wenn es Morgen mit rausgeht... wenn du kein gutes Gefühl dabei hast, warten wir besser.
-
bis jetzt hat sich noch kein Rechtschreiber gemeldet.
Den Litheraturhinweis krieg ich schon noch hin das ist nicht das Problem
-
Polofreak schrieb:
bis jetzt hat sich noch kein Rechtschreiber gemeldet
easy going, heut schaut mit Sicherheit noch einer vorbei.
-
wir werden es sehen
und BTW ne will keine Kartoffel mit dir essen
-
Ich flieg mal drüber (zu mehr bin ich mit Kopfweh nicht imstande ).
-
Einführung in C#.NET
~Leerzeichen hinter Nummerierung~
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.
Wirklich 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ö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, und 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 sind 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 ein 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.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 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 newStack s = new Stack(255);
•können erben, vererben und Interfaces implementieren (alle Klassen von object abgeleitet)
•dürfen Destruktor besitzenKonstruktoren:
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 werdenstruct 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 besitzenKonstruktoren:
Konstruktor-Aufruf erzeugt neues Objekt auf dem Stack!
•haben immer einen parameterlosen Default-Konstruktor
•=> keinen eingenen parameterlosen Konstruktor anlegenEs gibt keine anonymen Klassen (wie in Java)
Es gibt keine Templates (wie in C++)
-
Ich hab das "namenhafte Konstanten" für enums mal stehen gelassen.
Einige Code-Schnipsel waren in cpp-Tags.
In einem Code kam [i ] (ohne Leerzeichen) vor, habs in [ i ] geändert.
Beim Unboxing stand Integer ... so unschön im Satz. Hab mal "primitive Datentypen" hingeschreiben. Ist das so in Ordnung?
-
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.
Daraus würde ich zwei Sätze machen, liest sich besser.
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.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.
Also, entweder immer mit "" oder ohne. So hat man das Gefühl, zweierlei ist gemeint.
Die Listen sehen bei dir irgendwie komisch aus. Aber das ist kein Fehler, nur Iritation meinerseits.
Sonst ist mir nichts aufgefallen.
Pass bitte beim Übernehmen der Änderungen auf, Michael hatte wohl einige Probleme mit den Tags, das Striptags dürfte nicht alles erwischen.
-
estartu schrieb:
Pass bitte beim Übernehmen der Änderungen auf, Michael hatte wohl einige Probleme mit den Tags, das Striptags dürfte nicht alles erwischen.
fixed. War ja echt extrem viel.
-
Polofreak... du hast noch kein Profil!
Ohne Profil gebe ich den Artikel ungern raus.
-
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.
Wirklich 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ö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.cs7 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 newStack s = new Stack(255);
• können erben, vererben und Interfaces implementieren (alle Klassen von object abgeleitet)
• dürfen Destruktor besitzenKonstruktoren:
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 werdenstruct 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 besitzenKonstruktoren:
Konstruktor-Aufruf erzeugt neues Objekt auf dem Stack!
• haben immer einen parameterlosen Default-Konstruktor
• => keinen eigenen parameterlosen Konstruktor anlegenEs 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.