Metainformationen zur Seite
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
start:visualstudio2017:programmieren:csharp [2018/10/03 12:37] wikiadmin [Boxing und Unboxing] |
start:visualstudio2017:programmieren:csharp [2021/12/16 13:30] (aktuell) wikiadmin [Referenz- oder Value- Typ?] |
||
---|---|---|---|
Zeile 226: | Zeile 226: | ||
---- | ---- | ||
+ | |||
+ | ===== Referenz- oder Value- Typ? ===== | ||
+ | |||
====== Klassen und Objekte ====== | ====== Klassen und Objekte ====== | ||
Zeile 1288: | Zeile 1291: | ||
|Boxing //(Objekt vom Stack zum Heap verschieben und eine Referenz auf das Objekt legen.)// | |Boxing //(Objekt vom Stack zum Heap verschieben und eine Referenz auf das Objekt legen.)// | ||
- | |Unboxing //(Objekt vom Heap zum Stack verschieben)// | + | |Unboxing //(Objekt vom Heap zum Stack verschieben.)//| Ein **Referenztyp** wird in einen **Wertetyp** verwandelt.| |
<code C# [enable_line_numbers=" | <code C# [enable_line_numbers=" | ||
Zeile 1339: | Zeile 1342: | ||
Damit ist auch bewiesen, dass sich das Objekt merkt, was für ein Typ es gespeichert hat, deshalb ist bei Umboxing erst ein Casting zu **int** nötig. | Damit ist auch bewiesen, dass sich das Objekt merkt, was für ein Typ es gespeichert hat, deshalb ist bei Umboxing erst ein Casting zu **int** nötig. | ||
- | Normalerweise üblassen Sie Boxing und Unboxing dem Compile. Es soll aber nach Möglichkeit vermieden werden, da es einen nicht unerheblichen Laufzeitaufwand generiert. | + | |
+ | Normalerweise üblassen Sie Boxing und Unboxing dem Compiler. Es soll aber nach Möglichkeit vermieden werden, da es einen nicht unerheblichen Laufzeitaufwand generiert. | ||
===== Strings ===== | ===== Strings ===== | ||
+ | Der Datentyp **String** ist universell einsetzbar. | ||
+ | |||
+ | Obwohl die Dekleration wie bei einem Wertetyp aussieht, handelt es sich bei einem **string** um einen Referenztypen. | ||
+ | |||
+ | Ein String ist bezüglich der Grösse dynamisch. Das heisst, er nimmt sich vom Heap so viel Speicher, wie er gerade braucht. | ||
+ | Strings in .NET sind immer Unicode, d.h. 16Bit gross. Mit Hilfe der 2^15(65535) darstellbaren Zeichen können alle Zeichen dieser Welt und einige Sonnderzeichen dargestellt werden. Wenn man es genau betrachtet, ist sogar noch ca. 1/3 Reserve verfügbar. | ||
==== Stringzuweisungen ==== | ==== Stringzuweisungen ==== | ||
+ | Direkte Zuweisung: | ||
+ | <code C# [enable_line_numbers=" | ||
+ | string myString = "Hallo Welt"; // Zuweise bei der Deklaration oder... | ||
+ | |||
+ | string myString | ||
+ | myString=" | ||
+ | </ | ||
+ | |||
+ | Zuweisen über die **Copy()**-Methode: | ||
+ | <code C# [enable_line_numbers=" | ||
+ | string myString1 = "JMZ Solution"; | ||
+ | string myString2 = String.Copy(myString1);// | ||
+ | </ | ||
+ | oder über die Verwendung des Teilstring Befehls **Substring()**: | ||
+ | <code C# [enable_line_numbers=" | ||
+ | string myString1 = "JMZ Solution"; | ||
+ | string myString2 = myString1.Substring(6); | ||
+ | </ | ||
+ | Zuweisung mit Hilfe von Escape-Sequenzen: | ||
+ | <code C# [enable_line_numbers=" | ||
+ | string myString = " | ||
+ | </ | ||
+ | Die Ausgabe wäre hier: | ||
+ | <code C# [enable_line_numbers=" | ||
+ | Dieser Text hat " | ||
+ | </ | ||
+ | Manchmal möchte man die Bearbeitung von Escape-Sequenzen auch unterbinden. Typischerweise bei der Behandlung von Pfadangaben. Um den Backshlash " | ||
+ | <code C# [enable_line_numbers=" | ||
+ | string myString = " | ||
+ | </ | ||
+ | Bei der Eingabe von " | ||
+ | <code C# [enable_line_numbers=" | ||
+ | string myString = @" | ||
+ | </ | ||
+ | |||
==== Zugriff auf String ==== | ==== Zugriff auf String ==== | ||
- | ===== Formatierung von Daten ===== | + | Ein Beispiel: |
+ | <code C# [enable_line_numbers=" | ||
+ | using System; | ||
+ | class TestClass | ||
+ | { | ||
+ | | ||
+ | { | ||
+ | string myStr = "Hallo Welt."; | ||
+ | string xStr = string.Empty; | ||
+ | |||
+ | for(int i=0; i< | ||
+ | { | ||
+ | | ||
+ | if(x != " | ||
+ | xStr += x; | ||
+ | } | ||
+ | |||
+ | Console.WriteLine(xStr); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | Wir sehen in diesem Beispiel, wie auch Operatoren, hier **+=**, auf Strings angewendet werden können. | ||
+ | |||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | ---- | ||
+ | |||
+ | Strings sind nicht veränderbar (immutable). Das bedeutet, dass bei jeder Stringfunktion ein neues Objekt angelegt wird. Sogar ein Leerstring **"" | ||
+ | Häufig muss geprüft werden, ob ein String null oder leer ist. Dazu stehen die Methoden **IsNullOrEmpty** zu Verfügung: | ||
+ | <code C# [enable_line_numbers=" | ||
+ | if (!string.IsNullOrEmpty(myStr)) | ||
+ | ... | ||
+ | </ | ||
+ | .NET 4 hat eine weitere Methode mit demselben Zweck: | ||
+ | <code C# [enable_line_numbers=" | ||
+ | if (!string.IsNullOrWhitespace(myStr)) | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | {{: | ||
+ | ---- | ||
+ | |||
+ | ===== Formatierung von Daten ==== | ||
==== Standardformate ==== | ==== Standardformate ==== | ||
+ | |||
+ | Datenformatierung haben wir bereits in Codebeispielen angetroffen. | ||
+ | Die Angaben, welche Art von Formatierung gewünscht wird, geschied im Platzhalter durch die Angeben eines Formatzeichens und ggf. einer Präzisionsangabe für die Anzahl Stellen, die ausgegeben werden sollen. Beim folgenden Beispiel wollen wir, dass die Zahlen korrekt untereinander stehen: | ||
+ | |||
+ | <code C# [enable_line_numbers=" | ||
+ | // Beispiel Formatierung 1 | ||
+ | using System; | ||
+ | class TestClass | ||
+ | { | ||
+ | | ||
+ | { | ||
+ | int a,b | ||
+ | Console.WriteLine(" | ||
+ | a = Convert.ToInt32(Console.ReadLine()); | ||
+ | Console.WriteLine(" | ||
+ | b = Convert.ToInt32(Console.ReadLine()); | ||
+ | Console.WriteLine(" | ||
+ | Console.WriteLine(" | ||
+ | Console.WriteLine(" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Bei der Eingabe von 75 u nd 1024 würde die Ausgabe folgendermassen aussehen: | ||
+ | |||
+ | <code C# [enable_line_numbers=" | ||
+ | Die Zahlen lauten: | ||
+ | Zahl 1: 00075 | ||
+ | Zahl 2: 01024 | ||
+ | </ | ||
+ | |||
+ | Im Falle einer Hexadezimaleausgabe würde die ganze Zahl auch automatisch umgerechnet: | ||
+ | |||
+ | <code C# [enable_line_numbers=" | ||
+ | // Beispiel Formatierung 2 | ||
+ | using System; | ||
+ | class TestClass | ||
+ | { | ||
+ | | ||
+ | { | ||
+ | int a,b | ||
+ | Console.WriteLine(" | ||
+ | a = Convert.ToInt32(Console.ReadLine()); | ||
+ | Console.WriteLine(" | ||
+ | b = Convert.ToInt32(Console.ReadLine()); | ||
+ | Console.WriteLine(" | ||
+ | Console.WriteLine(" | ||
+ | Console.WriteLine(" | ||
+ | } | ||
+ | |||
+ | // Ein weiteres Formatierungsbeispiel: | ||
+ | // {0, 20:5 } 0=Index, 20=Aligment 5=Format | ||
+ | // index -> Dieses Zeichen wird vorangestellt. | ||
+ | // Aligment -> Es werden 20 Stellen dargestellt. | ||
+ | // Format -> 5 Stellen werden dargestelllt mit Index Zeichen voran. | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Die Formatierungszeichen und ihre Bedeutung: | ||
+ | |||
+ | ^Zeichen^Formatierung^ | ||
+ | |C,c|Hier noch die Bedeutung eintragen.....| | ||
+ | |||
==== Selbstdefinierte Formate ==== | ==== Selbstdefinierte Formate ==== | ||
==== Ausrichtung ==== | ==== Ausrichtung ==== |