You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Die Dokumentation von `Array` findet sich unter https://docs.microsoft.com/de-de/dotnet/api/system.array?view=netcore-3.1
121
+
Die Dokumentation von `Array` findet sich unter https://learn.microsoft.com/de-de/dotnet/api/system.array?view=net-9.0
123
122
124
123
> **Merke:** Arrays sind in C# statisch definiert und haben keine veränderliche Größe.
125
124
@@ -136,6 +135,9 @@ Lassen Sie uns einen alternativen Ansatz bestreiten. Wir implementieren ein eige
136
135
137
136
```
138
137
138
+
> [!CAUTION]
139
+
> Die nachfolgende Implementierung soll beispielhaft die Umsetzung einer verketteten Liste zeigen - es handelt sich um eine rudimentäre Umsetzung. Benutzen Sie für die Praxis die entsprechenden .NET-Bibliotheken, z.B. `LinkedList<T>` aus `System.Collections.Generic`!
140
+
139
141
```csharp LinkedList.cs
140
142
using System;
141
143
@@ -173,7 +175,7 @@ public class LinkedList{
173
175
current=current.next;
174
176
count++;
175
177
}
176
-
return1;
178
+
thrownewIndexOutOfRangeException();
177
179
}
178
180
}
179
181
}
@@ -204,10 +206,8 @@ Boxing und Unboxing würden die spezifischen Datentypen auf diesen abgebildet.
204
206
205
207
```csharp
206
208
int i = 123;
207
-
objecto=i; // The following line boxes i.
208
-
209
-
o=123;
210
-
i= (int)o; // unboxing
209
+
object o = i; // boxing: der Werttyp i wird auf den Heap kopiert
210
+
int j = (int)o; // unboxing: explizite Cast-Operation erforderlich
211
211
```
212
212
213
213
Nachteilig daran ist, dass
@@ -293,7 +293,8 @@ class MyGenericClass<T, U>
293
293
}
294
294
```
295
295
296
-
Hinsichtlich der Namenswahl für die generischen Typen sind sie frei, sollten aber berücksichtigen, dass für den Leser ggf. unklar ist, wie welcher konkrete Datentyp realisiert werden kann. Die Einbuchstabenvariante "T" sollte nur genutzt werden, wenn in Bezug auf einen Container die Bedeutung wirklich klar ist.
Wie bereits bei den generischen Methoden angedeutet können wir mittels "Beschränkungen" sicherstellen, dass eine gültige Operation für einen Datentyp existiert.
Folglich ist es notwendig die Allgemeinheit der generischen Methoden oder Klassen zu
572
572
beschränken. Man definiert Beschänkungen oder *Constraints*, die die Breite der verwendbaren Datentypen einschränken. Die Typprüfung bezieht diese Informationen dann ein.
| `where T : struct` | ... ein Werttyp (Nicht-Nullable) sein. |
577
+
| `where T : class` | ... ein Verweistyp sein. |
578
+
| `where T : notnull` | ... ein Nicht-Nullable-Typ (Wert- oder Verweistyp) sein. |
579
+
| `where T : unmanaged` | ... ein _unmanaged_ Werttyp sein (keine Referenzen enthalten). |
580
+
| `where T : new()` | ... einen öffentlichen, parameterlosen Konstruktor besitzen. |
581
+
| `where T : <Basisklasse>` | ... die Basisklasse sein oder von ihr abgeleitet sein. |
582
+
| `where T : <Schnittstelle>` | ... die Schnittstelle sein oder diese implementieren. |
583
+
584
+
Mehrere Beschränkungen lassen sich kombinieren; dabei gilt eine feste Reihenfolge: zuerst `struct`/`class`/`notnull`, dann Basisklasse und Schnittstellen, zuletzt `new()`.
585
+
586
+
```csharp
587
+
class EmployeeList<T> where T : notnull, Employee, IComparable<T>, new() { }
588
+
```
580
589
581
-
> Unter `net7` lässt sich obiges Problem sehr elegant mit einem `where T : INumber<T>` lösen. Testen Sie dieses Feature auf Ihrem lokalen Rechner. [Link](https://devblogs.microsoft.com/dotnet/dotnet-7-generic-math/)
590
+
> Obiges Problem lässt sich sehr elegant über die Beschränkung `where T : INumber<T>` lösen. Das Interface `INumber<T>` (aus `System.Numerics`) fasst die arithmetischen Operatoren als `staticabstract`-Memberzusammen, sodass `+`, `-` usw. innerhalbdergenerischenMethodegarantiertverfügbarsind.
591
+
>
592
+
> ```csharp
593
+
> usingSystem.Numerics;
594
+
>
595
+
> staticTPlus<T>(Tx, Ty) whereT : INumber<T> {
596
+
>returnx+y; // dank Constraint nun gültig
597
+
> }
598
+
> ```
582
599
583
600
Das folgende Beispiel setzt die Möglichkeiten der Beschränkung konsequent um und lässt nurKlasse
584
601
`Employee` zu. Damit wirdsichergestellt, dassdieMethoden,
@@ -615,7 +632,7 @@ ggf. notwendig die spezifischen Parameter des Datentyps zur Laufzeit
615
632
auszuwerten. Im folgenden sollen die Beispiele die Bedeutung diese Vorgehens
0 commit comments