Skip to content

XAML Workshop in Wien

Kurzfristig noch an einem XAML Workshop mit WPF und Windows Store Apps Interesse? 1. bis 5. Dezember in Wien. Wir behandeln da das wichtigste sowohl zu WPF als auch zu Windows Store Apps – mit C# und XAML. Programmierkenntnisse mit C# und .NET sollten vorhanden sein. Themen werden wie bei meinen Workshops üblich noch im Kurs an die Teilnehmerwünsche angepasst.

Das sind die Inhalte:

  • Einführung in XAML
  • Unterschiede zwischen Desktop Apps und Windows Store Apps
  • Universal Apps
  • Design Guidelines
  • Controls
  • Layout Controls
  • Commands
  • Styles, Templates, Resources
  • Data Binding
  • Navigation
  • Printing
  • Documents
  • MVVM Pattern
  • Windows Runtime
  • Application LifeCycle mit Windows Store Apps
  • Contracts
  • Tiles und Toasts
  • Sharing Code zwischen WPF und Windows Store Apps

Bei Interesse und auch Fragen zu den Inhalten bitte ein Email: office@cninnovation.com.

Natürlich ist ein Firmenkurs auch zu anderen Terminen möglich.

Preis für den 1. Dezember Termin: € 2.125,- (zzgl. Mwst) , Anmeldung

Mit dem Winter-Special auch noch ein Surface Pro 3 zum Kurs.

Christian

http://www.cninnovation.com

C# vNext – Null Propagation

Im letzten Blog Post habe ich Primary Constructors und Property Initializers gezeigt. Primary Constructors werden jetzt doch nicht in C# 6 kommen – aber dafür ist es möglich Property Initializers vom Constructor Body zu initialisieren. Mehr dazu aber in einem späteren Blog Post wenn dieses Feature auch im Visual Studio zur Verfügung steht.

In diesem Blog Post möchte ich ein besonders cooles Feature von C# 6 zeigen: Null Propagation. Programmcode besteht aus vielen Zeilen null checks – genau dieser Code kann damit vereinfacht werden.

Sharp right

© Liquidphoto | Dreamstime.comSharp Right Turn Sign Photo

Falls bei einem Aufruf von obj.Foo() die Variable obj auf null zeigt, gibt es eine NullReferenceException. Deshalb sollte die Variable vorher auf null überprüft werden. Bestehender Code

if (obj != null)
{
  obj.Foo();
}

Kann einfach mit Hilfe des ?. Operators vereinfacht werden:

obj?.Foo();

Wenn obj null ist ist das Ergebnis der Expression null, ansonsten wird die Foo Methode aufgerufen. Eine simple Vereinfachung vom Code.

Doch wo und wie ist das wirklich im Einsatz? Anhand von Template-generierten C# Code in einer Windows Store App möchte ich hier ein paar Beispiele zeigen.

In der Methode GoBack der Klasse NavigationHelper findet sich dieser Syntax. Erst nach der Überprüfung von this.Frame kann auf die Property CanGoBack zugegriffen werden. Wenn diese Property true zurückliefert kann die GoBack Methode vom Frame aufgerufen werden.

    public virtual void GoBack()
    {
      if (this.Frame != null && this.Frame.CanGoBack) this.Frame.GoBack();
    }

Mit dem neuen Syntax sieht das wie folgend aus. Statt dem Extra Vergleich auf nicht null genügt ein ?. und dann ein Vergleich mit true. Das Ergebnis der Expression this.Frame?.CanGoBack kann natürlich auch null zurückliefern, deshalb ist der Vergleich mit true erforderlich.

   public virtual void GoBack()
    {
      if (this.Frame?.CanGoBack == true) this.Frame.GoBack();
    }

In der Klasse NavigationHelper findet sich auch dieser Code für die GoBackCommand Property:

public RelayCommand GoBackCommand
{
  get
  {
    if (_goBackCommand == null)
    {
      _goBackCommand = new RelayCommand(
        () => this.GoBack(),
        () => this.CanGoBack());
    }
    return _goBackCommand;
  }
  set
  {
    _goBackCommand = value;
  }
}

Auch das lässt sich vereinfachen – allerdings mit dem coalescing Operator, und das ist jetzt schon mit C# möglich. Wenn _goBackCommand nicht null ist, wird der Wert dieser Variable zurückgeliefert. Ansonsten wird ein neuer RelayCommand instanziert, und die neu gesetzte Variable _goBackCommand ist das Ergebnis des get Accessors.

public RelayCommand GoBackCommand
{
  get
  {
    return _goBackCommand ??
      (_goBackCommand = new RelayCommand(
        () => this.GoBack(),
        () => this.CanGoBack()));
  }
  set
  {
    _goBackCommand = value;
  }
}

Ganz ähnlich wie die GoBack Methode ist die CanGoBack Methode implementiert. Zuerst die Überprüfung ob Frame nicht null ist bevor das Ergebnis von CanGoBack zurückgeliefert wird.

    public virtual bool CanGoBack()
    {
      return this.Frame != null && this.Frame.CanGoBack;
    }

Der coalescing Operator ist auch im Zusammenspiel mit null propagation sehr praktisch. Wenn das Ergebnis der vorherigen Expression null ist, wird in diesem Fall false zurückgeliefert. True gibt es nur wenn Frame nicht null ist, und CanGoBack auch true zurück liefert. Mit Hilfe von Expression Bodied Members => kann diese Methode ohne geschwungene Klammern implementiert werden, mit Syntax wie wir ihn von Lambda Expressions kennen.

    public virtual bool CanGoBack() => 
      this.Frame?.CanGoBack ?? false;

Ein weiteres praktisches Beispiel findet sich in der RelayCommand Klasse. In einer thread-safe Variante zum Feuern eines Events kommt der Delegate in eine Zwischenvariable (handler), bevor der Event über den Delegate gefeuert werden kann.

public void RaiseCanExecuteChanged()
{
  var handler = CanExecuteChanged;
  if (handler != null)
  {
    handler(this, EventArgs.Empty);
  }
}

Mit null Propagation wird dieser Code sehr viel einfacher. Der direkte Aufruf der Methode nach einem ? mit ?() ist nicht möglich. Aber die Invoke Methode des Delegates bringt Abhilfe. Invoke wird nur aufgerufen wenn die linke Expression nicht null ist. Das ist auch gleich thread-safe und erspart doch einige Codezeilen.

public void RaiseCanExecuteChanged() =>
  CanExecuteChanged?.Invoke(this, EventArgs.Empty);

C# 6 hat keine so großen Features wie die async und await Keywords von C# 5 oder LINQ von C# 3. Aber es gibt viele kleine praktische Erweiterungen. Null Propagation gehört auf jeden Fall dazu.

Christian

CN innovation

C# vNext – Primary Constructors und Property Intializers

C# 6 bringt zahlreiche neue Features in der Sprache. Dieser Artikel beschreibt Primary Constructors und wie sie Code ändern können.

Update: Primary Constructors kommen jetzt definitiv nicht in C# 6. Vielleicht in C# 7. Info: https://roslyn.codeplex.com/discussions/568820

Sharp right
© Liquidphoto | Dreamstime.comSharp Right Turn Sign Photo

Neue Features in C#: mit C# 2 sind generics neu gekommen, C# 3 brachte zahlreiche Syntaxerweiterungen für Language Integrated Query (LINQ) und hat fast jede (oder jede) Applikation beeinflusst. Die Neuigkeiten bei C# 4 waren dann bei einigen Szenarien wie der Integration von Scripting oder auch COM praktisch. Mit Version 5 gab es dann zwar nur zwei neue Keywords, die waren aber so wichtig und haben die asynchrone Programmierung vereinfacht dass sie wieder praktisch jedes Programm beeinflussten.

Version 6 bringt jetzt keine so wichtige Features wie wir das bei den Neuerungen der Vorgängerversion erleben durften. Aber dafür gibt es viele praktische Dinge. Da legen wir gleich mit Primary Constructors los.

Ein praktischer Anwendungsfall für Primary Constructors sind immutable Typen. Readonly Properties waren in der letzten Version von C# nicht mit auto properties möglich. Da musste es der gesamte Syntax sein um die Properties zu definieren, wie in der Klasse Gadget gezeigt.

public class Gadget
{
  public Gadget(int id, string name)
  {
    this.id = id;
    this.name = name;
  }

  private readonly int id;
  public int Id
  {
    get { return id; }
  }

  private readonly string name;
  public string Name
  {
    get { return name; }
  }

  public override string ToString()
  {
    return Name;
  }
}

Oft hat man sich in solchen Szenarien mit private set accessors beholfen, das ist mit automatic properties möglich:


public string Name { get; private set; }

Mit dem private set accessor kann diese Property nur in der Klasse selbst geändert werden. Der State ist aber nicht immutable. Änderungen sind jederzeit möglich.

Property Initializers

C# 6 erlaubt jetzt Property Initializers um eine Property gleich mit dem Erzeugen des Objektes zu initialisieren:


public string Name { get; set; } = "Sample";

Das ist jetzt auch nur mit einem get Accessor möglich. Dabei wird vom Compiler ein readonly field erzeugt.


public string Name { get; } = "Sample";

Beim Initializer ist es nicht möglich auf “this” zuzugreifen. Damit sind die Anwendungsszenarien hier doch sehr eingeschränkt – wäre nicht der Primary Constructor.

Primary Constructors

Der Primary Constructor wird direkt bei der Klasse definiert. Die Constructor-Parameter können dann direkt beim Property Initializer angegeben werden. Der Code der Gadget Klasse von vorhin wird damit sehr reduziert:

public class Gadget(int id, string name)
{
  public int Id { get; } = id;
  public string Name { get; } = name;

  public override string ToString()
  {
    return Name;
  }
}

Im Vergleich zu vorher ist die Klasse Gadget viel kürzer geworden. Nur die ToString Methode hat nichts an der Länge eingebüßt. Das wird sich aber noch in einem folgenden Blogartikel ändern.

Wie sieht es mit Primary Constructors jetzt aus bei etwas spezielleren Anwendungsfällen? Aufruf von Basisklassen, mehreren Constructors, und Contructor Body Implementierungen?

Basisklassen

Natürlich ist es auch möglich vom Primary Constructor auf den Constructor der Basisklasse zu verweisen. Dazu erstelle ich zuerst eine Basisklasse Base die selbst einen Primary Constructor verwendet.

class Base(int i)
{
  public int I { get;  } = i;
}

Die Klasse Derived referenziert den Constructor der Basisklasse mit dem Integer Argument und setzt außerdem die S Property.

class Derived(string s, int i): Base(i)
{
  public string S { get; } = s;
}

Constructor Block

Sollte auch noch Code beim Aufruf des Primary Constructors aufgerufen werden ist das in einem Constructor Block möglich. Einfach geschwungene Klammern nach der Klassendeklaration schreiben:

class Derived(string s, int i): Base(i)
{
  {
    Console.WriteLine("Derived ctor called");
  }

  public string S { get; } = s;
}

Mehrere Constructors

Mehrere Constructors sind natürlich auch möglich. Ein weiterer Constructor kann über den Constructor Intiailizer den Primary Constructor aufrufen.

class Derived(string s, int i): Base(i)
{
  {
    Console.WriteLine("Derived ctor called");
  }

  public Derived(int i)
    : this(string.Empty, i)
  {
  }

  public string S { get; } = s;
}

Was hältst du von diesem neuen C# Feature? Wird es deinen Code vereinfachen? In meinen Projekten sehe ich auf jeden Fall viele Vereinfachungen. Vielleicht reduziert sich damit auch die Seitenanzahl von Professional C# ;-)

Christian

CN innovation

Sample Code zur BASTA! 2014 in Mainz

Links zu meinem Sample Code von der BASTA! 2014 in Mainz:

C# 6 – Neue Code Features – Achtung! Dafür wird Visual Studio “14” CTP 3 benötigt.

Die C# 6 Beispiele funktionieren auch mit Visual Studio “14” CTP 4. Fehler bei den Portable Libraries “File ‘UAP.props’ not found” gibt es diesen Fix: http://connect.microsoft.com/VisualStudio/feedback/details/1000796/file-uap-props-not-found-cant-build-a-portable-lib-on-vs14

Using LINQ in Real Life Scenarios (Visual Studio 2013)

XAML Templates (Visual Studio 2013)

Christian

CN innovation

BASTA! Herbst 2014 Speakerbutton 1

Highlights von der Build: .NET User Group Austria

Bei der diesjährigen Build Konferenz in San Francisco war .NET wieder ein großes Thema. Highlights davon und zum Windows 8.1 Update bei diesem Termin der User Group:

  •  .NET Compiler Platform
  • .NET Foundation
  • C# 6
  • RyuJIT, .NET Native
  • Windows 8 UI Updates
  • Universal Apps
  • Features für Business Apps


Treffpunkt: 17:30
Start des Vortrags: 18:00
Nach dem Vortrag: Diskussionsrunde mit Verpflegung

Location: Microsoft Österreich

Anmeldung: https://www.facebook.com/events/545311772248275 oder per Email ug@christiannagel.com

A Happy New Year 2014!

1987..2013..2014

Jahre mit 4 unterschiedlichen Ziffern :-)

Image

Im Jahr 2013 war mein erster Blog Artikel über

  • Viele neue Windows Store Apps
    • Ja , tatsächlich gibt es viele weitere Windows Store Apps. Genau diejenigen die du brauchst fehlen aber vielleicht noch. Und andere haben nicht die gleichen Funktionen wie auf anderen Plattformen. Aber auf jeden Fall gibt es gibt viele weitere Windows Store Apps!
  • Schnellere Updates für Windows, Windows Phone, Visual Studio
    • Ja, die Updates kommen wirklich  viel schneller. Wir haben Windows 8.1, Visual Studio 2013 (es gab auch schon 4 Updates für Visual Studio 2012) und weitere Updates sind auf dem Weg .
  • C++11 und TypeScript
    • Ja, C++ ist wieder aktiv. C++11 brachte große neue Features. Und C++14 ist bereits auf dem Weg für einige weitere Updates. TypeScript erreichte am 5. Dezember 2013 das Beta-Stadium (Version 0.9.5). 0.9.5 ist schon kurz vor dem ersten Release.

Was erwarte ich von 2014?

Natürlich steht ausser Diskussion, dass die Cloud-Nutzung zunehmen wird, und es wird die Norm werden, Anwendungen für mobile Geräte zuerst zu erstellen – Mobile First. Aber in diesem Blog Artikel möchte ich einen Blick auf einige spezielle Microsoft Technologien machen.

C# 6

Mads Toergesen sprach bereits über die Zukunft von C#. Auf der Londoner Konferenz NDC wurden neue Features von C# vorgestellt. Mit Roslyn in der Zielgeraden, sollte es einfacher sein neue Sprachkonstrukte hinzuzufügen. Bei C# 6 scheint es aber nicht so weltbewegende Features wie Generics, LINQ oder async zu geben, aber viele kleinere, die sehr nützlich sein , wie z. B.

  • Primary Constructors
  • Readonly Auto Properties
  • Exception Filters
  • Static Type using Statements
  • Property Expressions
  • Method Expressions
  • Params für Enumerables
  • Monadic null checking
  • Constructor type Parameter inference
  • Inline declaraations für out params

Wann und was dann wirklich kommt ist noch nicht gesichert. Sicher ist aber dass es eine coole Weiterentwicklung bei C# gibt. Eine Liste der Erweiterungen mit Vergleichen wie Code mit C# 5 geschrieben wird ist im Blog-Post von DaminG beschrieben. Von Mads Torgersen selbst gibt es Informationen zu C# und Roslyn bei .NET Rocks.

M# , zwischen C++ und C#

Machen wir mit C# weiter. Aktuell gibt es auch Diskussionen über eine neue Programmiersprache (Codename M#), die auf C# basiert. M# liegt in der Funktionalität zwischen C++ und C#Programmierung mit Sicherheit und Produktivität ähnlich wie C# und Performance wie C++ . Joe Duffy hat einen Blog-Beitrag zu dieser neuen Sprache und deren Ziele. Einige Highlights:

  • Aggresively stack allocate objects, deterministically destruct…
  • Elements of C++ const (with safety), immutability, isolation
  • Async programming at scale
  • Type-safe system programming, easily carve out sub-arrays and sub-strings without allocating
  • Modern error model with fail-fast as the default prolicy, exceptions for rare dynamic failure, typed exceptions only when rich exceptions are needed

Midori -Projekt

Die Sprache M# wurde zusammen mit dem Betriebssystem Midori entwickelt. Gestartet wurde das Projekt von Microsoft Research. Seit einigen Jahren war es aber ruhig. Mary Jo Foley hat jetzt neue Informationen über Midori . Egal ob Teile von Midori in der nächsten Windows-System gefunden werden, oder Midori eine völlig andere Roadmap nimmt, es ist in jedem Fall interessant.

Microsoft “Mod”

Mary Jo schreibt auch über Microsoft Mod – Microsoft schützt das als Marke. Ob der Name in allen Sprachen gut klingt, bin ich mir nicht sicher. Mary erwähnt aber auch, “Microsoft schützt viele Marken, die dann aber nie kommerziell oder öffentlich verwendet werden”. Allerdings ist es interessant, was sich dahinter verbirgt, und es gibt bereits eine laufende Diskussion über Microsoft Office als Windows Store Apps . Natürlich ist Microsoft Office auch auf Windows-RT als Desktop-Anwendung verfügbar. OneNote gibt es aber bereits als Windows Store App. OneNote ist eine coole Windows Store app, bei mir oft im Einsatz. Jetzt hoffe ich auch auf andere Office Apps als Windows Store Apps.

Microsoft Project Siena

Ein Microsoft Windows Store App, die schon im Store ist, ist Microsoft Project Siena. Diese App ermöglicht die einfache Erstellung Windows Store Apps. Ist das das neue Visual Basic? Diese App zeigt was mit Windows Store Apps möglich ist. Demnächst werde ich eine echte App unter Verwendung von Daten die von der Menu Card App angeboten werden zu schreiben.

Windows Azure

Die eben genannten Menu Card App nutzt verschiedene Windows Azure Services: Mobile Services, SQL Azure, Storage, und der Source Code wird mit Visual Studio Online verwaltet. Im letzten Jahr wurden  viele neue Funktionen zu Windows Azure hinzugefügt. Ich erwarte neue Features in einem ähnlichen Tempo im Jahr 2014. Da warte ich besonders auf coole neue Features mit Mobile Services :-)

Build Windows

Mal sehen, was wir alles bei der Build 2014 in San Francisco zu sehen bekommen, das Announcement von Steve Guggenheimer erwähnt Neuigkeiten zu Windows, Windows Phone , Windows Azure , Windows Server , Visual Studio und vieles mehr :-)

Mit diesem Start in 2014

wünsche ich allen

A Happy New Year 2014!

Live long and prosper!

Christian

Bye, bye 2013

Picture Search App
2013 war ein interessantes Jahr. Gerade bin ich bei den letzten Korrekturen für ein Buch-Update:  Professional C#-5 and .NET 4.5.1 (Wrox Press). Diese Ausgabe enthält Updates für die Windows Runtime 2 (Windows Store Apps mit Windows 8.1), Entity Framework 6, ASP.NET Web API 2 und mehr.
Was waren meine anderen wichtigen Aktivitäten im Jahr 2013? Dieser Blog Entry ist über Konferenzen, Workshops, Windows Store apps, und mehr :-)
Konferenzen: nach einigen Jahren hatte ich wieder einen Vortrag auf der TechEd – gleich in New Orleans und in Madrid – Tiles, Toasts and Notifications with Windows Store apps. Andere Konferenzen bei denen ich dabei war: Basta! in Darmstadt und Mainz, Microsoft Big Day und der Advanced Developers Conference in Wien, mit Talks über C# Async, Windows Store Apps, WPF 4.5, Entity Framework 6…
Workshops und Coaching gab es vor allem zu den Themen C#, WPF, ASP.NET MVC, Entity Framework, parallele Programmierung, HTML5, Web API, Windows Azure und Windows Store Apps.
Ich habe einige neue Apps im Windows Store. Meine erste Windows Store app gibt es seit dem Jahr 2012: Kantine. Diese App zeigt die Menüs und Informationen über das Restaurant www.kantine.at in Wien. Momentan ist diese App nur in Österreich erhältlich, aber im Jahr 2014 auch geplant für andere Märkte. Touristen können weitere Informationen über das Restaurant auch interessiert sein.
Eine komplette neue App ist die Menu Card App. Diese App – derzeit in Österreich, Deutschland und der Schweiz, hilft Restaurants ihre Menükarten erstellen. Die Daten können dann über ein JSON Service direkt mit einer Website integriert werden. Die Kantine App die momentan einen JSON Feed der eigenen Website http://www.kantine.at nutzt, wird in der nächsten Version direkt auf die JSON Daten der Menu Card App zugreifen.
Menu Card App

Menu Card App

Picture Search ist eine App mit der man nicht nur nach Bildern über Bing suchen kann, gefundene Bilder können auch im Full-Screen Mode endlos präsentiert werden (auch mit PlayTo auf die X-Box). Das geht jetzt mit einem Update der App für Windows 8.1. Diese App ist weltweit verfügbar. Da mehr und mehr User mit dieser App nach Bildern suchen hoffe ich die Kosten für die Bing-Suche durch Werbung abzudecken, bzw auch User auf die kostenpflichtige Version dieser APP umstellen. Mal sehen… Mit den Anzeige von Werbung habe ich auf jeden Fall mal festgestellt dass die meisten User die AppBar noch immer nicht finden. Diese Kenntnis hat den neuesten Update der Benutzeroberfläche beeinflusst, jetzt sollte auch die Slide Show für alle zu finden sein.
Picture Search App

Picture Search App

Hardware: Momentan habe ich ein Surface 2 und Surface Pro im Einsatz. Surface 2 hat mein Surface RT ersetzt. Dieses Device verwende ich in der Regel ohne Keyboard, nur mit dem Touch Screen (obwohl ein Touch-Cover dabei ist, das verwende ich aber hauptsächlich statt einer Hülle). Mein Surface Pro ist in der Regel an mehrere Monitore, externe Tastatur und Maus angeschlossen. Mehrere Bildschirme verwende ich auch im Hotel. Im Hotel ist nur die Größe des externen Monitors kleiner. Auf dem Surface Pro läuft Visual Studio 2013, da entwickle ich alle möglichen Apps. 2014 steht aber ein Surface Pro 2 an. Da muss ich noch auf die 8 GB Edition warten, die ist in Österreich noch nicht verfügbar.
Der nächste Blog Artikel ist dann mein Preview für 2014 – wir sehen uns da :-)
Christian
Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.