Navigation und Qualitätssicherung

Hintergrund von .NET MAUI

Vorgänger Xamarin / Xamarin Forms

  • Ursprünglich Nachimplementierung von .NET für andere Plattformen als Windows
  • Mono 1.0 wurde 2004 veröffentlicht
  • 2011: Gründung der Firma Xamarin
  • 2014: Xamarin Forms für UI / Angelehnt an WPF
  • 2016: Kauf von Xamarin durch Microsoft

Roadmap Microsoft

  • Parallel erfolgt 2016 ein Strategiewechsel bei Microsoft
  • Mit dem Projekt .NET Core wird ein einheitliches .NET für alle Plattformen vorbereitet
  • Mit dem Projekt .NET MAUI wird ab 2020 ein Nachfolger für Xamarin Forms entwickelt



Überblick

  • Entwicklung in C#
  • Bereitstellung der nativen APIs und UI- Elemente
    • Getrennte und gemeinsame UI-Entwicklung möglich
  • Binden an nativen Code möglich
  • Etablierte Laufzeitumgebung
  • Module für Applikationsintegration

Zielplattformen

  • iOS
  • Android
  • Windows
  • macOS

Vor- und Nachteile

  • Ansatz ermöglicht volle Flexibilität
  • Mindestens die Geschäftslogik kann plattformübergreifend geschrieben werden
  • Saubere Trennung der Entwicklung von UI und Geschäftslogik unterstützt/erzwungen

Grundlagen von C#

Hintergrund

  • 2001 von Andres Hejlsberg im Auftrag von Microsoft entwickelt
  • Typsichere, objektorientierte Allzweck-Programmiersprache

Programmierparadigmen

Programmers who program “in” a language limit their thoughts to constructs that the language directly supports. If the language tools are primitive, the programmer’s thoughts will also be primitive.  Programmers who program “into” a language first decide what thoughts they want to express, and then they determine how to express those thoughts using the tools provided by their specific language.

Quelle: @McConnell2004

Objektorientierung

  • Abstraktion von Daten und darauf arbeitenden Funktionen und Methoden in einer Struktur (Klassen und Objekte)
  • Modellierung von Spezialisierungshierarchien (Vererbung)

Funktionale Programmierung

  • Im Zentrum stehen Funktionen, die Eingaben in Ausgaben transformieren
  • Funktionen können Eingabeparameter und Rückgabewerte sein (Funktionen höherer Ordnung)

Managed Language

  • .NET bietet eine Laufzeitumgebung für C#
  • Assemblies erhalten Code in plattformunabhängiger Intermediate Language (IL) und Metadaten
  • Plattformspezifische Ausführung übernimmt der Just-In-Time (JIT) von .NET
  • Ausführung in einer Laufzeitumgebung vereinfacht
    • Speicherverwaltung
    • Ausnahmebehandlung
    • Standardtypen
    • Sicherheit

Programmorganisation

using System;
namespace Acme.Collections
{
    public class Stack
    {
        Entry top;
        public void Push(object data) 
        {
            top = new Entry(top, data);
        }

        public object Pop() 
        {
            if (top == null)
            {
                throw new InvalidOperationException();
            }
            object result = top.data;
            top = top.next;
            return result;
        }
        
        class Entry
        {
            public Entry next;
            public object data;
            public Entry(Entry next, object data)
            {
                this.next = next;
                this.data = data;
            }
        }
    }
}

Typen und Variablen

  • Zwei verschiedene Typen in C#: Value Types und Reference Types
  • Variablen des Value Types beinhalten ihre Daten direkt
  • Variablen des Reference Types speichern Referenzen auf ihre Daten (Objekte)

Value Types - Simple Types

  • Signed integral: sbyte, short, int, long
  • Unsigned integral: byte, ushort, uint, ulong
  • Unicode characters: char
  • IEEE floating point: float, double
  • High-precision decimal: decimal
  • Boolean: bool

Weitere Value Types

  • Enum types: Nutzerdefinierte Typen der Form enum E {...}
  • Struct types: Nutzerdefinierte Typen der Form struct S {...}
  • Nullable value types: Erweiterungen der anderen Value Types um null: beispielsweise int?

Reference Types

  • Class Types
    • Basisklasse aller anderen Typen: object
    • Unicode strings: string
    • Nutzerdefinierte Typen der Form class C {...}
  • Interface Types: Nutzerdefinierte Typen der Form interface I {...}
  • Array Types: Ein- und mehrdimensional: beispielsweise int[] oder int[,]
  • Delegate Types: Nutzerdefinierte Typen der Form delegate int D(...)

Besonderheiten

  • Alle Reference Types unterstützen Generics
  • Structs können auch Methoden, Properties etc. besitzen, Vererbung ist jedoch ausgeschlossen
  • Der Delegate Type ist eine Referenz auf Methoden mit festgelegter Methodensignatur

Zugriffsrechte

  • public: Keine Einschränkung
  • protected: Zugriff aus dieser oder abgeleiteten Klassen
  • internal: Zugriff aus dem Assembly
  • protected internal: Zugriff beschränkt auf umgebende Klasse oder daraus abgeleiteten Klassen
  • private: Zugriff nur aus dieser Klasse
  • private protected: Zugriff beschränkt auf umgebende Klasse oder daraus abgeleiteten Klassen im gleichen Assembly

Eigenschaftsmethoden

  • Kapselungsprinzip: Kein direkter öffentlicher Zugriff auf innere Daten von Objekten erwünscht
  • Elegante Lösung in C#: Eigenschaftsmethoden
  • Beispiel: public int Length { get; set; }
using System;
namespace CSharpTests
{
    public class Animal
    {
        public string Name { get; set; }
        public double Weight { get; private set; }

        private string _color;
        public string Color
        {
            get { return _color; }
            set { _color = value; }
        }

        public Animal()
        {
        }
    }
}

Wichtige System-Pakete

Zum Paketmanagement wird NuGet (https://www.nuget.org) genutzt

  • System.Runtime: Essentielles Paket u.a. mit Object, String, Array, Action und IList<T>
  • System.Collections: Größtenteils generische Datenstrukturen u.a. mit List<T> und Dictionary<TKey,TValue>
  • System.Net.Http: Typen für HTTP Netzwerkkommunikation, u.a. mit HttpClient und HttpResponseMessage
  • System.IO.FileSystem: Typen zum Lesen und Schreiben von lokalen oder Netzspeichern u.a. mit File und Directory
  • System.Linq: Typen um Objekte abzufragen, u.a. mit Enumerable und ILookup<TKey,TElement>
  • System.Reflection: Typen zum Laden, Inspizieren und Aktivieren von Typen, u.a. mit Assembly, TypeInfo und MethodInfo

Namenskonventionen

Meist PascalCase und camelCase:

  • PascalCase für alle public Members, Typen und Namespaces
  • camelCasefür Parameternamen
Element Regel Beispiel
Namespace Pascal namespace System.Security { ... }
Type Pascal public class StreamReader { ... }
Interface Pascal public interface IEnumerable { ... }
Method Pascal public virtual string ToString();
Property Pascal public int Length { get; }
Event Pascal public event EventHandler Exited;
Field Pascal public static readonly TimeSpan InfiniteTimeout;
Enum value Pascal public enum FileMode { Append,... }
Element Regel Beispiel
Parameter Camel public static int ToInt32(string value);

Live-Demo

Link

Grundlagen von Visual Studio

Einführung

Unter dem Menüpunkt Hilfe finden Sie Visual Studio Documentation

Funktionsweise von .NET MAUI

Überblick

  • Geteilter Code (PCL) und geteilte Assets (SAP)
  • Plattformspezifischer Code in C#
  • Plattformspezifische UI
  • Zugriff auf plattformeigene Bibliotheken
  • Für iOS wird letztlich nativ kompiliert
  • Bei Android Mono

Geteilte UI

  • Gemeinsame UI-Programmierung ist ebenfalls möglich
  • Basiert auf XAML

Quelle: @Petzold2016

Live-Coding

Repositories