Ein eigenes Event definieren und nutzen

Oft kommt es vor, dass nach dem Ausführen einer Aktion in einer Klasse andere Klassen darüber benachrichtigt werden müssen oder sollen. Hierfür gibt es in .NET Events, die bei einer bestimmten Aktion ausgelöst werden (z.B. wenn eine asynchrone Aktion durchlaufen wurde und die Daten da sind). Natürlich kann es sein, dass hier die vom .NET vorgegebenen Standardevents ausreichen, aber natürlich ist es auch möglich eigene zu definieren, denn nicht oft passen in ein fertiges .NET-Event unsere Parameter hinein. Das Ganze ist auch gar nicht mal aufwändig, denn wir müssen lediglich unseren Eventhandler definieren und das Event in unserer Klasse einbinden und natürlich irgendwo auslösen.

public delegate void CustomEventDefinitionForACustomAction(object sender, object data);

public class ExampleClass
{
    public event CustomEventDefinitionForACustomAction CustomEvent;

    public void CustomAction()
    {
        if (CustomEvent != null)
            CustomEvent.Invoke(this, new object());
    }
}

Das ist auch schon alles an Quellcode was hierfür nötig ist. Das „delegate“ definiert hierbei unseren Handler mit den Parametern. Eine Klasse, die sich anschließend auf dieses Event hängt muss eine Methode mit den gleichen Parametern bereitstellen. Das „object data“ kann natürlich hier frei definiert werden. In der Regel verwendet man hier eine spezielle „Event-Args“-Klasse. Ausgelöst wird im Beispiel das Event beim Aufrufen der „CustomAction“-Methode, nachdem es zuvor als „CustomEvent“ in der Klasse verfügbar gemacht wurde.

Ein eigener Datentyp (Teil 4)

Im letzten Teil (siehe: Ein eigener Datentyp (Teil 3)) haben wir die letzten Operatoren implementiert. In diesem Part geht es um die „Parsing“-Methoden. Diese Methoden sollen dazu dienen das Parsing von Strings zu ermöglichen. Hierfür gibt es an den Standarddatentypen die Statischen-Methoden „TryParse“ sowie „Parse“. Auch wir wollen nun diese Methoden implementieren und zur Verfügung stellen. Hierbei ist „TryParse“ quasi Exception sicher (hier werden die Exceptions gecatcht und anschließend ein false zurück gegeben). Beginnen wir mit den beiden Varianten der „TryParse“-Methode. Diese könnten wie folgt aussehen:

public static bool TryParse(string s, out Int24 result)
{
    return TryParse(s, NumberStyles.Integer, null, out result);
}

public static bool TryParse(string s, NumberStyles style, IFormatProvider formatProvider, out Int24 result)
{
    int output;
    bool canParse = Int32.TryParse(s, style, formatProvider, out output);

    if (!canParse || output > IntMaxValue || output < IntMinValue)
    {
        result = new Int24();
        return false;
    }

    result = new Int24(output);
    return true;
}

Während die kurze Fassung dieser Methode lediglich unsere längere aufruft, nutzt die ausführlich implementierte Fassung nur die „TryParse“-Methode des 32-Bit Integers. Zusätzlich werden hier allerdings noch unsere begrenzten Max- und Minwerte geprüft.   Weiterlesen

Summary-Dokumentation

Wenn Projekte eine gewisse Größe erreichen oder von anderen Entwicklern genutzt werden sollen, ist es doch immer hilfreich zu sehen was eine Methode, eine Klasse, eine Struktur oder Ähnliches zu einem bestimmten Zeitpunkt genau macht. Aber wie stellt man dies am Besten an? Der erste Schritt hierhin sind sicherlich gut durchdachte „Coding Styles“ an denen sich die Entwickler halten sollten, um so einheitlichen Code zu erschaffen. Aber es gibt da noch einen sehr effektiven Weg den Quellcode mehr als gut zu dokumentieren, die sogenannten Summary-Kommentare. Diese bieten gegenüber normalen Kommentaren zwei Vorteile: 1. Sie sind durch die Visual Studio Intellisense zu sehen. 2. Mithilfe dieser Kommentare und einem zusätzlichen Tool kann eine „Compiled HTML“-Datei (kurz: CHM) erzeugt werden.

Aufgebaut sind diese Kommentare wie normales XML. Hierbei gibt es eine Reihe vordefinierter Tags, es können aber auch eigene genutzt werden. Für den Fall, dass der „Sandcastle Help File Builder“ (siehe: http://www.codeproject.com/Articles/15176/Sandcastle-Help-File-Builder) genutzt wird, um diese Dokumentationsdateien zu erzeugen, können auch andere Quelltexte wie Examples und UnitTests über diese Summary-Kommentare verlinkt werden. Angelegt werden Summary-Kommentare über Methoden, Funktionen, Eigenschaften, Events, Delegates, Klassen, Strukturen sowie Enumerationen. Aber wie sieht so ein Kommentar aus?  Weiterlesen

Neues Kontaktformular

Es ist nun ein neues Kontaktformular verfügbar (siehe Menü / Anderes / Kontakt), über welches Ihr mir gerne Blog-Beitragsvorschläge senden könnt. Natürlich müssen diese zum Thema des Blogs passen. Da ich bereits einige Vorschläge per Mail erhielt, biete ich nun so auch jedem die Chance, der nicht meine Mailadresse kennt, Vorschläge zu äußern.

Ein eigener Datentyp (Teil 3)

Im letzten Teil (siehe: Ein eigener Datentyp (Teil 2)) haben wir uns um die Implementierung der Grund-Operatoren gekümmert. In diesem Teil wollen wir uns den Vergleichs- sowie Bitoperatoren wenden, welche ebenfalls eine entschiedene Bedeutung für Datentypen haben. Hierfür müssen wir uns jedoch zunächst darüber im Klaren sein, dass wir letztendlich nur eine Einschränkung eines Int32-Datentypes erstellen und deshalb erneut, wie auch bei den Teilen zuvor, von den bereits in Int32 implementierten Methoden Gebrauch machen können. Die hier wohl wichtigsten Operatoren sind jene, die uns die Gleicheit bzw. Ungleichheit bestätigen. Diese würden, da wir eh nur eine Integer-Spezifikation verwenden, wie folgt aussehen:

public static bool operator ==(Int24 value1, Int24 value2)
{
    return value1.Value == value2.Value;
}

public static bool operator !=(Int24 value1, Int24 value2)
{
    return value1.Value != value2.Value;
}

Auch hier ist wieder zu erkennen, dass man es sich als Entwickler oft sehr einfach machen kann. Wobei an dieser Stelle ebenfalls bedacht werden sollte, dass bei einem wirklich eigenen Typen der nicht eine so große Ähnlichkeit mit einem anderen bereits existierenden Typen hat, natürlich viel mehr Aufwand benötigt wird.  Weiterlesen

TechEd: Ausblick auf Visual Studio 2013

Kurzmitteilung

Entgegen früherer Konvention wird es aller Voraussicht nach schon dieses Jahr einen Nachfolger für die letztes Jahr erschienene Entwicklungsumgebung Visual Studio 2012 geben. Bislang erschienen größere Releases von Microsofts IDE mehr oder minder alle zwei Jahre. Das zukünftige Visual Studio 2013, für das Microsoft zur BUILD-2013-Konferenz Ende Juni eine Preview-Version veröffentlichen will, soll Ende dieses Jahres fertiggestellt sein.

Der Schritt kürzerer Veröffentlichungszyklen passt insofern ins Bild, da Microsoft seit Visual Studio 2012 in kürzeren Abständen Updates folgen lässt. Mittlerweile arbeitet der Konzern am dritten Update. Bei den früheren Releases schob er nur ein Service Pack nach. Im Sinne des kontinuierlichen Auslieferns versucht Microsoft, Anforderungen der Kunden und Anwender schneller nachkommen zu können.

Auf der TechEd in New Orleans gab der verantwortliche Produktmanager der ALM-Plattform (Application Server) Team Foundation Server, Brian Harry, einen Ausblick auf Visual Studio 2013. Zu erwarten sind demnach keine neuen Sprachfeatures oder Webentwicklungstechniken. Die wichtigsten Neuerungen liegen laut Harry vor allem in der Entwicklerproduktivität und umfassen wohl Cloud-basierte Lasttests, Team-Entwicklung-Funktionen und DevOps-Features. Weiterlesen

Singletons und ihre Nebeneffekte

Singletons sind leider ein heutzutage viel zu viel genutzter Weg, um einfach überall an die Instanz einer Klasse heranzukommen. Bei der Suche in diversen Suchmaschinen für C#-Implementierungen dieser Konstrukte findet man oft ähnliche Umsetzungen wie diese hier:

public sealed class SomeSingleton
{
    private static SomeSingleton _instance; 

    private SomeSingleton()
    { }

    public static SomeSingleton GetInstance()
    {
        if (_instance == null) 
            _instance = new SomeSingleton();

        return _instance;
    } 
}

Sieht zwar erstmal nicht sonderlich böse aus, aber es gibt da so einige Punkte, in dem diese alles andere als freundlich zum Entwickler sind. Was ist nun, wenn in Zukunft mehr als nur eine Instanz dieser Klasse nötig ist? Wie soll das sauber getestet werden, wenn die Reihenfolge von Tests nicht vorherbestimmt werden kann? Ist es immer Transparent wo diese Klasse verwendet werden kann?  Weiterlesen

Tools und Programme

Wie auch bereits auf dem xp-development Blog von Jan Schubert möchte ich an dieser Stelle einmal einige – aus meiner Sicht – sinnvollen Tools, Programme und andere Dinge erläutern. Den Beitrag vom xp-development Blog findet Ihr hier: xp-development – Die kleinen und großen Helferlein.

Entwicklungsprogramme: 
Visual Studio 2012, 2010 sowie 2008 für die C#, C++, VB, WPF, ASP Entwicklung
Mono für Cross-Platform .NET
UltraEdit und Notepad++ für andere Texte, sowie PHP JS Entwicklung etc.

Plugins:
ReSharper 7.1+ für refactoring und allgemeine Hilfe
NCrunch, NUnit, TypeMock und TestDriven.NET für UnitTests
NuGET für die Paket- und Referenzverwaltung
.NET Demon für automatisierte Rebuilds
VisualSVN, VisualHg für Zugriff auf SVN / Mercurial aus dem Studio

Tools: 
LinqPAD für schnelle Tests und „C#-Scripte“
ILSpy und Reflector zum disassemblen
NDepend für Code Analysen
dotTrace und Ants Profiler für Benchmarks sowie Leistungstests
Araxis Merge für das Mergen und Vergleichen von Texten
CCTray zum Überwachen des Buildservers
TortoiseHg, TortoiseSVN und TortoiseGit für Sourcecodeverwaltungsnutzung

Librarys: 
log4net für das Logging in .NET Projekten
Spring für die Objektinizialisierung durch XML
Knockout für die Nutzung von sehr guten Erweiterungen unter ASP.NET
SignalR für die Asynchronen Themen im ASP Bereich

Anderes: 
MSDN als Hilfe für alle .NET Themen
mycsharp.de als C# Community und Forum
spieleprogrammierer.de für die Programmierung im Bereich der Videospiele
Redmine als Projektverwaltungs-Oberfläche
MercurialSVN und Git (meist Mercurial) als Sourcecodeverwaltung
CruiseControl.NET als Buildserver

Ich denke damit sollte der Großteil abgedeckt sein. Zusätzlich werden natürlich auch Sachen wie Microsoft SQL Server 2008 R2, MySQL, MongoDB, NuSOAP, usw. verwendet, allerdings sind diese nicht ständig im Einsatz und daher nicht in der obigen Liste aufgeführt. Neben den ganzen Programmen sollten natürlich auch die Lizenzen, sowie ein ausreichend starker PC vorhanden sein. Aus privaten Erfahrungen heraus kann ich auch das Entwickeln über 3 WQHD Monitore empfehlen, da dies doch um einiges angenehmer ist. Außerdem würde ich Windows 8+ zum Entwickeln empfehlen, da andernfalls nicht alle Funktionen vom VS2012 genutzt werden können.

Ein eigener Datentyp (Teil 2)

Im letzten Teil (siehe: Ein eigener Datentyp (Teil1)) haben wir uns mit dem Grundgerüst unseres Datentypen zufrieden gegeben. Diesmal sollen die Operatoren implementiert werden. Der wohl wichtigste Operator hierfür dürfte der „implicit“-Operator oder auch Zuweisungsoperator sein. Auch hier werden wir wieder zwischen einem normalen Integer-Wert und einem Byte-Array unterscheiden und zwei Implementierungen vornehmen. Trotz der enormen Wichtigkeit dieses Operators ist dieser dennoch sehr simpel zu implementieren.

public static implicit operator Int24(int value)
{
    return new Int24(value);
}

public static implicit operator Int24(byte[] value)
{
    return new Int24(value);
}

Wie im Sourcecode zu sehen wird nur eine neue Instanz eines 24-Bit Integers erzeugt und zurück gegeben. Da wir bereits die nötigen Konstruktoren implementiert haben, haben wir keinen Aufwand mehr mit dieser Methode.  Weiterlesen