Aug 212013
 

Während der Entwicklung einiger Desktop-Applikationen hatte ich den Anwendungsfall, dass man den Zustand null in einer Checkbox darstellen soll (Indeterminate state). Da jedoch Boolean ein primitiver Datentyp ist, ist eine Wertzuweisung mit null nicht möglich.

.NET bietet für solche Fälle die generische Klasse Nullable<> an, um primitive Datentypen zu wrappen und diese null-zuweisungsfähig zu machen.
Eine Zuweisung funktioniert wie folgt:

Bei der ausführlichen Schreibweise fällt auf, dass der Konstruktor von Nullable<> nicht explizit aufgerufen wird. Der Wert wird implizit konvertiert.
Natürlich kann man auch bei eigenen Klassen die implizite Typkonvertierung implementieren. Hierfür benötigt man lediglich eine Property zum Speichern des zugewiesenen Wertes sowie einen impliziten benutzerdefinierten Typkonvertierungsoperator:

Anschließend lässt sich eine Wertzuweisung wie bei der Klasse Nullable<> durchführen:

Jun 252013
 

Im Zuge des Student Developer Club Finales sind 12 kleine Windows 8 Apps entstanden. Ziel war es innerhalb von einem Monat mindestens 10 Apps zu entwickeln.

Die Spiele Galgenmännchen 8 und Retro Snake haben mittlerweile schon > 3500 Downloads und befinden sich in den Top-Listen der jeweiligen Kategorie (es wurde nicht nur auf Quantität geachten ;-)).
Die Apps sind unter der Rubrik ‘Apps‘ zu finden.

Ich würde mich freuen wenn ihr die ein oder andere App ausprobiert und bewertet :-).

Apr 232013
 

Seit heute gibt es die offizielle Windows 8 App von oopbase.de!

http://apps.microsoft.com/windows/de-DE/app/oopbase/1f7e83fb-97b5-4a53-92ed-76b1e2c7635e

Sofern ihr Windows 8 nutzt würde ich mich über eine Bewertung freuen :-).

Mrz 142013
 

Heute möchte ich zeigen, wie man unter C# .NET eigene Attribute implementieren und verwenden kann.
Dazu zunächst die Definition eines Attributs von MSDN:

Attribute stellen eine effiziente Methode dar, um Deklarationsinformationen mit C#-Code (Typen, Methoden, Eigenschaften usw.) zu verknüpfen. Sobald das Attribut einer Programmentität zugeordnet ist, kann es zur Laufzeit mithilfe eines Verfahrens abgefragt werden, das als Reflektion bezeichnet wird.

Ein bekanntes Beispiel ist das Obsolete() Attribut. (Das Pendant in Java wäre @Deprecated)

Wenn man also über der Signatur einer Methode ein Attribut definiert, dann kann dieses via Reflection ausgelesen und verarbeitet werden. In dem konkreten Fall von Obsolete() würde der Compiler nun eine Warnung ausgeben, dass die entsprechende Methode veraltet ist.

Die Implementierung:
Zunächst ist ein Attribut nichts weiter als eine Klasse, die von System.Attribute erbt. Die simpelste Form könnte also wie folgt aussehen:

Wie der Klassenname verrät, soll ein Attribut implementiert werden, mit dem man zusätzliche Informationen über die jeweilige Methode erhält. Interessante Informationen wären evtl. das Erstellungsdatum sowie der Autor. Weiterhin möchten man vllt., dass man das Attribut ausschließlich über Methoden und nicht über Klassen setzen kann. Dazu wird die Klasse lediglich um zwei Properties sowie um ein eigenes Attribut erweitert:

In diesem Fall hätte die Methode Answer() den Autor “Chuck Norris” und das Erstellungsdatum “14.03.2013”. Die im Konstruktor definierten Parameter werden beim Aufrufen des Attributs übergeben.

Die Auswertung:
Wie bereits erwähnt lassen sich die Attribute nun via Reflection auswerten. Wenn man nun das obige Beispiel aufgreift und man z.B. wissen möchte, wie viele Methoden der Klasse Test heute entwickelt wurden, könnte eine Auswertung wie folgt aussehen:

Die Ausgabe für das obige Beispiel wäre Methods developed today = 1, da nur eine Methode in der Klasse Test mit dem Attribut versehen wurde.
Weitere Informationen zu Attributen können hier nachgelesen werden.

Jan 202013
 

Mit folgendem Code kann man das echo von sdtin aktivieren oder deaktivieren.
Besonders praktisch, da Benutzer Eingaben tätigen können, ohne das die Eingabe auf der Konsole angezeigt wird.

Dez 032012
 

Im folgenden zeige ich, wie man HTML Text in Textblöcken oder Labeln darstellen kann. Der Ausgangspunkt hierfür ist ein passender ValueConverter:

Wenn man nun also einen String an einen TextBlock bindet und den ValueConverter angibt, dann wird der Inhalt automatisch durch den Converter korrekt angezeigt. Damit man den Converter verwenden kann, muss man zunächst den Namespace in der XAML anlegen.

Anschließend muss man dann nur noch den angelegten Namespace als statische Ressource angeben.

Zuletzt kann dann das Databinding erfolgen.

Aug 012012
 

Mit folgender Funktion lässt sich ein zufälliges Passwort in C generieren. (In nächster Zeit werde ich öfters ein paar C/C++ Inhalte posten, da ich mich zur Zeit intensiv mit C beschäftige).

Zur Vorgehensweise: Es wird in jedem Schleifendurchlauf ein zufälliges Zeichen aus POSSIBLECHARS ermittelt und an die Variable retString angehangen. Die Schleife läuft so lange, bis der Zähler die vom Benutzer angegebene Anzahl erreicht hat.

Jun 182012
 

Vor ein paar Wochen bin ich auf ein interessantes Verhalten meiner Netbeans Entwicklungsumgebung gestoßen.

Ich habe eine generische Arraylist erstellt:

Die Entwicklungsumgebung hat mir dann folgendes angezeigt:

Nach dem Ausführen des Vorschlags sah die Initialisierung der Arraylist wie folgt aus:

Der Grund der Änderung scheint offensichtlich. Beim Initialisieren von generischen Typen musste der Typparameter bisher immer doppelt angegeben werden. Seit Java 7 gibt es jetzt also die verkürzte Schreibweise; eben die Diamantinferenz (Der Name kommt tatsächlich daher, dass die generischen Klammern ‘<>’ angeblich wie ein Diamant aussehen ;-)).

Der Vorteil dieser Schreibweise ist lediglich die reduzierte Schreibarbeit. Bei folgendem Konstrukt ist diese Tatsache vielleicht ganz angenehm.

In Bezug auf die Polymorphie tauchen mit der Schreibweise auch keine Probleme auf. Ausgegangen von einer Oberklasse (z.B. Animal) und einer Subklasse (z.B. Dog), wäre Folgendes so oder so nicht erlaubt:

Demnach gibt es keine Missverständnisse bei der neuen Schreibweise:

Jun 172012
 

Im Folgendem zeige ich, wie man WebRequests mit dem WP7 durchführen kann.

Zunächst initialisieren wir einen WebClient. Dieser wird die WebRequests für uns erledigen. Als nächstes erweitern wir das Event “OpenReadCompleted” des WebClient. Hier werden wir das Ergebnis des Requests abfangen können. Zuletzt rufen wir die Methode “OpenReadAsync()” auf, wo wir als Parameter die Uri der gewünschten Zieladresse angeben. Hier der Code dazu:

Jan 032012
 

Seit der Einführung von LINQ haben wir die Möglichkeit, bestehende Klassen um eigene Methoden zu erweitern. Im folgenden Beispiel zeige ich, wie wir die String Klasse um die Methode “Clear()” erweitern können.

Wir erstellen eine statische Klasse die den Namen “Extensionmethods” bekommt. In dieser Klasse wird die statische Methode “Clear()” definiert. Als Parameter übergeben wir einen String mit dem “this” Schlüsselwort davor. Dadurch legen wir fest, dass die String Klasse erweitert werden soll. Der Rückgabewert der Methode ist ein leerer String.

Wenn wir nun wie folgt einen String definieren, können wir ohne weiteres die Clear() Methode aufrufen.

Jede Klasse kann um eigene Methoden erweitert werden. Sogar die primitiven Datentypen können erweitert werden.