Mathematische Operationen mit Nullable-Types 27.11.2014

Max Jäger
Max Jäger, Senior eXpert
Value-Types können per Definition nicht null sein. Sie können jedoch durch die Klasse System.Nullable gewrappt werden – C# erlaubt eine verkürzte Darstellung mit Fragezeichen nach dem Typ –, sodass einer Variablen nun auch der Wert null zugewiesen werden kann. Doch wie verhält sich eine solche Variable bei mathematischen Operationen, wie z. B. einer Multiplikation?

Wir haben beispielsweise drei Variablen des gleichen Typs, die wir miteinander multiplizieren möchten, von der jedoch eine nullable ist.

   1: int a = 20;
   2: int b = 30;
   3: int? c = null;
   4:  
   5: int? result = a * b * c;

Nun stellt sich die Frage, was bei der Berechnung als Ergebnis herauskommt.

Eine erste Annahme könnte sein, dass eine Exception geworfen wird. Das passiert jedoch nicht. Eine zweite Annahme könnte sein, dass anstatt null der Wert 0 angenommen wird. Auch das passiert nicht. Null ist nicht definiert, und somit kann kein bestimmter Wert angenommen werden - auch nicht 0.

Führen wir generell mathematische Operationen mit Variablen unterschiedlicher Typen durch, so ist das Ergebnis immer vom Typ des "größeren" Typs (int + long = long, etc.). Ist ein Typ davon jedoch Nullable, so wird das Ergebnis immer vom Type Nullable des "größeren" Typs sein (int? + long = long?, etc.).

Dies gibt auch schon einen Hinweis auf das Ergebnis unserer Multiplikation: das Ergebnis ist null, sobald auch nur eine Variable null ist.

Eine funktionierende Variante des oben angegebenen Codes könnte folgendermaßen aussehen, sofern die Variable c nicht in die Berechnung mit eingehen soll, wenn sie null ist:

   1: int? result = c.HasValue
   2:  ? (a * b * c.Value)
   3:  : (int?)(a * b);

Soll ein bestimmter Default-Wert verwendet werden, lässt sich dies folgendermaßen durchführen:

   1: int result = a * b * c.GetValueOrDefault(1);

Bei mathematischen Berechnung mit über Nullable gewrappten Datentypen ist somit Vorsicht geboten, um keine unerwarteten Werte zu erhalten.

Eine detaillierte Darstellung der Verarbeitung von Nullable-Typen findet sich hier.

Share |

Eigene Regeln definieren – eXpert Artikel in der dotnetpro 24.11.2014

Svenja Henß
Svenja Henß, Senior Assistant

Seit letztem Donnerstag druckfrisch am Kiosk. Teil 1 des Artikel unseres eXperts Alexander Jung zum Thema “Eigene Regeln definieren”:

Ein Webservice dokumentiert in der WSDL, welche Standards er nutzt, sodass sich ein Client darauf einstellen kann. Die dafür von der WCF eingesetzten Mechanismen lassen sich auch für eigene Funktionalitäten verwenden.

Eigene Regeln definieren

Wir wünschen viel Spaß beim Lesen und freuen uns auf euer Feedback!

Der zweite Teil des Artikels erscheint in der dotnetpro 2015/01.

Share |

Lufthansa stattet Piloten mit Surface Pro 3 aus 21.11.2014

Werner Franz
Werner Franz, Vorstand

Nun ist es offiziell:

Die Lufthansa Piloten werden das neue Electronic Flight Bag EFB auf Surface Pro 3 nutzen.

Ein toller Erfolg für Microsoft – und für SDX: Unsere eXperts haben als .NET Spezialisten an der Entwicklung des EFB mitgewirkt.

Weitere Informationen finden Sie in der Microsoft Presseerklärung und im Microsoft Surface Blog.

Lufthansa-Cockpit

Share |

Top 10 Fehler: Wrap-Up–Jetzt aber!

Alexander Jung
Alexander Jung, Chief eXpert

Dies ist Teil 15 der letzte Teil der kleinen Serie, die ich als Kommentar zum Blog-Beitrag Top 10 Mistakes that C# Programmers Make begonnen habe.

Und jetzt reicht’s dann auch Zwinkerndes Smiley.

 

Die ursprünglichen Common Mistakes von Patrick will ich hier nicht wiederholen, hier sind meine Ergänzungen:

  1. Neglecting FxCop/Static Code Analysis
  2. Naiver Einsatz von Reflection
  3. Missbrauch von String-Operationen

Es ist nicht so, dass man die Liste nicht fortsetzen könnte, im Gegenteil. Aber an irgendeiner Stelle muss man schließlich aufhören, und hier hat es sich angeboten.

Dinge die ansonsten bei meinen Reviews immer wieder hochkommen drehen sich dann aber auch immer weniger um die Sprache und Nutzung der BCL. Vielmehr geht es dann zunehmend um Codequalität, Wartbarkeit und Robustheit, um Einsatz von Patterns, konzeptionelle Dinge wie Fehlerhandling und Testbarkeit, Grundlagen wie Objektorientierung und Abstraktion, Architekturfragen, und so weiter.

Das würde den Rahmen hier etwas sprengen Zwinkerndes Smiley. Daher…

[ENDE!]

Share |

FAZ Spezial: Die beliebtesten Arbeitgeber im Rhein-Main Gebiet 18.11.2014

Svenja Henß
Svenja Henß, Senior Assistant

Endlich draußen:

Die aktuelle Spezialausgabe der FAZ, der Frankfurter Neuen Presse, der Frankfurter Rundschau sowie den jeweiligen lokalen Zeitungen zum Thema “Beliebteste Arbeitgeber im Rhein Main Gebiet” ist am 12. November 2014 erschienen.

Wir freuen uns mit dabei zu sein und hoffen, den ein oder anderen neuen Flurfunk Leser oder sogar neuen Mitarbeiter begrüßen zu können.

sdx_FAZ-Beilage

Share |

LINQ Coding Guidelines #2–Kein Mischen der Syntax 14.11.2014

Alexander Jung
Alexander Jung, Chief eXpert

Nach der Strafandrohung vom letzten Mal haben die folgenden Guidelines eher den Charakter von – mehr oder weniger strengen – Empfehlungen.

Empfehlung:
Das Mischen von Query-Syntax und Method-Syntax sollte vermieden werden.

 

Um’s nochmal deutlich zu machen: Wir reden von Query-Syntax…

   1: int[] numbers = { 5, 10, 8, 3, 6, 12};
   2: var numQuery1 = from num in numbers
   3:     where num % 2 == 0
   4:     orderby num
   5:     select num;

versus Method-Syntax…

   1: int[] numbers = { 5, 10, 8, 3, 6, 12};
   2: var numQuery2 = numbers
   3:     .Where(num => num % 2 == 0)
   4:     .OrderBy(n => n);

In diesem einfachen Beispiel macht das keinen großen Unterschied. Tatsächlich neigen viele Entwickler zur Query-Syntax, weil sie näher an SQL liegt und nicht zuletzt, weil Microsoft sie in seinen Beispielen bevorzugt.

Dummerweise ist die Query-Syntax aber auf einen festen Satz an Schlüsselwörtern beschränkt; selbst Aggregatfunktionen – obwohl Teil von SQL – sind darin schon nicht mehr enthalten. Und auch bei vorhandenen Schlüsselwörtern erlauben diese nicht alle Optionen, die mit der Method-Syntax möglich sind, etwa ein OrderBy mit Comparer. Von zusätzliche Funktionalitäten aus eigenem Code oder Bibliotheken ganz zu schweigen.

In diesen Fällen muss man auf die Method-Syntax ausweichen. Leider legt Microsoft hier mit Vermischung der beiden Varianten vor (1, 2):

   1: string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; 
   2: var reversedIDigits = ( 
   3:     from d in digits 
   4:     where d[1] == 'i' 
   5:     select d) 
   6:     .Reverse(); 
   1: List<Customer> customers = GetCustomerList(); 
   2: var first3WAOrders = ( 
   3:     from c in customers 
   4:     from o in c.Orders 
   5:     where c.Region == "WA" 
   6:     select new { c.CustomerID, o.OrderID, o.OrderDate }) 
   7:     .Take(3); 

Und so weiter.

Der Raytracer als pathologisches Beispiel mischt das ebenfalls, was nur bei genauem Hinsehen erkennbar ist.

Hier ist ein Beispiel aus produktivem Code:

   1: static string GetOSVersion()
   2: {
   3:     var name = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>() select x.GetPropertyValue("Caption")).First();
   4:     return name != null ? name.ToString() : "Unknown";
   5: }

Den LINQ-Ausdruck in einer Zeile zu packen macht’s nicht eben besser lesbar, aber Umbrüche helfen auch nicht wirklich:

   1: static string GetOSVersion()
   2: {
   3:     var name = (from x
   4:                     in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
   5:                     .Get()
   6:                     .OfType<ManagementObject>()
   7:                 select x.GetPropertyValue("Caption"))
   8:                     .First();
   9:     return name != null ? name.ToString() : "Unknown";
  10: }

 

Problem dabei: Durch die Mischung fällt es beim Lesen schwerer, die Logik zu erfassen. Gleiche Dinge werden unterschiedlich dargestellt, konzeptionelle Unterschiede und Gemeinsamkeiten werden verwischt.

Wenn man den ganzen Ausdruck hingegen konsequent in Method-Syntax hinschreibt, wird die Logik auf einmal sehr offensichtlich und einfach nachvollziehbar. Das letzte Beispiel in Method-Syntax:

   1: static string GetOSVersion2()
   2: {
   3:     var name = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
   4:         .Get()
   5:         .OfType<ManagementObject>()
   6:         .Select(x => x.GetPropertyValue("Caption"))
   7:         .First();
   8:     return name != null ? name.ToString() : "Unknown";
   9: }

Wie ich finde ein ausreichender Grund, um – zumindest in den beschriebenen Fällen – auf eine Mischung – und damit letztlich auf die Query-Syntax – zu verzichten. Womit die Empfehlung begründet ist.

 

Um aber einen Schritt weiter zu gehen…

Einfache Ausdrücke kann man nach wie vor mit der Query-Syntax schreiben – ohne die Empfehlung zu verletzen. Allerdings habe ich die Erfahrung gemacht, dass einfache Ausdrücke nicht immer so einfach bleiben. Sie später umzuschreiben ist mindestens nervig.

Ich persönlich – und ich bin da nicht der Einzige – habe mir daher die Query-Syntax mittlerweile völlig abgewöhnt und nutze grundsätzlich die Method-Syntax.

Das mag Geschmackssache sein; wer das in seine Coding Guidelines aufnehmen will, kann zumindest Konsistenz über verschiedene Ausdrücke hinweg als Argument anführen.

Share |

Frankfurter SDX TC: SQL Server 2012/2014 – Mehr als nur Migration 11.11.2014

Simone Franz
Simone Franz, Marketing Manager

Herzlich lade ich Sie zum SDX Technical Council “SQL Server 2012/2014 – Mehr als nur Migration” im Frankfurter Westhafen ein:

Termin: Donnerstag, der 20. November 2014 ab 17:00 Uhr in Frankfurt Zielgruppe: BI/SQL-Entwickler, Architekten, Projektleiter
Dresscode: Business Casual

Agenda:

17:00 Uhr: Begrüßungskaffee
17:30-19:30 Uhr:

Daten schneller, besser, flexibler mit SQL Server 2012/2014
- Hochverfügbare, performante und sichere Datenbanken
- Columnstore Index
- SQL Server InMemory
- Resource Governor
- Buffer Pool Extensions
- SQL Erweiterungen
- SQL Server Migration

19:30 Uhr: Fingerfood

clip_image002_thumb1

Das Ende des (extended) Supports des SQL Servers 2005, neue/konsolidierte Hardware oder Innovation – das sind potentielle Treiber für eine Migration der SQL Server Infrastruktur.Dabei entstehen nicht nur Kosten und Risiken, sondern eine Migration liefert ebenfalls Mehrwert, z.B. die Konsolidierung von Umgebungen, weniger Hardware- und Supportaufwand, performantere Umgebung sowie die Nutzung neuer Features.

In unserem Technical Council – mit Fokus auf Datenbank-Infrastruktur und
-Entwicklung – zeigen wir Ihnen die Vorteile auf, die eine nicht nur technische Migration von SQL Server 2005/2008 auf 2012/2014 mit sich bringt. In mehreren Live-Demos gehen wir dabei auf typische Anwendungsszenarien ein.

Zum Abschluss geben wir Ihnen eine kurze Empfehlung bzgl. eines Vorgehens bei einer anstehenden Migration und informieren Sie, mit welchen Quick Wins Sie am schnellsten innerhalb Ihres Unternehmens und gegen­über dem Management punkten können.

Beim abschließenden Abendessen können Sie sich dann in lockerer Atmosphäre mit den Teilnehmern und den SDX eXperts zu Features und Einsatzszenarien austauschen.

Das SDX-Team freut sich auf Ihren Besuch.

Auf Wiedersehen im SDX Büro am 20. November 2014 im Westhafenhaus, Speicherstraße 1 in Frankfurt.

Die komplette Einladung bzw. die Teilnahmebedingungen für Frankfurt erhalten Sie hier.

Share |

Codehunt – Stellt eure Coding Skills auf die Probe 03.11.2014

Max Jäger
Max Jäger, Senior eXpert
Neulich ist mir eine nette Seite im Rahmen des Imagine Cups über den Weg gelaufen: Codehunt
Es geht darum, einen vorgegebenen Codeabschnitt zu vervollständigen, um einen bestimmten Output zu erzeugen. Wer schafft das am schnellsten und mit dem kürzesten Code?

Der Output wird als Tabelle mit Ein- und Ausgabedaten angegeben. Was einfach klingt, kann auch ganz schön kompliziert werden.

Auf der Seite können Übungsaufgaben gelöst werden. Hier ein Beispiel, wie solch eine Aufgabe aussehen kann. Auf der linken Seite ist der anzupassende Code, auf der rechte die Tabelle mit den Ein- und Ausgangsdaten.

Codehunt

Im Rahmen des Imagine Cups gibt es immer wieder Wettbewerbe für einen begrenzten Zeitraum, bei denen man sich mit anderen messen und Preise gewinnen kann.

Viel Spass beim coden :-)

Share |

Office Day Oktober 27.10.2014

Svenja Henß
Svenja Henß, Senior Assistant

Wie immer startete letzte Woche Freitag der monatliche Office Day mit Werners Business Update.

Danach ging es mit folgenden Break-Out Sessions weiter:

- Angular JS
- Schlanke Softwarearchitekturen mit Web API
- SSIS Unittesting
- Testing mit CodesUI

IMG_7809IMG_7813IMG_7814IMG_7816IMG_7817IMG_7819IMG_7825IMG_7823

Share |

SDX TC: SQL Server 2012/2014 – Mehr als nur Migration 23.10.2014

Simone Franz
Simone Franz, Marketing Manager

Herzlich lade ich Sie zum SDX Technical Council “SQL Server 2012/2014 – Mehr als nur Migration” ein:

Termin: Donnerstag, der 13. November 2014 ab 17:00 Uhr in München
Zielgruppe: BI/SQL-Entwickler, Architekten, Projektleiter
Dresscode: Business Casual

Agenda:

17:00 Uhr: Begrüßungskaffee
17:30-19:30 Uhr:

Daten schneller, besser, flexibler mit SQL Server 2012/2014
- Hochverfügbare, performante und sichere Datenbanken
- Columnstore Index
- SQL Server InMemory
- Resource Governor
- Buffer Pool Extensions
- SQL Erweiterungen
- SQL Server Migration

19:30 Uhr: Fingerfood

clip_image002

Das Ende des (extended) Supports des SQL Servers 2005, neue/konsolidierte Hardware oder Innovation – das sind potentielle Treiber für eine Migration der SQL Server Infrastruktur.Dabei entstehen nicht nur Kosten und Risiken, sondern eine Migration liefert ebenfalls Mehrwert, z.B. die Konsolidierung von Umgebungen, weniger Hardware- und Supportaufwand, performantere Umgebung sowie die Nutzung neuer Features.

In unserem Technical Council – mit Fokus auf Datenbank-Infrastruktur und
-Entwicklung – zeigen wir Ihnen die Vorteile auf, die eine nicht nur technische Migration von SQL Server 2005/2008 auf 2012/2014 mit sich bringt. In mehreren Live-Demos gehen wir dabei auf typische Anwendungsszenarien ein.

Zum Abschluss geben wir Ihnen eine kurze Empfehlung bzgl. eines Vorgehens bei einer anstehenden Migration und informieren Sie, mit welchen Quick Wins Sie am schnellsten innerhalb Ihres Unternehmens und gegen­über dem Management punkten können.

Beim abschließenden Abendessen können Sie sich dann in lockerer Atmosphäre mit den Teilnehmern und den SDX eXperts zu Features und Einsatzszenarien austauschen.

Das SDX-Team freut sich auf Ihren Besuch.
Auf Wiedersehen im SDX Büro am 13. November 2014 in der Landwehrstraße 61 in München.

Die komplette Einladung bzw. die Teilnahmebedingungen für München erhalten Sie hier.

Share |