Kommentare und Regionen

Gewöhnlich verwendet man Kommentare zweierlei Weise. Zum einen kommentiert man einen Code aus, wenn man sich eine Änderung gemacht hat, aber immer die Option haben möchte es rückgängig machen zu können, zum anderen eben um z.B. eine bestimmte Funktion mit eigenen Worten zu beschreiben, damit ein anderer Entwickler sich schnell damit zurecht finden. Andererseits sei es nicht unterschätzt, dass man selbst eigenen Code nach einigen Wochen wieder verstehen lernen muss.

Ich habe bereits Codes gesehen, die eher wie ein Fußballfeld von oben gesehen aussehen, als nach einer Programmierkunst. Eine komplette grüne Landschaft ist natürlich irgendwo kontraproduktiv.

Unter C# hat man aber viel mehr Möglichkeiten etwas zu kommentieren als durch das bekannte //.

1. Der klassische Kommentar: 
[crayon-6638ffe5c92b4397699495/]
 2. Kommentar über mehrere Zeilen:
[crayon-6638ffe5c92ba368223188/]
3. Kommentieren von Methoden/Klassen über <summery>:

Nachdem man eine Klasse/Methode geschrieben hat, kann man genau darüber einfach 3 Schrägstriche /// machen und ein summery-Kommentar wird generiert.  Die param Felder geben Auskunft über die Parameter, die gesetzt wurden.
[crayon-6638ffe5c92bc501676358/]
2015-03-05_15-42-47

 

4. Regionen schaffen 

Zugegeben handelt es sich nicht um einen Kommentar, sondern um eine Möglichkeit bestimmte Teile in Regionen zu teilen um eine bessere Übersicht zu schaffen.

dies geschieht, indem man einfach
[crayon-6638ffe5c92bd224982535/]
Nun kann man die Region schließen und hat einen bestimmten Codeteil sauber verpackt 🙂

2015-03-05_15-50-22

 

 




generische Klassen

Mit generischen Klassen kann man Datentyp unabhängigen Aufbau einer Klasse erreichen. Das bedeutet, man kann dann ein Objekt der Klasse erzeugen und sagen, dass die Methoden dort eben mit diesen Datentyp arbeiten soll, dem wir dem Objekt übergeben. Auch eine dort deklarierte Variable ist eben der Typ, der übergeben wurde.

Dabei arbeitet man mit einem sogenannten Typ-Parameter, welcher ähnlich einem Platzhalter für einen Datentyp stehen soll. Deutlicher wird das vielleicht durch das folgende Beispiel:


[crayon-6638ffe5c9744595211148/]
Die Klasse erhält einen Typenparameter T. Man könnte auch einen anderen Buchstaben nehmen (i.d.R. ist der erste immer ein T), oder durch Komma getrennt weitere Datentypen anfügen.

Etwas ungewöhnlicher sieht da die Klassen-Eigenschaft in der 2. Zeile aus. Denkt man sich das T weg, könnte dort ein int, string[], double oder sonstwas stehen.

Dann folgt ein Konstruktor, der dieser Eigenschaft nun einen Wert zuweist

und zum Schluss noch eine Methode, die diese Eigenschaft ausgibt.

 Contraints

im oberen Beispiel hätte man rein theoretisch die Möglichkeit alle möglichen Datentypen zu setzen. Möchte man dies aber auf eine bestimmte Art von Datentypen beschränken, so gibt es eine where Klausel. Das Muster erinnert dann ein wenig an SQL.

Dann nimmt die Klasse folgende Bezeichnung ein:
[crayon-6638ffe5c9749693084931/]
Dabei kann man daraus den Satz machen: “Filtere alle, die von der Elternklasse IComparable erben”. Dabei macht man sich am besten im Objektexplorer schlau, welche Einschränkungen man treffen möchte.

Möchte man ein Objekt erstellen und dieser Datentyp passt nicht unter das Gefilterte, wird bereits zur Entwicklungszeit ein Fehler angezeigt.

 

 

Quelle: http://www.dotnetperls.com/generic




Iteratoren

Das Verb iterieren bedeutet aus einer Kollektion (engl. Collection) nacheinander durch die enthaltenen Elemente durch zulaufen. Nichts anderes tut ja auch die foreach Schleife.

Doch was ist dazu Notwendig, damit eine Iteration stattfinden kann? Die Collection muss die IEnumerable Schnittstelle unterstützen.

IEnumerable besitzt einen Inhaltsverzeichnis (engl. Index) welcher alle Elemente der Liste durchnummeriert beinhaltet. Weiter hat die Schnittstelle eine Methode getEnumerable() um diesen Index auszugeben. Genau dies tut auch die foreach Schleife. Sie ruft die Methode getEnumerable() auf und durchläuft vom ersten bis zum letzten Enumerator.

Interatoren_Standard

Glücklicherweise beinhalten die meisten Collections in .NET diese Schnittstelle (Array, List, DataRow usw.)

Interatoren_2

Möchte man nun, dass eine Klasse nach einem bestimmten Muster iteriert wird, bietet es sich an, eine Metode in dieser Klasse zu erstellen welche vom Typ
[crayon-6638ffe5c998c564415188/]
ist und die einzelnen  Collection Elemente neu setzt. Beispiel:
[crayon-6638ffe5c998f764409465/]
[crayon-6638ffe5c9991499281930/]
durch einen Aufruf von
[crayon-6638ffe5c9992193778827/]
wird auch nur die ersten 3 durchiteriert

 

 

Quelle: http://www.s-line.de/homepages/trac/wissen/dot-net/csharp-2.html




C# und MySQL /MariaDB

Als erstes benötigt man die MySql.Data.dll, die man als Verweis hinzufügen muss.
Dazu öffnen wir die Packet-Manager-Konsole durch den Tastenkürzel ALT + T + N + O und geben dort ein:
[crayon-6638ffe5c9bab545233065/]
und bestätigen das Konsolenfenster mit Enter.

2. Namespace hinzufügen:
[crayon-6638ffe5c9bae317829276/]
3. StringBuilder erzeugen. Alternativ geht natürlich ein gewöhnlicher String:
[crayon-6638ffe5c9baf152040389/]
4.  Connection String erzeugen. Port kann evtl. ein anderer sein:
[crayon-6638ffe5c9bb0488501282/]
 

In der Regel umschließt man Datenbankverbindungen in einem try/catch. Dies wird hier von meiner Seite aber aus Gründen der besseren Übersicht nicht getan. Solltet Ihr das so verwenden wollen, empfiehlt es sich definitiv einen try/catch Block um rum zu verwenden

Methode um ein SQL Befehl auszuführen
[crayon-6638ffe5c9bb2700329130/]
Beispiel:
[crayon-6638ffe5c9bb4746450920/]
 Methode um einen Befehl aus der Datenbank zu erhalten
[crayon-6638ffe5c9bb5923683520/]
 

Beispiel:
[crayon-6638ffe5c9bb6481801100/]
 




Google Chrome – Benutzername und Passwort auslesen

stand heute funktioniert die genannte Methode noch.

Ich möchte mit dieser Anleitung nicht erreichen, dass du damit die Passwörter anderer ausliest, sondern lediglich für eigene Zwecke einsetzt. Ich übernehme daher auch keine Haftung was ihr damit macht. Bitte, tue dir selbst den Gefallen und mache das nicht, denn das kann dein ganzes Leben verändern. Negativ natürlich!

Ich stelle hier 2 Klassen zur Verfügung. Die erste, von mir geschriebene für die Prozesse, die andere ist die Decodierung des Passwortes von einem Autor, vor dem ich meinen Hut ziehe.

Die Datei, welche sämtliche gespeicherte Anmeldedaten enthält findet ihr hier:
[crayon-6638ffe5c9f49732849906/]
Dabei lässt sich diese Datei “Login Data” mit Sqlite öffnen und bearbeiten. Lediglich die Passwortfelder sind als BLOB gekennzeichnet, lassen sich aber wie oben bereits erwähnt dekodieren.

Sobald man ein Objekt der Klasse Chrome erzeugt, muss man als Parameter, einen Dateinamen .db angeben, worauf diese mit denselben Dateinamen mit [Objekt].removeTemp(“Dateiname.db”) gelöscht werden kann.

Das Objekt der Klasse Chrome enthält als Eigenschaft unter anderem 3 ausgelesene Listen: Site, Username, Password

chrome Download




Tastenkürzel

Strg + K,  Strg + C = Zeile auskommentieren

Strg + K, Strg + U = auskommentierte Zeile wieder aktivieren 

Strg + K, Strg + D = Zeilen wieder richtig ausrichten

Strg + M + L = kompletten Codeabschnitt reduzieren

Strg + Umschalt. + L = Zeile löschen

Strg + X = Zeile Ausschneiden

 

Revidiert am 2015-05-17 (Billige Tastenkürzel raus und wirklich interessante rein)

Strg + Alt + B = Breakpointfenster mit allen verfügbaren Breakpoints anzeigen




Backgroundworker

Wenn man aus einem Thread heraus eine Zeitaufwändige Operation durchführt, kann dies dazu führen, dass man den Eindruck bekommt, das Fenster wäre eingefroren. Der Grund ist ganz einfach, weil diese Aufgabe im ersten Thread stattfindet und solange dauert, bis es fertig ist. Jetzt stellt .Net den Threading Namespace zur Verfügung womit man für solche Aufgaben einen neuen Thread aufmachen könnte. Eben genau dies tut auch der Backgroundworker nur in einer stark vereinfachter Form.

Unbenannt-1

 

 

Backgroundworker einbinden:

1. Namespace hinzufügen:
[crayon-6638ffe5ca136304030997/]
2. Backgroundworker deklarieren:
[crayon-6638ffe5ca13a068269804/]
3. diesem Objekt events zuweisen:
[crayon-6638ffe5ca13b109290207/]
4. die beiden Methoden implementieren:
[crayon-6638ffe5ca13c444062172/]
5. worker asynchron ausführen lassen:
[crayon-6638ffe5ca13d544699058/]
 

wünscht man einen Bericht über den derzeitigen Prozess, so muss man auch das event ProgressChanged  hinzufügen, ReportProgress(Int32) in DoWorks ausführen lassen und in WorkerReportsProgress das Resultat bekommen

 

Häufigste Problematik die man Anfangs hat ist, dass man nicht auf die Steuerelemente aus dem 1. Thread zugreifen kann. Abhilfe schafft dort
[crayon-6638ffe5ca13e434819908/]