Archive

Posts Tagged ‘C#’

Neues in .Net

26. Juli 2015 Kommentare aus

Im Schlepptau der Veröffentlichung von Visual Studio 2015 gibt es zahlreiche Neuigkeiten rund um .Net. Bei all den Versionen und Ankündigungen verliert man jedoch schnell den Überblick und alleine die Videos vom “Final Release Event” kommen zusammen auf fast 5 Stunden Demos und Erklärungen. Damit man ein wenig gezielter nach Neuigkeiten suchen kann, habe ich hier eine kleine Auslegeordnung der für mich wichtigsten Punkte vorgenommen.

 

.Net 4.6 und C# 6

Das .Net Framework wird kräftig weiterentwickelt und bietet mit Roslyn ganz neue Möglichkeiten zur Codeanalyse. Im Moment hört sich in diesem Bereich noch vieles nach einer netten Spielerei an. Richtig angewendet dürfen wir uns auf eine ganz neue Generation von Analysewerkzeugen freuen, die weit über Dinge wie die Null-Check Warnhinweise von ReSharper hinausgehen.

Für Entwickler wohl am deutlichsten spürbar ist der neue Null-Conditional Operator, der einem zahlreiche mühsame Null-Kontrollen erspart. Ob die Variablen customers oder Orders auf dieser Zeile Null sind spielt keine Rolle, der Code wird ausgeführt und liefert das gewünschte Ergebnis:

int? first = customers?[0].Orders?.Count();

Weitere Neuerungen wie die Filter bei Exceptions muss ich erst selber ausprobieren. Hat man jahrelang ohne diese Funktion programmiert fällt es einem oft schwer den Nutzen zu erkennen. Dies dürfte sich je nach Anwendungsfall aber schnell ändern, von dem her sollte man damit erst ein wenig herumexperimentieren bevor man ein Urteil fällt.

 

ASP.NET 4.6 ist nicht vNext

Im letzten Jahr war bei ASP.NET vor allem die Rede von vNext. Diese Neuentwicklung bricht mit dem bisherigen ASP.NET und hat als eines der auffälligsten Merkmale die project.json Datei. Zwischenzeitlich wurde vNext in ASP.NET 5 umbenannt. Damit es aber richtig kompliziert wird nennt man die Verschmelzung von ASP.NET MVC und Web API nun ASP.NET MVC 6. Dies da ASP.NET MVC 5 ja bereits im Oktober 2013 mit Visual Studio 2013 erschienen ist.

ASP.NET vNext resp. 5 ist noch in der Entwicklung und dürfte nach aktueller Roadmap erst im 1. Quartal 2016 erscheinen. Somit bleibt noch ein wenig Zeit bis man sich in ein grundlegend neues Framework einarbeiten muss.

Das jetzt veröffentlichte ASP.NET 4.6 enthält vor allem Optimierungen und Detailverbesserungen für die aktuellen Versionen von MVC, Web Forms und Web API. Damit findet man sich schnell zurecht, da die grossen Änderungen ja erst 2016 kommen. Dennoch lohnt sich ein Update, denn die verbesserte Unterstützung von IntelliSense für Bootstrap und AngularJS spürt man deutlich.

 

Änderungen an den Visual Studio Versionen

Die Premium und die Ultimate Version von Visual Studio 2013 wurden bei 2015 in der Enterprise Version kombiniert. Dementsprechend müssen sich bisherige Besitzer der Premium Version bei der nächsten Vertragserneuerung auf höhere Lizenzkosten gefasst machen.

Am unteren Ende der Versionspalette befindet sich die Visual Studio Community Edition, die gerade für kleinere Teams und Firmen mit weniger als 250 PCs oder 1 Million $ Jahresumsatz eine interessante Alternative darstellt. Entgegen der bekannten Express-Edition kann man hier die IDE erweitern und beispielsweise auch ReSharper verwenden.

Welche Version man nun mit welchen Funktionen erhält findet man auf der Übersichtseite von Microsoft.

 

Fazit

Diese Woche bringt für.Net Entwickler viel Neues. Leider erschwert der nicht gerade übersichtliche Mix aus 4.6, 5 und 6er Versionen das Zurechtfinden. Diese Verwirrung dürfte sich aber bald legen und mit ein wenig produktiver Erfahrung wird man die neuen Möglichkeiten von C# auch besser einordnen können. Angesichts von ASP.NET 5 wird es auch im 2016 spannend bleiben…

Schlagwörter:, ,

Mein Technologieradar für 2015

22. April 2015 2 Kommentare

Seit der Veröffentlichung meines ersten Technologieradars ist schon mehr als ein Jahr vergangen. Somit ist es höchste Zeit für einen Rückblick, ein Fazit und die Erstellung der nächsten Version.

 

Was brachte mir der Technologieradar?

Der grösste Pluspunkt für mich war die erzwungene Fokussierung. Ein bewusstes Einteilen von verschiedenen Technologien in die einzelnen Ringe hat mir sehr geholfen. Ganz wesentlich war der Ring Hold, in den alles hinein geht mit dem ich mich nicht beschäftigen wollte. Dadurch konnte ich mich auf die Technologien fokussieren, die ich als wichtig erachte und hatte dennoch genügend Zeit um auch auf Neues reagieren zu können.

Ein einmal erstellter Technologieradar ist kein starres Konstrukt. Wie ein richtiges Radar soll dieser vielmehr auf die Umgebung reagieren und wichtiges hervorheben.
Strukturierte Logmeldungen sind so ein neues Thema, das aus der vagen Idee von “Log as Data” und “Business Event Tracking” entstanden ist und zu einigen Blog Posts führte.

 

Mein neuer Technologieradar

Wie im letzten Jahr habe ich wiederum das Projekt Techradar von Brett Dargan verwendet. Die Ringe sind ebenfalls unverändert und folgen der Idee von ThoughtWorks:

  • Hold (abwarten): Keine neuen Projekte mit diesen Technologien starten.
  • Assess (einschätzen): Genauer hinschauen ob sich daraus etwas entwickelt.
  • Trial (ausprobieren): In kleineren und weniger wichtigen Projekten Erfahrungen sammeln.
  • Adopt (umsetzen): Bereit um in kritischen Anwendungen verwendet zu werden.

Mit der 2. Ausgabe macht es nun auch Sinn zwischen bestehenden und sich bewegenden Themen zu unterscheiden. Die Kreise stehen dabei für unveränderte Technologien, während die Dreiecke Neuigkeiten oder grosse Veränderungen markieren.

Techradar_2015

 

Techniken, Verfahren & Methoden

Techradar_2015_Techniques
In diesem Quadranten gibt es wenige Veränderungen. Das neue Thema der strukturierten Logmeldungen sowie Exploratory Testing sind aus meiner Sicht bereit für den produktiven Einsatz und können bei der Fehlervermeidung und Eingrenzung sehr hilfreich sein. Für die konkrete Umsetzung der strukturierten Logmeldungen in .Net hat sich Serilog als äusserst hilfreich erwiesen, während BugMagnet einem beim Exploratory Testing viel Arbeit abnimmt.

Die Visualisierung von Metriken ist ein Thema zu dem ich noch zahlreiche Abklärungen machen muss. Die Ideen dahinter sind sehr spannend, allerdings führen falsch verwendete Metriken zu grossen Problemen. Daher ist hier besondere Vorsicht geboten.

 

Infrastruktur, Plattformen & Services

Techradar_2015_Infrastructure
Beim letzten Radar zögerte ich noch mit der Empfehlung von RavenDB. Mit Version 3 sind diese Bedenken nun ausgeräumt. Fall ein Projekt eine NoSQL-Datenbank benötigt und darauf mittels C# oder einer REST-API zugreifen will, ist RavenDB meine favorisierte Lösung.

Docker ist ein spannender Ansatz um ganze Systemumgebungen auf Anwendungsebene zu virtualisieren. Diese unabhängigen Container vereinfachen nicht nur den Betrieb, sondern auch die Entwicklung. Mit den Ankündigungen von Microsoft für eine Implementierung auf Basis von Windows dürfte Docker auch bald in der .Net Welt eine grosse Rolle spielen. Somit ist es Zeit für einen genaueren Blick auf Docker.

Konkretes zu SharePoint 2016 wird Anfangs Mai zu erfahren sein. Je nach neuen Funktionen und Verbesserungen könnte SharePoint 2016 ein interessantes Thema werden. Mehr dazu wird man allerdings erst nach der Ignite-Konferenz wissen.

 

Sprachen und Frameworks

Techradar_2015_Languages
Eine sehr grosse Änderung kommt mittels ASP.Net 5 (ehemals ASP.Net vNext) auf die .Net Webentwickler zu. Grundlegende Änderungen in der Projektstruktur, eine komplett auf Mono lauffähige Umgebung und ein eine neue Verteilung der Aufgaben zwischen MVC und WebAPI führen zu einem grossen Lernbedarf. Ob sich dieser lohnt wird nicht zuletzt beim Migrationspfad entschieden. Je aufwändiger es ist eine Anwendung zu migrieren, desto länger werden die alten Versionen verwendet.

AngularJS ist ein Framework mit vielen offenen Fragen. Die inkompatible Version 2 setzt auf TypeScript, den JavaScript-Aufsatz den ich immer noch sehr skeptisch betrachte. Falls AngularJS so gut wird wie manche erhoffen, muss ich meine Position zu TypeScript überdenken. Allerdings könnte AngularJS genauso gut aus meinem Technologiestack fallen…

Bezüglich neuer Programmiersprachen sehen Swift und Go sehr interessant aus, allerdings hat auch C# 6 einige Neuerungen die man nicht verpassen sollte. Daher kann ich derzeit noch nicht abschätzen mit was ich mich am Ende mehr beschäftigen werde.

 

Tools

Techradar_2015_Tools
Balsamiq Mockups und Octopus Deploy sind 2 grandiose Werkzeuge, die einem viel Arbeit abseits der Entwicklung abnehmen. Mit den Mockups in Balsamiq lassen sich Anforderungen und Ideen einfach sammeln, während Octopus das Deployment auf wenige Klicks reduziert.

Entity Framework 7 wird Microsofts nächster Anlauf für einen OR-Mapper. Da erneut grundlegende Funktionen (wie Lazy-Loading) fehlen erinnert einem dies sehr stark an die Einführung von EF 4. Ob der Ansatz eines OR-Mapperers sowohl für relationale wie auch NoSQL-Datenbanken die fehlende Abwärtskompatibilität aufwiegt? Auch hier muss sich erst noch zeigen wie gut die veröffentlichte Version wirklich ist.

Microsoft hat in diesem Bereich in den letzten Jahren sehr viel begonnen und kaum etwas langfristig unterstützt. Durch diese fehlende Kontinuität sind Micro ORMs wie Dapper für mich sehr interessant. Diese kommen ohne grosses Framework aus und liefern einen einfachen Zugang zu relationalen Datenbanken.

 

Fazit

Mit all den Neuerungen in der .Net und Microsoft Welt (Angefangen bei Windows 10 über EF 7 bis hin zu ASP.Net vNext) ist ein eigener Technologieradar aus meiner Sicht unverzichtbar.
Trotz der vielen Unsicherheiten kann man sich so auf einige Neuigkeiten fokussieren und verliert sich nicht in zu vielen Details. Daher kann ich jedem empfehlen sich selber einen Technologieradar zu erstellen. Die dafür investierte Zeit lohnt sich.

Schlagwörter:, , , ,

.Net Framework übergreifend entwickeln mit Portable Class Libraries

16. April 2012 Kommentare aus

Mittlerweile gibt es neben dem .Net Framework 4 auch Silverlight, Windows Phone 7 und Xbox 360. Obwohl man überall in C# entwickeln kann stösst man doch schnell einmal an eine Grenze: Eine Klassenbibliothek vom vollen .Net Framework kann nicht in einem Silverlight-Projekt verwendet werden. Gleiches gilt für Windows Phone 7. Und um es noch ein wenig mühsamer zu machen sind Silverlight und Windows Phone 7 auch nicht kompatibel.

Dies zeigt sich mit dieser Fehlermeldung wenn man versucht eine *.dll einzubinden:

 

Portable Library Tools als Lösung

Eine Entdeckung der Tech Conference war für mich die Portable Class Libraries. Dieser Projekt-Typ ist vergleichbar mit einer gewöhnlichen Class Library. Allerdings kann man mehrere Framework-Plattformen als Ziel wählen.

Die einzelnen Frameworks haben eine grosse Menge an Funktionen die überall zur Verfügung stehen. So lange man in diesem Bereich bleibt ist dieser Projekttyp eine sehr gute Lösung um den Code nur einmal zu schreiben. Was genau geht und wo die Grenzen liegen ist in der MSDN gut beschrieben.

Benötigt man die Framework-Spezifischen Teile kann man immer noch mehrere Projekte machen und die *.cs Dateien verlinken.

 

Installation

Wie immer mehr Bibliotheken und Erweiterungen kann man die Erweiterung Portable Library Tools über NuGet installieren. Sobald dies gemacht ist gibt es eine neue Projektvorlage:

Über die Projekteigenschaften kann man die Zielframeworks sehr einfach auswählen:

Der wiederverwendbare Code kann nun in diesem Projekt entwickelt werden und steht Anwendungen der aktivierten Frameworks zur Verfügung.

 

Ausblick

Windows 8 wird mit Metro noch ein weiteres Framework in die .Net Welt bringen. Gemäss den Informationen aus der Tech Conference von Mitte März in Baden gibt es aber eine gute Nachricht: Visual Studio 11 (oder wie man die Version am Ende nennt) wird diesen Projekttyp bereits integriert haben. Eine Nachinstallation wird so nicht nötig sein und damit auch den Anwendern der Express-Edition zur Verfügung stehen.

 

Schlagwörter:, , ,

LINQ: eine Liste anhand einer anderen Liste sortieren

30. April 2011 Kommentare aus

Ich hatte vor kurzem eine „kleine“ Herausforderung zu lösen: Als Input hatte ich eine Liste A mit Primärschlüsseln und ich sollte eine Liste B mit den dazugehörigen Objekten zurückliefern – aber in der gleichen für mich nicht nachvollziehbaren Reihenfolge wie ihre Id in Liste A erscheinen.

Die Aufgabe wäre nicht der Rede wert wenn man nach einem bestimmten Feld sortieren könnte. In dem Fall gäbe es genügend Möglichkeiten um ein Order By in LINQ oder schon in SQL durchzuführen.

 
Ein JOIN als Lösung
Auf Stackoverflow fand ich eine Antwort von Simon D die mir den Weg zeigte. Ein einfacher JOIN in LINQ löst das Problem auf eine sehr elegante Weise:

var orderedByIDList = from i in ids 
                       join o in objectsWithIDs
                       on i equals o.ID
                       select o;

 
Ein Beispiel
Um die Lösung in Aktion zu sehen habe ich diesen kleinen Code-Schnipsel zusammengestellt. Eine Liste von Personen soll nach ihren Id’s sortiert werden, so wie sie in der Liste filter festgelegt wurden. Um Daten nicht aus einer DB holen zu müssen dient die Methode GetSampleData() als Datengenerator.

void Main()
{
        List<long> filter = new List<long>(){1,3,2};
        List<Person> result = Person.GetSampleData();
        result.Dump();
        
        var orderedResult = from f in filter join r in result on f equals r.Id select r;
        orderedResult.Dump();        
}

public class Person 
{
        public long Id;
        public string LastName;
        public string FirstName;
        
        public static List<Person> GetSampleData()
        {
                List<Person> data = new List<Person>(){
                        new Person(){Id = 1, LastName = "Vettel", FirstName = "Sebastian"},
                        new Person(){Id = 2, LastName = "Massa", FirstName = "Felipe"},
                        new Person(){Id = 3, LastName = "Hamilton", FirstName = "Lewis"},
                };
                
                return data;
        }
}

Gibt man dieses Beispiel in LINQPad als “C# Program” (bei Language) ein, wird die Liste bei der 2. Ausgabe entsprechend verändert:

 
Fazit
Man sollte auch kleine Probleme nutzen um sein Wissen auszubauen. LINQ bietet einem die Möglichkeit erstaunliche Ansätze zu einer Lösung zu kombinieren und Probleme aus einem ganz anderen Blickwinkel anzugehen. Und Stackoverflow ist ein idealer Anlaufort für solche Probleme.

Schlagwörter:,

Mengenoperationen mit LINQ

28. Dezember 2010 6 Kommentare

Wie weithin bekannt ist, kann man mit LINQ (Language Integrated Query) beliebige Datenquellen abfragen. Ich bin vor kurzem auf eine weitere interessante Anwendungsmöglichkeit gestossen, die wohl nicht allen bekannt ist: Mengenoperationen.

Ich fand diese Möglichkeit als ich nach einer optimierten Version für so ein Stück Code suchte:

private static List<int> ValuesNotInSecondList(List<int> first, List<int> second)
{
    List<int> result = new List<int>();

    foreach (var i in first)
    {
        if(!second.Contains(i))
        {
            result.Add(i);
        }
    }

    return result;
}

Aus einer Liste A sollen alle Werte zurückgeliefert werden, die nicht in Liste B vorhanden sind. Diese an sich einfache Aufgabe braucht nach meinem Geschmack zu viel Code.

ReSharper hat mir diese optimierte Version vorgeschlagen:

private static List<int> ValuesNotInSecondList(List<int> first, List<int> second)
{
    return first.Where(i => !second.Contains(i)).ToList();
}

Der Code wurde schon massiv reduziert, aber irgendwie genügte mir dies noch nicht. Da in meinem konkreten Anwendungsfall in meiner ersten Liste die Werte immer nur 1x vorkommen, suchte ich weiter.

 
Differenz zweier Mengen
In Wikipedia wird die (mathematische) Differenz zweier Mengen wie folgt beschrieben:

Die Differenzmenge (auch Restmenge) von A und B ist die Menge der Elemente, die in A, aber nicht in B enthalten sind.

Und das ist eigentlich genau das, was die Methode machen soll. LINQ erweitert IEnumerable um die Methode Except, die genau dieses Verhalten implementiert:

List<int> listOdd = new List<int> { 1, 3, 5, 7, 9 };
List<int> listFibonacci = new List<int> { 1, 2, 3, 5, 8 };

List<int> resultExcept = listOdd.Except(listFibonacci).ToList();
PrintList(resultExcept); // Resultat: 7,9

In diesem Beispiel werden die Zahlen zurückgegeben, die zwar ungerade aber nicht teil meiner reduzierten Fibonacci-Folge sind.

 
Schnittmenge und Vereinigung
LINQ bietet ebenfalls eine Methode für die Schnittmenge (Intersect) und die Vereinigung (Union) an:

List<int> resultIntersect = listOdd.Intersect(listFibonacci).ToList();
PrintList(resultIntersect); // Resultat: 1,3,5

List<int> resultUnion = listOdd.Union(listFibonacci).OrderBy(i => i).ToList();
PrintList(resultUnion); // Resultat: 1,2,3,5,7,8,9 (Reihenfolge durch die Sortierung)

 
Auch mit Strings möglich
Was so schön mit Integer funktionierte, geht übrigens genauso auch mit Strings (oder jedem anderen Typ der mit EqualityComparer.Default verglichen werden kann IEquatable implementiert):

List<string> listAD = new List<string> { "A", "B", "C", "D" };
List<string> listCF = new List<string> { "C", "D", "E", "F", };


List<string> resultADexceptCF = listAD.Except(listCF).ToList();
PrintList(resultADexceptCF); // Resultat: A,B

List<string> resultADintersectCF = listAD.Intersect(listCF).ToList();
PrintList(resultADintersectCF); // Resultat: C,D

List<string> resultADunionCF = listAD.Union(listCF).ToList();
PrintList(resultADunionCF); // Resultat: A,B,C,D,E,F

 
Fazit
Für Mengenoperationen bietet LINQ spezielle Operationen an, die einem viel eigenen Code ersparen. Wichtig ist dabei aber, dass die Listen nicht mehrmals den gleichen Wert enthalten. Sonst sind es keine Mengen mehr und LINQ filtert die doppelten Werte in der Resultatmenge selber heraus.

Schlagwörter:,

Leichter debuggen mit DebuggerDisplay

10. September 2009 Kommentare aus

Der Debugger von VisualStudio zeigt einem einen Tooltip an, sobald man mit der Maus über eine Variable oder eine Klasse fährt. Je nach dem ist dieser Text mehr oder weniger hilfreich. Man hat zwar immer die Möglichkeit, die einzelnen Felder und verschachtelten Werte durchzuklicken, bis man die gewünschten Werte angezeigt bekommt. Je grösser die Klasse und je mehr Felder diese beinhaltet, desto unübersichtlicher und mühsamer wird es.

Als kleines Beispiel dient mir eine Klasse Person. Dieses repräsentiert einen Menschen und der Vor- und Nachname sind die Informationen, über die ich das Objekt zuordnen kann. Beim debuggen wäre es für mich hilfreich, genau diese Informationen im Tooltip angezeigt zu bekommen (und eine Id, sollten mehrere Personen den gleichen Namen haben). Eine ganz einfache Personenklasse kann so aussehen:

using System;

namespace DebuggerInfo
{
    class PersonBasic
    {
        public String FirstName { get; set; }
        public String LastName { get; set; }
        public int Id { get; set; }

        public PersonBasic(String firstName, String lastName, int id)
        {
            FirstName = firstName;
            LastName = lastName;
            Id = id;
        }
    }
}

Als Tooltip wird nur der Namespace und Klassenname gezeigt:

Tooltip mit Klassennamen

Wie kann ich nun eine bessere Beschreibung bekommen?

 
Option 1: ToString() überschreiben

Die einfachste Möglichkeit um die gewünschte Anzeige zu erhalten ist das überschreiben der ToString-Methode. Dazu genügt dieses kleine zusätzliche Stück Code:

public override string ToString()
{
    return String.Format("{0} {1} {2}", FirstName, LastName, Id);
}

Der Debugger nutzt nun die ToString-Methode und liefert mir eine hilfreiche Anzeige zurück:
Tooltip mit ToString

 
Option 2: Attribut DebuggerDisplay

Ist die ToString-Methode schon überschrieben und liefert nicht die gewünschten Informationen, kann mit dem Attribut DebuggerDisplay auf Ebene der Klasse die Anzeige im Debugger geändert werden. Dies befindet sich im Namespace System.Diagnostics. Der dazugehörende Code sieht so aus:

namespace DebuggerInfo
{
    [DebuggerDisplay("Person: {LastName} {FirstName}")]
    class PersonDebug
    {
        // Klassendefinition
    }
}

Im Debugger gibt es das gewünschte Ergebnis:

Tooltip mit DebuggDisplay

 

Fazit:
DebuggerDisplay kann einem helfen, gewünschte Informationen nur für den Debugger aufzubereiten. Eine sinnvolle ToString-Methode sollte aber zu erst erstellt werden.

Schlagwörter:, ,
Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.

Schließe dich 329 Followern an