Skip to content

CSharp Intro

Einführung in die Entwicklung mit C#


Basics

Wir verwenden in der Schule die Entwicklungsumgebung Jetbrains Rider um Programme mit der Programmiersprache C# zu entwickeln.

Voraussetzungen:

  • Dotnet SDK muss installiert sein
  • Jetbrains Rider muss installiert sein

Wir programmieren in C#

CSharpNote.png


Popularität

C# ist eine der 10 populärsten Programmiersprachen. Quelle


Unsere Plattform ist .NET

Eine Plattform bietet alle Werkzeuge (Tools), die man benötigt um Software zu erstellen (build) und zu betreiben (run).

  • .NET Plattform
    • Kostenlos, Open Source Software
    • Läuft auf unterschiedlichsten Typen von Computern
      • Windows
      • Linux
      • Mac
      • Android
      • iOS
    • Funktioniert mit unterschiedlichen Programmiersprachen
      • Wir verwenden C#
      • Andere: F#, Visual Basic

Übungsumgebung

  • Manchmal möchte man gerne etwas auf einem Computer ausprobieren, auf dem kein .NET installiert ist
    • zB Computer der Eltern
    • Computer in einer öffentlichen Bibliothek
  • Es gibt Online Entwicklungsumgebungen
  • Achtung
    • Manche dieser Umgebungen sind nicht aktuell
    • Manche sind speziell dafür gemacht um Vorab-Versionen (Previews) auszuprobieren
    • Online Entwicklungsumgebungen sollten nicht euer primäres Entwicklungstool sein, nutzt Rider!

Ordner Management

  • Überlegt euch zu Beginn des Schuljahres eine Ordnerstruktur, damit ihr eure Projekte und unterlagen jederzeit wiederfindet.
  • Tipp:
    • Einen Ordner für jedes Schuljahr
      • C:\HTL\2023_24
      • C:\HTL\2024_25
    • Einen Unterordner für jedes Fach
      • C:\HTL\2024_25\SEW
      • C:\HTL\2024_25\MEDT
    • Einen Unterordner für jede Übung/Unterrichtseinheit
      • C:\HTL\2024_25\SEW\001-Intro
      • C:\HTL\2024_25\SEW\002-Calculator
  • Überlegt euch ein für euch sinnvolles Nummerierungsschema. Vermeidet Leer-, Sonderzeichen und Umlaute in Ordner- und Dateinamen

Praxis

  • Erstellt ein neues Projekt mit Rider
    • Wählt als Projekttyp eine Konsolenanwendung
    • Nennt die Solution HelloWorld
    • Nennt das Projekt ebenfalls HelloWorld
  • Macht euch mit der Oberfläche in Rider vertraut
  • Versucht das Programm auszuführen, und eine Konsolenausgabe zu erzeugen.
  • Versucht das Programm zu debuggen und einen Breakpoint zu setzen, bei dem das Programm anhält.

Statements

Unser erstes Programm besteht aus 2 Zeilen. Die erste Zeile ist ein Kommentar, die zweite ein Statement.

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

Statements und Kommentare

  • Wir verwenden Kommentare, damit andere Personen unser Programm besser verstehen.
    • Kommentare starten mit zwei Schrägstrichen
    • Sind für den Programmierer, nicht für den Computer
    • Werden vom Compiler ignoriert
  • Ein Statement ist eine Aktion, die das Programm durchführen soll
    • Muss mit einem Strichpunkt enden
    • Kann in einer oder mehreren Zeilen stehen (für komplexere Szenarien)
    • Werden von oben nach unten der Reihe nach ausgeführt.

Übung: mehrere Statements

// Print welcome message
Console.WriteLine("Hello, my name is Norbert");
Console.WriteLine("and I teach in Krems and Zwettl.");
Console.WriteLine(); // Print an empty line
// Print goodbye message
Console.WriteLine("Thank you for using my program!");
  • Fragen:
    • wie viele Kommentare sind in diesem Programm?
    • wie viele Statements?

Was ist Console.WriteLine?

  • Eine Funktion die von .NET zur Verfügung gestellt wird
  • Der volle Name heißt System.Console.WriteLine
    • In modernen Versionen von C# kann man das System. weglassen.
  • Gibt den Text in der Konsole aus und geht zur nächsten Zeile (Zeilenumbruch)
  • Es gibt auch Console.Write (ohne Line)
    • geht nicht zur nächsten Zeile (kein Zeilenunmbruch)

// The following three lines print three stars,
// each in a SEPARATE line.
Console.WriteLine("*");
Console.WriteLine("*");
Console.WriteLine("*");
// The following three lines print three stars
// in a SINGLE line (i.e. "***")
// because Write is used instead of WriteLine.
Console.Write("*");
Console.Write("*");
Console.Write("*");

Übung: Kochrezept

  • Schreib ein Programm, das ein Kochrezept in der Konsole ausgibt.
  • Erstelle dein eigenes Rezept und kopiere nicht nur einfach das Beispiel.
  • Formattiere die Ausgabe, zB:
    • Verwende Überschriften in GROSSBUCHSTABEN
    • Unterstreiche Überschriften mit speziellen Zeichen, wie =, *, oder -
    • Verwende ASCII Art

// This enables emojis
Console.OutputEncoding = System.Text.Encoding.Default;
Console.WriteLine("CHEESE SANDWICH 🥪");
Console.WriteLine("==================");
Console.WriteLine();
Console.WriteLine("Ingredients:");
Console.WriteLine("🍞 1 slice of bread");
Console.WriteLine("🧀 1 slice of cheese");
Console.WriteLine("🍅 1 slice of tomato");
Console.WriteLine();
Console.WriteLine("How to prepare:");
Console.WriteLine("1. Put the cheese on the bread");
Console.WriteLine("2. Put the tomato on the cheese");
Console.WriteLine("3. If you like, put it in the oven 🔥 for 5 minutes at 160°C");
Console.WriteLine();
Console.WriteLine("Enjoy 🤤!");

Tips

  • \n ist eine Escape Sequence. Damit wird ein Zeilenumbruch eingefügt
  • mit Console.Clear() kann der Inhalt der Konsole gelöscht werden.
  • Die Konsole unterstützt Farben
    • muss for Console.WriteLine gemacht werden
    • Console.BackgroundColor ändert den Hintergrund
    • Console.ForegroundColor ändert die Schriftfarbe

// Line Break:
Console.WriteLine("Line 1\nLine 2\nLine 3");
// Clear Screen:
Console.Clear();
Console.WriteLine("Hello World on a blank screen");
// Colors:
Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.White;
Console.Write("My name is ");
Console.BackgroundColor = ConsoleColor.Yellow;
Console.ForegroundColor = ConsoleColor.Green;
Console.Write("Norbert");
Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.White;
Console.Write("!");

Übung

Verbessere dein Rezept, indem du Farben verwendest.


Literals, Constants

  • Ein Literal ist ein Wert der in deinem Programm vorkommt. zB:
    • String literal: "Hello World"
    • Character literal: 'A'
    • Integer literal: 42
    • Floating point literal: 3.1415
    • Boolean literal: true, false
  • Eine Konstante ist ein Name für ein Literal
    • Der Wert kann sich nicht ändern!
    • Werden üblicherweise in GROSSBUCHSTABEN geschrieben
    • zB: const int ANSWER = 42; oder const string GREETING = "Hello World";

Variables

  • Eine Variable ist ein Name für einen Wert, der sich ändern kann.
    • Wird üblicherweise in kleinbuchstaben geschrieben.
    • zB: int answer = 42; oder string greeting = "Hello World";
  • Übung:
    • Schreibe ein Programm in dem Literale, Konstanten und Variablen verwendet werden.
    • Versuche einer Variable eine Konstante zuzuweisen und umgekehrt. Was ist möglich?

Datentypen

  • Der Datentyp definiert welche Werte eine Konstante oder eine Variable annehmen kann. zB:
    • string (Zeichenkette/Text)
    • char (einzelnes Zeichen)
    • int (ganze Zahl)
    • float, double (Gleitkommazahl)
    • boolean (Wahrheitswert)
  • Wir werden uns Datentypen später noch näher ansehen.

Beispiele

Console.Write("Take "); // "Take " is a String Literal
Console.Write(3); // 3 is an Integer Literal
Console.Write(" pizzas and bake it for ");
Console.Write(1.5); // 1.5 is a Floating Point Literal
Console.WriteLine(" minutes.");
Console.Write("Believe me, it is ");
Console.Write(true); // True is a Boolean Literal
Console.WriteLine(" that the pizza will be delicious!");

// Let's define a String Constant for the
// address of our school. The address is
// very unlikely to change -> a constant is a good choice.
const string SCHOOL_ADDRESS = "Alauntalstraße 29, 3500 Krems";
Console.Write("I go to school at ");
Console.WriteLine(SCHOOL_ADDRESS); // Here we use the constant
Console.Write("Please drive me to school at ");
Console.WriteLine(SCHOOL_ADDRESS); // Here we use the constant again.
// We DO NOT have to repeat the school's address 👍
// Let's define an Integer Constant and use it
const int NUMBER_OF_STUDENTS = 23;
Console.Write(NUMBER_OF_STUDENTS);
Console.WriteLine(" students are in our class.");

Console.Write("Please type in your name: ");
string name = Console.ReadLine()!; // Here we declare a variable called name
// and we assign it the value of the user input.
Console.Write("Your name is ");
Console.Write(name); // Here we use the variable to print out the entered name.
Console.WriteLine();
Console.Write("Please type in the name of a friend: ");
name = Console.ReadLine()!; // Here we let the user enter another name.
// The value of name changes! Therefore, it has to be
// a VARIABLE and cannot be a constant.
Console.Write("Your friend's name is ");
Console.Write(name);

Console.ReadLine

  • Eine Funktion, von .NET zur Verfügung gestellt, so wie Console.WriteLine
  • Voller Name: System.Console.ReadLine
  • Liest einen Text von Standard Input
    • aktuell ist das die Tastatur
    • kann auch geändert werden
  • Es gibt auch Console.ReadKey
    • Liest nur einen einzelnen Buchstaben
    • Pausiert das Programm bis der Benutzer eine Taste gedrückt hat

AnyKeyImage.png


Datentypen

DatentypBeschreibung
stringAbfolge von 0 oder mehreren (Unicode) Zeichen
charEinzelnes (Unicode) Zeichen
boolWahrheitswert (true oder false)
int, long, short, etc.Ganzzahlige numerische Werte (keine Kommazahlen)
float, double, decimalGleitkommazahlen. Faustregel: double für mathematische Berechnungen, decimal für Geldbeträge

Literale der Datentypen

DatentypBeispielBemerkung
string"Hello World"doppelte Anführungszeichen
char'A'einfache Anführungszeichen
booltrue, false
int42
long42LSuffix L (=long)
float42fSuffix f (=float)
double42dSuffix d (=double)
decimal42mSuffix m (=money)

String Parsing

  • Parsing wird das Verfahren genannt, einen String in einen anderen Datentyp zu konvertieren
  • zB
    • Wir bitten den Benutzer eine Zahl einzugeben
    • Console.ReadLine liefert immer einen string, wir bekommen daher einen String in dem eine Zahl steht, zB "42"
    • Wir müssen den String-Wert parsen, um ihn in einen Integer-Wert umzuwandeln
int myIntegerValue = int.Parse("42");

Übung

  • Erstelle ein Programm bei dem der Benutzer zwei Zahlen eingeben muss.
  • Die Zahlen werden in Integer-Werte konvertiert
  • Die Summe der beiden Werte wird berechnet und ausgegeben
  • Bonusaufgabe: Der Benutzer soll wählen können, ob addiert, oder subtrahiert wird.

Math

  • Die Klasse Math enthält viele nützliche Funktionen und Konstanten
    • PI, Absolutwert, Trigonometrische Funktionen (sin, tan, cos, etc)
  • So wie bei Console ist der volle Name System.Math

Math - Merkliste

Funktion/KonstanteBeschreibung
Math.PIDie Konstante π\pi
Math.AbsAbsolutwert einer Zahl
Math.FloorAbrunden
Math.CeilingAufrunden
Math.Min, Math.MaxGibt die kleinere/größere von zwei Zahlen zurück
Math.PowPotenz
Math.RoundRundet zur nächsten Zahl abhängig von der angegebenen Anzahl an Nachkommastellen

Übung

  • Erstelle ein Konsolenprogramm zur Berechnung einer Kreisfläche.
  • Der Radius soll vom Benutzer eingegeben werden.
  • Die Formel: A=πr2A = \pi * r^2

Expressions

  • Eine Expression (Ausdruck) ist eine Berechnung, deren Ergebnis ein Wert eines bestimmten Datentyps ist.
  • zB
    • length * width - Ergebnis ist eine Zahl
    • number % 2 - Ergebnis ist eine Zahl
    • remainder == 0 - Ergebnis ist ein Wahrheitswert
    • number > 5 - Ergebnis ist ein Wahrheitswert
    • "The next number is " + number - Das Ergebnis ist ein String
  • Expressions enden nicht mit einem Strichpunkt
  • Eine Zuweisung kann den Wert einer Expression einer Variable zuweisen. Die ganze Zeile ist dann ein Statement. int area = length * width;

Advanced Integer Literals

  • Verwende das Prefix 0x to für Hexadezimalwerte
    • zB: 0x10 == 16
  • Verwende das Prefix 0b für Binärwerte
    • zB: 0b1000 == 8
  • Verwende _ um Ziffern zu gruppieren
    • Dient nur der Lesbarkeit und hat sonst keine Auswirkung
    • zB 1_000_000 für eine Million

Code Blocks

  • Mit geschwungenen Klammern {} können Statements zu Blöcken gruppiert werden.
Console.WriteLine("This stmt is at top-level");
{ // block starts here
Console.WriteLine("This stmt is in");
Console.WriteLine("the first code block");
} // block ends here
{
Console.WriteLine("This stmt is in");
Console.WriteLine("the second code block");
}
Console.WriteLine("This stmt is at top-level again");

Nested Code Blocks

  • Blöcke können verschachtelt werden
{ // OUTER block starts here
Console.WriteLine("In first code block");
{ // INNER block starts here
Console.WriteLine("In inner block");
} // INNER block ends here
} // OUTER block ends here
  • Die Verwendung von Einrückung hilft beim Lesen und schützt vor Fehlern

Warum Code Blocks?

  • Die Sichtbarket von Variablen/Konstanten ist auf einen Block limitiert
    • Man sagt: Der Block ist der Scope der Variablen
    • Variablen können verwendet werden in ihrem Block und in darunter verschachtelten Blöcken
{
int answer = 42; // variable is scoped to first code block
Console.WriteLine("The answer is " + answer);
{
Console.WriteLine("The answer is " + answer); // works, because variable is defined in outer block
}
}
Console.WriteLine("The answer is " + answer); // Error: Does not work, variable not visible here
{
Console.WriteLine("The answer is " + answer); // Error: Does not work, variable not visible here
}

Warum Code Blocks (2)

  • Man kann denselben Variablennamen in unterschiedlichen Blöcken verwenden
    • Es sind dann unterschiedliche Variablen obwohl sie denselben Namen haben
    • Grund: Unterschiedlicher Scope
{
Console.Write("Please enter your name: ");
string name = Console.ReadLine()!;
Console.WriteLine("Your name is " + name);
}
{
Console.Write("Enter your friend's name: ");
string name = Console.ReadLine()!;
Console.WriteLine("Your friend's name is " + name);
}

Warum Code Blocks (3)

  • Code Blocks werden verwendet um …
    • einen Block nur auszuführen, wenn eine Bedingung erfüllt ist (if-Statement)
    • einen Block mehrfach ausführen (Schleifen)
    • einem Block einen Namen zu geben (Methoden)

if-Statement

if (...)
{
...
}
else if (...)
{
...
}
else
{
...
}

switch-Statement

int grade = 1;
switch (grade)
{
case 1:
Console.WriteLine("Genius!");
break;
case 2:
case 3:
Console.WriteLine("Good!");
break;
case 4:
Console.WriteLine("Barely survived");
break;
default:
Console.WriteLine("Sorry, try again");
break;
}

while-Loop

while (...)
{
...
}

do-while-Loop

do
{
...
} while (...);

for-Loop

for (int i = 10; i > 0; i--)
{
Console.WriteLine(i);
}

foreach-Loop

int[] array = [1, 2, 3, 4, 5];
foreach (int element in array)
{
Console.WriteLine(element);
}

Arrays

// Declare a single-dimensional array of 5 integers.
int[] array1 = new int[5];
// Declare and set array element values.
int[] array2 = [1, 2, 3, 4, 5, 6];
// Declare a two dimensional array.
int[,] multiDimensionalArray1 = new int[2, 3];
// Declare and set array element values.
int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } };
// Declare a jagged array.
int[][] jaggedArray = new int[6][];
// Set the values of the first array in the jagged array structure.
jaggedArray[0] = [1, 2, 3, 4];

Arrays (2)

  • Die Anzahl der Dimensionen eines Arrays wird festgelegt wenn die Variable deklariert wird.
  • Die Länge jeder Dimension wird festgelegt wenn die Instanz des Arrays erstellt wird.
  • Diese Werte können sich nach der Erstellung nicht mehr ändern.
  • Wir müssen also bei Arrays immer schon bei der Erstellung wissen, wie groß das Array werden wird.

Übung

  • Erstelle ein mehrdimensionales Array, das ein Schachbrett abbildet.
  • Ein Schachbrett hat 8x8=64 Felder
  • Nummeriere die Felder von 1 bis 64 durch

int[,] chessBoard = new int[8,8];
for (int row = 0; row < 8; row++)
{
for (int column = 0; column < 8; column++)
{
chessBoard[row, column] = (row * 8) + column + 1;
}
}
<>

Listen

  • Eine Liste ist ein Datentyp, der mehrere Elemente aufnehmen kann, ähnlich einem Array.
  • Im Unterschied zum Array, kann eine Liste beliebig wachsen und schrumpfen.
List<int> myList = new List<int>();
myList.Add(5);
myList.Add(7);
myList.Remove(5); // removes number 5
myList.RemoveAt(0); // removes at index 1

Zufallszahlen

  • Verwende Random.Shared.Next
  • Voller Name: System.Random.Shared.Next
  • Generiert eine zufällige Zahl
  • Man kann die minimale Zahl (inklusive) und die maximale Zahl (exklusive) angeben
// Create a random number between 1 and 100
int number = Random.Shared.Next(1, 101);

Übung

  • Joker
    • Tip für Level 1:
      • Verwende ganzzahlige Divisionen
      • 1234 / 100 == 12
    • Tip für Level 2:
      • Verwende den Modulo-Operator
      • 1234 % 100 == 34

String Interpolation

  • Ist das Einfügen von Werten in einen String.
  • Das Ergebnis ist ein neuer String.
  • Für String Interpolation muss ein String mit einem Dollarzeichen beginnen. Eingefügte Werte werden mit geschwungenen Klammern gekennzeichnet.
int age = 15;
// build sentence using concatenation
string sentence1 = "I am " + age + " years old";
// build sentence using interpolation
string sentence2 = $"I am {age} years old";
// use an expression for interpolation
string sentence3 = $"1 + 1 equals {1 + 1}";

Methoden

  • Methoden erlauben es einem Code Block einen Namen zuzuweisen
  • Besonders wichtig wenn wir denselben Block öfter verwenden möchten
    • Don’t repeat yourself - DRY
int CalculateSum(int a, int b)
{
return a + b;
}
  • Die Parameter a und b sind Werte die an die Methode übergeben werden. Innerhalb der Methode sind sie wie lokale (block-scoped) Variablen zu verwenden.
  • Vor dem Methodennamen muss angegeben werden welchen Datentyp der Rückgabewert hat.

void

  • Was wenn eine Methode keinen Rückgabewert hat?
  • void ist ein spezielles Schlüsselwort genau für diesen Fall
// method without return value and without parameters
void SayHello()
{
Console.WriteLine("Hello World!");
}
// method without return value but with a parameter
void SayHello(string name)
{
Console.WriteLine($"Hello {name}!");
}
// method without parameters but with return value
int GetNumber()
{
return 42;
}

Expression-bodied methods

  • Einzeilige Methoden können verkürzt geschrieben werden
// this ...
bool IsSunday()
{
return DateTime.Today.DayOfWeek == DayOfWeek.Sunday;
}
// ... is the same as this
bool IsSunday() => DateTime.Today.DayOfWeek == DayOfWeek.Sunday;

Übung: Fizz Buzz

  • Gib alle Zahlen zwischen 1 und 30 auf der Konsole aus
    • Ersetze jede Zahl die durch 3 teilbar ist mit dem Wort Fizz

    • Ersetze jede Zahl die durch 5 teilbar ist mit dem Wort Buzz

    • Ersetze jede Zahl die durch 3 UND 5 teilbar ist mit Fizz Buzz

    • Gib ein Komma zwischen jeder Zahl aus

    • Packe die Logik um eine Zahl in einen String für die Ausgabe zu konvertieren in eine Methode:

      string ToFizzBuzz(int number) { ... }

    • Geforderte Ausgabe: 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz


Übungsbeispiele


Rosetta Code

  • ist eine Website die bekannte Programmieraufgaben für verschiedene Sprachen listet
  • Rosetta Code: C Sharp

C# Rückschau

  • Bis jetzt haben wir gelernt Programme zu schreiben, die von oben nach unten, Statement für Statement durchlaufen.
  • Um flexibler zu werden können wir auch den Ablauf mit Verzweigungen und Schleifen beeinflussen.
  • Außerdem können wir wiederverwendbare Code-Blöcke definieren, sogenannte Methoden.
  • Wir können mit unterschiedlichen Datentypen umgehen und Arrays und Listen verwenden.

C# OOP

  • Wir lernen nun nach und nach Teile der objektorientierten Programmierung (OOP) kennen
  • OOP folgt vier Prinzipien:
    • Kapselung (engl. Encapsulation)
    • Vererbung (engl. Inheritance)
    • Polymorphismus (engl. Polymorphism)
    • Abstraktion (engl. Abstraction)
  • Wir werden diese im Laufe der Zeit kennenlernen

C# OOP (2)

  • Mit der Objektorientierung wurde ein neues Paradigma in der Welt der Programmierung etabliert.
  • Die Objektorientierung ist das zur Zeit vorherrschende Programmierparadigma
  • Objektorientierung ist dem menschlichen Denken nachempfunden.

C# OOP (3)

  • Das objektorientierte Programmierparadigma ist für Menschen leicht verständlich, da es menschlichen Denkmustern nachempfunden ist.
  • Alle relevanten Größen und Abläufe werden in objektorientierten Programmen durch Objekte beschrieben. Soll in einem Spiel beispielsweise ein Drache dargestellt werden, existiert dafür im Programm ein Objekt Dragon. Genauso existiert für ein Schwert ein Objekt Sword und für ein Schloss das Objekt Castle usw.
  • Ein Programm kann damit as System von Objekten verstanden werden, die untereinander Nachrichten austauschen.

C# Objekte

  • Objekte können durch folgende Metriken beschrieben werden:
    • ihre Eigenschaften
    • ihr Zustand
    • ihr Verhalten

C# Objekte - Eigenschaften

  • Objekte besitzen Eigenschaften, sogenannte Properties.
  • Eigenschaften werden verwendet um Objekte näher zu beschreiben.
  • Für das Objekt Flugschiff sind beispielsweise folgende Eigenschaften bekannt:
    • X und Y Koordinaten
    • Speed
    • Cost
    • PullForce

C# Objekte - Zustand

  • Der Zustand eines Objekts wird durch die Summe, der in den Eigenschaften eines Objekts gespeicherten Werte beschrieben
  • zB:
    • X: 3
    • Y: 4
    • Speed: 35
    • Cost: 1000000
    • PullForce: 37

C# Objekte - Verhalten

  • Das Verhalten von Objekten wird durch Operationen beschrieben, die ein Objekt durchführen kann. Die Operationen eines Objekts werden durch die Methoden eines Objekts abstrahiert, die in den Klassen definiert sind, zu denen die Objekte gehören.

C# Klassen

  • Klassen sind Baupläne für Objekte. In einer Klasse wird bestimmt welche Eigenschaften und welches Verhalten ein Objekt hat. Klassen werden auch als Objekttypen.
  • Klassen und Objekte sind die zentralen Konzepte der objektorientierten Programmierung.

C# Klassen (2)

  • Ein Objekt gehört immer zu einer bestimmten Klasse. Die Klasse wird als der Objekttyp eines Objekts bezeichnet. Objekte sind Instanzen ihrer Klasse. Für jede Klasse kann es beliebig viele Instanzen geben. Klassen existieren genau einmal in einem Programm.
  • Klassen sind Vorlagen für Objekte. Sie definieren die innere Zusammensetzung von Objekten.

C# Klassen - Bsp

// Klassendefinition
public class Airship
{
public int X { get; set; }
public int Y { get; set; }
public int Speed { get; set; }
public decimal Cost { get; set; }
public List<string> Keywords { get; set; }
}
// Deklaration und Instanziierung eines Objekts.
// a1 ist eine Instanz der Klasse Airship
Airship a1 = new Airship();
// Deklaration und Instanziierung eines weiteren Objekts.
// a2 ist eine Instanz der Klasse Airship
Airship a2 = new Airship();

C# Objektinstanzen

  • Von einer Klasse können mehrere Instanzen (Objekte) erstellt werden.
  • Jede dieser Objektinstanzen kann unterschiedliche Werte für die einzelnen Properties erhalten.
  • Wir verwenden den Klassennamen bei Variablen wie einen Datentyp.
  • Mit dem Schlüsselwort new wird eine neue Objektinstanz einer Klasse erzeugt.

C# Objektinstanzen - Bsp

Airship a = new Airship();
Airship b = new Airship();
a.Cost = 70_000m;
b.Cost = 69_000m;
Console.Write($"Airship a costs {a.Cost}");
Console.WriteLine($", but airship b costs {b.Cost}.");

C# Klassen - Aufbau

// Class Definition
public class Airship
{
// Properties
public int X { get; set; }
public int Y { get; set; }
public List<string> Keywords { get; set; }
// Constructor
public Airship()
{
Keywords = new List<string>();
}
// Methods
public void AddKeyword(string keyword)
{
Keywords.Add(keyword);
}
public void Move(int x, int y)
{
this.X = x;
this.Y = y;
}
}

C# Konstruktor

  • Die Objektinstanzierung ist ein zentrales Konzept der OOP, welches ermöglicht Objekte aus Klassen zu erstellen.
  • Im Zuge der Instanziierung eines Objekts wird der Konstruktor einer Klasse aufgerufen.
  • Im Konstruktor kann die Objektinstanz initialisiert werden, damit diese bereit für die Verwendung ist.

C# Konstruktor - Bsp

// Wir definieren eine Variable vom Typ Airship.
Airship a;
// An dieser Stelle kann die Variable noch nicht
// verwendet werden, da noch keine Instanz erstellt wurde.
// Wir sagen nur:
// Diese Variable kann ein Objekt vom Typ Airship aufnehmen.
// Wir erstellen ein neues Objekt:
a = new Airship();
// Durch die Verwendung des new Schlüsselwort
// und der runden Klammern wird ein neues Objekt instanziiert.
// Dafür wird der benötigte Speicher
// für alle enthaltenen Properties allokiert (reserviert)
// und der Konstruktor aufgerufen um das Objekt zu initialisieren.
// Danach ist das Objekt bereit für die Verwendung.