1
0
mirror of https://github.com/adambard/learnxinyminutes-docs.git synced 2025-08-10 00:36:48 +02:00

a plethora of smaller tweaks

This commit is contained in:
m90
2014-10-11 19:41:30 +02:00
parent 54e4448730
commit a142c72ed4

View File

@@ -59,10 +59,10 @@ namespace Learning
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// Typen & Variablen // Typen & Variablen
//
// Deklariere eine Variable mit <Typ> <Name>
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// Deklariere eine Variable mit <Typ> <Name>
// Sbyte - Vorzeichenbehaftete 8-Bit Ganzzahl // Sbyte - Vorzeichenbehaftete 8-Bit Ganzzahl
// (-128 <= sbyte <= 127) // (-128 <= sbyte <= 127)
sbyte fooSbyte = 100; sbyte fooSbyte = 100;
@@ -97,7 +97,7 @@ namespace Learning
// float handelt // float handelt
// Decimal - ein 128-Bit-Datentyp mit mehr Genauigkeit als andere // Decimal - ein 128-Bit-Datentyp mit mehr Genauigkeit als andere
// Fließkommatypen, und somit bestens geeignet für Berechnung von // Fließkommatypen, und somit bestens geeignet für Berechnung von
// Geld- und Finanzwerten // Geld- und Finanzwerten
decimal fooDecimal = 150.3m; decimal fooDecimal = 150.3m;
@@ -108,7 +108,7 @@ namespace Learning
char fooChar = 'A'; char fooChar = 'A';
// Strings - im Gegensatz zu allen vorhergehenden Basistypen, die // Strings - im Gegensatz zu allen vorhergehenden Basistypen, die
// alle Werttypen sind ist String ein Referenztyp. Er ist somit // alle Werttypen sind, ist String ein Referenztyp. Er ist somit
// nullable, Werttypen sind dies nicht. // nullable, Werttypen sind dies nicht.
string fooString = "\"maskiere\" Anführungszeichen, und füge \n (Umbrüche) und \t (Tabs) hinzu"; string fooString = "\"maskiere\" Anführungszeichen, und füge \n (Umbrüche) und \t (Tabs) hinzu";
Console.WriteLine(fooString); Console.WriteLine(fooString);
@@ -135,7 +135,7 @@ namespace Learning
// Durch ein vorangestelltes @ lässt sich ein mehrzeiliger String // Durch ein vorangestelltes @ lässt sich ein mehrzeiliger String
// schreiben. Um " zu maskieren benutzt man "" // schreiben. Um " zu maskieren benutzt man ""
string bazString = @"Hier geht es string bazString = @"Hier geht es
zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten"; zur nächsten Zeile, ""Wahnsinn!"", die Massen waren kaum zu bändigen";
// Die Keywords const oder readonly kennzeichnen eine unveränderliche // Die Keywords const oder readonly kennzeichnen eine unveränderliche
// Variable/Konstante. Die Werte von Konstanten werden übrigens // Variable/Konstante. Die Werte von Konstanten werden übrigens
@@ -167,7 +167,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// List<datatype> <var name> = new List<datatype>(); // List<datatype> <var name> = new List<datatype>();
List<int> intList = new List<int>(); List<int> intList = new List<int>();
List<string> stringList = new List<string>(); List<string> stringList = new List<string>();
List<int> z = new List<int> { 9000, 1000, 1337 }; // intialize List<int> z = new List<int> { 9000, 1000, 1337 };
// Die <> kennzeichnen "Generics", mehr dazu unter "Coole Sachen" // Die <> kennzeichnen "Generics", mehr dazu unter "Coole Sachen"
// Listen haben keinen Default-Wert. // Listen haben keinen Default-Wert.
@@ -217,7 +217,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// Inkremente // Inkremente
int i = 0; int i = 0;
Console.WriteLine("\n->Inc/Dec-rementation"); Console.WriteLine("\n->Inkrement / Dekrement");
Console.WriteLine(i++); //i = 1. Post-Inkrement Console.WriteLine(i++); //i = 1. Post-Inkrement
Console.WriteLine(++i); //i = 2. Pre-Inkrement Console.WriteLine(++i); //i = 2. Pre-Inkrement
Console.WriteLine(i--); //i = 1. Post-Dekrement Console.WriteLine(i--); //i = 1. Post-Dekrement
@@ -240,7 +240,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
} }
else else
{ {
Console.WriteLine("Ich auch nicht"); Console.WriteLine("Ich leider auch nicht");
} }
// Ternärer Operator // Ternärer Operator
@@ -286,9 +286,9 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// da String IEnumerable bereits implementiert) // da String IEnumerable bereits implementiert)
// Switch Struktur // Switch Struktur
// Ein Switch funktioniert mit byte, short, char und int Datentypen // Ein Switch funktioniert mit byte, short, char und int Datentypen.
// Auch Aufzählungstypen können verwendet werden, genau wie // Auch Aufzählungstypen können verwendet werden, genau wie
// die Klasse String, und ein paar Sonderklassen die Wrapper für // die Klasse String, und ein paar Sonderklassen, die Wrapper für
// Primitives sind: Character, Byte, Short und Integer // Primitives sind: Character, Byte, Short und Integer
int month = 3; int month = 3;
string monthString; string monthString;
@@ -304,7 +304,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
monthString = "März"; monthString = "März";
break; break;
// Man kann für mehrere Fälle auch das selbe Verhalten // Man kann für mehrere Fälle auch das selbe Verhalten
// definierern. Jeder Block muss aber mit einem break-Statement // definieren. Jeder Block muss aber mit einem break-Statement
// abgeschlossen werden. Einzelne Fälle können über // abgeschlossen werden. Einzelne Fälle können über
// `goto case x` erreicht werden // `goto case x` erreicht werden
case 6: case 6:
@@ -336,7 +336,8 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
} }
// von Integer nach String // von Integer nach String
// Die Klasse Convert stellt Methoden zur Kovertierung von unterschiedlichsten Daten zur Verfügung // Die Klasse Convert stellt Methoden zur Konvertierung von
// unterschiedlichsten Daten zur Verfügung:
Convert.ToString(123); // "123" Convert.ToString(123); // "123"
// oder // oder
tryInt.ToString(); // "123" tryInt.ToString(); // "123"
@@ -355,7 +356,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
trek.SpeedUp(3); // Es empfiehlt sich immer Getter und Setter zu benutzen trek.SpeedUp(3); // Es empfiehlt sich immer Getter und Setter zu benutzen
trek.Cadence = 100; trek.Cadence = 100;
// ToString ist eine Konvention über die man überlicherweiser // ToString ist eine Konvention über die man üblicherweiser
// Informationen über eine Instanz erhält // Informationen über eine Instanz erhält
Console.WriteLine("Infos zu trek: " + trek.Info()); Console.WriteLine("Infos zu trek: " + trek.Info());
@@ -395,8 +396,8 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
return -1; return -1;
} }
// Methoden können überladen werden solange sie eine eindeutige // Methoden können überladen werden, solange sie eindeutige
// Signatur haben // Signaturen haben
public static void MethodSignatures(string maxCount) public static void MethodSignatures(string maxCount)
{ {
} }
@@ -417,7 +418,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
return result; return result;
} }
// Über ihr Interface lassen sich die möglichen Typen auch beschränken // Möglichen Typen lassen sich auch über ihr Interface beschränken:
public static void IterateAndPrint<T>(T toPrint) where T: IEnumerable<int> public static void IterateAndPrint<T>(T toPrint) where T: IEnumerable<int>
{ {
// Da T ein IEnumerable ist können wir foreach benutzen // Da T ein IEnumerable ist können wir foreach benutzen
@@ -441,7 +442,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// Nullables - perfekt für die Interaktion mit // Nullables - perfekt für die Interaktion mit
// Datenbanken / Rückgabewerten // Datenbanken / Rückgabewerten
// Jeder Wert (d.h. keine Klassen) kann durch das Nachstellen eines ?s // Jeder Wert (d.h. keine Klassen) kann durch das Nachstellen eines ?
// nullable gemacht werden: <type>? <var name> = <value> // nullable gemacht werden: <type>? <var name> = <value>
int? nullable = null; // Die explizite Langform wäre Nullable<int> int? nullable = null; // Die explizite Langform wäre Nullable<int>
Console.WriteLine("Mein Nullable: " + nullable); Console.WriteLine("Mein Nullable: " + nullable);
@@ -451,8 +452,9 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// dass die Variable null ist festzulegen. // dass die Variable null ist festzulegen.
int notNullable = nullable ?? 0; // 0 int notNullable = nullable ?? 0; // 0
// Implizit typisierte (dynamische) Variablen // Implizit typisierte Variablen
// Man kann auch den Compiler den Typ einer Variable bestimmen lassen: // Man kann auch den Typ einer Variable auch vom Compiler
// bestimmen lassen:
var magic = "magic ist zur Compile-Zeit ein String, folglich geht keine Typsicherheit verloren"; var magic = "magic ist zur Compile-Zeit ein String, folglich geht keine Typsicherheit verloren";
magic = 9; // funktioniert nicht da magic vom Typ String ist magic = 9; // funktioniert nicht da magic vom Typ String ist
@@ -464,8 +466,8 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// Hier könnte man auch unser generisches SetDefault von // Hier könnte man auch unser generisches SetDefault von
// weiter oben benutzen: // weiter oben benutzen:
Console.WriteLine(SetDefault<string,string>(phonebook, "Xaver", "kein Telefon")); // kein Telefon Console.WriteLine(SetDefault<string,string>(phonebook, "Xaver", "kein Telefon")); // kein Telefon
// TKey und TValue müssen nicht angegeben werden, da sie auch implizit // TKey und TValue müssen nicht zwingend angegeben werden, da sie
// vom Compiler ermittelt werden können // auch implizit vom Compiler ermittelt werden können
Console.WriteLine(SetDefault(phonebook, "Resi", "kein Telefon")); // 08822 / 43 67 Console.WriteLine(SetDefault(phonebook, "Resi", "kein Telefon")); // 08822 / 43 67
// Lambdas - konzise Syntax für Inline-Funktionen // Lambdas - konzise Syntax für Inline-Funktionen
@@ -473,11 +475,11 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
Console.WriteLine(square(3)); // 9 Console.WriteLine(square(3)); // 9
// Disposables - einfaches Management von nicht verwalteten Ressourcen // Disposables - einfaches Management von nicht verwalteten Ressourcen
// So gut wie alle Objekte über die auf nicht verwaltete Ressourcen // So gut wie alle Objekte die auf nicht verwaltete Ressourcen
// (Dateien, Geräte, ...) zugreifen implementieren das Interface // (Dateien, Geräte, ...) zugreifen, implementieren das Interface
// IDisposable. Das using Statement stellt sicher dass die vom // IDisposable. Das using Statement stellt sicher dass die vom
// IDisposable benutzten Ressourcen nach der Benutzung wieder // IDisposable benutzten Ressourcen nach der Benutzung wieder
// freigegeben werden // freigegeben werden:
using (StreamWriter writer = new StreamWriter("log.txt")) using (StreamWriter writer = new StreamWriter("log.txt"))
{ {
writer.WriteLine("Alles bestens!"); writer.WriteLine("Alles bestens!");
@@ -494,7 +496,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
var responses = new Dictionary<string, string>(); var responses = new Dictionary<string, string>();
// Für jeden Request wird ein neuer Thread erzeugt, der nächste // Für jeden Request wird ein neuer Thread erzeugt, der nächste
// Schritt wird erst nach Beendigung aller Requests ausgeführt // Schritt wird erst nach Beendigung aller Tasks ausgeführt
Parallel.ForEach(websites, Parallel.ForEach(websites,
// maximal 3 Threads gleichzeitig // maximal 3 Threads gleichzeitig
new ParallelOptions() {MaxDegreeOfParallelism = 3}, new ParallelOptions() {MaxDegreeOfParallelism = 3},
@@ -515,7 +517,8 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// Dynamische Objekte (gut um mit anderen Sprachen zu arbeiten) // Dynamische Objekte (gut um mit anderen Sprachen zu arbeiten)
dynamic student = new ExpandoObject(); dynamic student = new ExpandoObject();
student.FirstName = "Christian"; // hier muss keine Klasse angegeben werden // hier muss keine Klasse angegeben werden
student.FirstName = "Christian";
// Einem solchen Objekt kann man sogar Methoden zuordnen. // Einem solchen Objekt kann man sogar Methoden zuordnen.
// Das Beispiel gibt einen String zurück und erwartet einen String // Das Beispiel gibt einen String zurück und erwartet einen String
@@ -567,12 +570,14 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// LINQ-Operationen werden "lazy" ausgeführt. // LINQ-Operationen werden "lazy" ausgeführt.
var db = new BikeRepository(); var db = new BikeRepository();
// Die verzögerte Ausführung ist super für Datenbankabfragen // Die verzögerte Ausführung ist optimal für Datenbankabfragen
var filter = db.Bikes.Where(b => b.HasTassles); // noch keine Abfrage var filter = db.Bikes.Where(b => b.HasTassles); // noch keine Abfrage
// Es können noch mehr Filter hinzugefügt werden (auch mit // Es können noch mehr Filter hinzugefügt werden (auch mit
// Bedingungen) - ideal für z.B. "erweiterte Suchen" // Bedingungen) - ideal für z.B. "erweiterte Suchen"
if (42 > 6) if (42 > 6)
{
filter = filter.Where(b => b.IsBroken); // immer noch keine Abfrage filter = filter.Where(b => b.IsBroken); // immer noch keine Abfrage
}
var query = filter var query = filter
.OrderBy(b => b.Wheels) .OrderBy(b => b.Wheels)
@@ -601,7 +606,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
} }
} }
// Syntax zur Deklaration einer Klasse // Syntax zur Deklaration einer Klasse:
// <public/private/protected/internal> class <class name>{ // <public/private/protected/internal> class <class name>{
// // Datenfelder, Konstruktoren und Methoden leben alle // // Datenfelder, Konstruktoren und Methoden leben alle
// // innerhalb dieser Deklaration // // innerhalb dieser Deklaration
@@ -644,7 +649,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// Man kann aber natürlich auch das Keyword private benutzen. // Man kann aber natürlich auch das Keyword private benutzen.
private string Name { get; set; } private string Name { get; set; }
// Ein Enum ist ein klar definierter Satz an benannten Konstanten // Ein Enum ist ein klar definierter Satz an benannten Konstanten.
// Eigentlich ordnet es diese Konstanten nur bestimmten Werten zu // Eigentlich ordnet es diese Konstanten nur bestimmten Werten zu
// (einer int-Zahl, solange nicht anders angegeben). Mögliche Typen für // (einer int-Zahl, solange nicht anders angegeben). Mögliche Typen für
// die Werte eines Enums sind byte, sbyte, short, ushort, int, uint, // die Werte eines Enums sind byte, sbyte, short, ushort, int, uint,
@@ -656,8 +661,8 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
Bianchi = 42, // so kann man den Wert explizit setzen Bianchi = 42, // so kann man den Wert explizit setzen
Kynast // 43 Kynast // 43
} }
// Nachdem dieser Typ in der Klasse "Bicycle" definiert ist // Nachdem dieser Typ in der Klasse "Bicycle" definiert ist,
// sollte Code ausserhalb der Klasse den Typen als Bicycle referenzieren // sollte Code ausserhalb der Klasse den Typen als Bicycle.Brand referenzieren
// Nachdem das Enum deklariert ist, können wir den Typen verwenden: // Nachdem das Enum deklariert ist, können wir den Typen verwenden:
public BikeBrand Brand; public BikeBrand Brand;
@@ -665,7 +670,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// Als static gekennzeichnete Member gehören dem Typ selbst, // Als static gekennzeichnete Member gehören dem Typ selbst,
// nicht seinen Instanzen. Man kann sie also ohne Referenz zu einem // nicht seinen Instanzen. Man kann sie also ohne Referenz zu einem
// Objekt benutzen // Objekt benutzen
Console.WriteLine("Schon " + Bicycle.bicyclesCreated + " Fahrräder, nur für dieses Tutorial!"); Console.WriteLine("Schon " + Bicycle.BicyclesCreated + " Fahrräder, nur für dieses Tutorial!");
static public int BicyclesCreated = 0; static public int BicyclesCreated = 0;
// readonly-Werte werden zur Laufzeit gesetzt // readonly-Werte werden zur Laufzeit gesetzt
@@ -673,7 +678,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// festgelegt werden // festgelegt werden
readonly bool _hasCardsInSpokes = false; // readonly und private readonly bool _hasCardsInSpokes = false; // readonly und private
// Konstruktoren bestimmen was bei einer Instantiierung passiert // Konstruktoren bestimmen was bei einer Instantiierung passiert.
// Das ist ein Default-Konstruktor: // Das ist ein Default-Konstruktor:
public Bicycle() public Bicycle()
{ {
@@ -727,8 +732,8 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// Eigenschaften mit get/set // Eigenschaften mit get/set
// wenn es nur um den Zugriff auf Daten geht ist eine Eigenschaft zu // wenn es nur um den Zugriff auf Daten geht ist eine Eigenschaft zu
// empfehlen. Diese können Getter und Setter haben, oder auch nur Getter // empfehlen. Diese können Getter und Setter haben, oder auch nur
// bzw. Setter // einen Getter bzw. einen Setter
private bool _hasTassles; // private Variable private bool _hasTassles; // private Variable
public bool HasTassles // öffentliches Interface public bool HasTassles // öffentliches Interface
{ {
@@ -738,7 +743,8 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// Das kann man auch kürzer schreiben: // Das kann man auch kürzer schreiben:
// Dieser Syntax erzeugt automatisch einen hinterlegten Wert, // Dieser Syntax erzeugt automatisch einen hinterlegten Wert,
// der gesetzt bzw. zurückgegeben wird: // (entsprechend `private bool _isBroken`) der gesetzt
// bzw. zurückgegeben wird:
public bool IsBroken { get; private set; } public bool IsBroken { get; private set; }
public int FrameSize public int FrameSize
{ {
@@ -763,7 +769,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
// Auch Methoden können als static gekennzeichnet werden, nützlich // Auch Methoden können als static gekennzeichnet werden, nützlich
// beispielsweise für Helper-Methoden // beispielsweise für Helper-Methoden
public static bool DidWeCreateEnoughBicycles() public static bool DidWeCreateEnoughBicyclesYet()
{ {
// In einer statischen Methode können wir natürlich auch nur // In einer statischen Methode können wir natürlich auch nur
// statische Member der Klasse referenzieren // statische Member der Klasse referenzieren
@@ -807,7 +813,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
} }
// Interfaces (auch Schnittstellen genant) definieren nur die Signaturen // Interfaces (auch Schnittstellen genant) definieren nur die Signaturen
// ihrer Member, enthalten aber auf keinen Fall ihre Implementierung. // ihrer Member, enthalten aber auf keinen Fall ihre Implementierung:
interface IJumpable interface IJumpable
{ {
// Alle Member eines Interfaces sind implizit public // Alle Member eines Interfaces sind implizit public
@@ -840,7 +846,7 @@ zur nächsten Zeile ""Wahnsinn!"", die Massen waren kaum zu halten";
} }
} }
// Stellt eine Datenbankverbindung für das LinqToSql-Beispiel her. // Das hier stellt eine Datenbankverbindung für das LinqToSql-Beispiel her.
// EntityFramework Code First ist großartig (ähnlich wie Ruby's ActiveRecord, aber bidirektional) // EntityFramework Code First ist großartig (ähnlich wie Ruby's ActiveRecord, aber bidirektional)
// http://msdn.microsoft.com/de-de/data/jj193542.aspx // http://msdn.microsoft.com/de-de/data/jj193542.aspx
public class BikeRepository : DbSet public class BikeRepository : DbSet