.NET-HILFE

C# AS (Wie es für Entwickler funktioniert)

Bei der Programmierung in C# wird häufig mit verschiedenen Datentypen gearbeitet. Manchmal müssen wir überprüfen, ob ein object von einem bestimmten Typ ist oder versuchen, es in diesen Typ zu konvertieren. Da kommt das as-Operator-Schlüsselwort ins Spiel. Zusammen mit seinem nahen Verwandten hilft der is-Operator bei Typprüfungen und Umwandlungen. In diesem Tutorium werden wir die Feinheiten dieses Operators und seine Anwendungsfälle untersuchen.

Das Verständnis des as-Operators

Grundlagen des as-Operators

Das Schlüsselwort as-Operator in C# ist ein binärer Operator, der verwendet wird, um bestimmte Konvertierungen zwischen kompatiblen Referenztypen oder nullable Typen durchzuführen. Der folgende Code bietet eine einfache Demonstration:

object myObj = "Hello, World!";
string myStr = myObj as string;
object myObj = "Hello, World!";
string myStr = myObj as string;
Dim myObj As Object = "Hello, World!"
Dim myStr As String = TryCast(myObj, String)
$vbLabelText   $csharpLabel

Im obigen Code ist myObj ein Objekt vom Typ object (der Basistyp für alle Typen in C#). Wir sind uns zur Kompilierungszeit nicht sicher über dessen zugrunde liegenden Typ. Der as-Operator wird verwendet, um zu versuchen, myObj als string zu behandeln. Wenn erfolgreich, wird myStr den Zeichenfolgenwert enthalten. Andernfalls wird es einen null value haben.

Wie unterscheidet sie sich von der expliziten Besetzung?

Obwohl sowohl der as-Operator als auch ein expliziter Cast ähnliche Zwecke erfüllen, gibt es einen wesentlichen Unterschied. Wenn ein expliziter Cast fehlschlägt, wird eine Ausnahme ausgelöst. Andererseits, wenn der as-Operator bei dem Versuch, von einem Typ zu einem anderen zu konvertieren, fehlschlägt, gibt der Operator einen null-Wert zurück, anstatt eine Ausnahme auszulösen. Dies soll anhand des folgenden Codebeispiels erläutert werden:

object someValue = 12345;

// Using explicit cast
string castResult;
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null;
}

// Using the as operator
string asResult = someValue as string; // No exception, but asResult will be null since the cast fails.
object someValue = 12345;

// Using explicit cast
string castResult;
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null;
}

// Using the as operator
string asResult = someValue as string; // No exception, but asResult will be null since the cast fails.
Dim someValue As Object = 12345

' Using explicit cast
Dim castResult As String
Try
	castResult = DirectCast(someValue, String) ' This will throw an exception since the cast fails.
Catch ex As Exception
	castResult = Nothing
End Try

' Using the as operator
Dim asResult As String = TryCast(someValue, String) ' No exception, but asResult will be null since the cast fails.
$vbLabelText   $csharpLabel

Wie ersichtlich, kann die Verwendung des as-Operators oft sicherer sein, da Sie potenzielle Laufzeitfehler vermeiden.

Die Verbindung mit dem is operator

Oft wird der as-Operator in Verbindung mit dem is-Operator für den Typentest verwendet, bevor ein Konvertierungsversuch unternommen wird. Der is-Operator prüft, ob das angegebene Objekt vom angegebenen Typ ist, und gibt true zurück, wenn dies der Fall ist, andernfalls gibt er false zurück.

Das folgende Codebeispiel veranschaulicht dies:

object testObject = "This is a string";

if(testObject is string) {
    string result = testObject as string;
    Console.WriteLine(result);
} else {
    Console.WriteLine("Not a string");
}
object testObject = "This is a string";

if(testObject is string) {
    string result = testObject as string;
    Console.WriteLine(result);
} else {
    Console.WriteLine("Not a string");
}
Dim testObject As Object = "This is a string"

If TypeOf testObject Is String Then
	Dim result As String = TryCast(testObject, String)
	Console.WriteLine(result)
Else
	Console.WriteLine("Not a string")
End If
$vbLabelText   $csharpLabel

Mit der Einführung von Pattern Matching in späteren Versionen von C# kann der is-Operator auch bestimmte Aktionen ausführen, wenn der Typentest besteht. Dies verringert oft die Notwendigkeit, den as-Operator zu verwenden.

Tiefer gehende Sonderfälle und Überlegungen

Konvertierung von nullbaren Werttypen

Einer der besonderen Fälle, in denen der as-Operator von unschätzbarem Wert ist, betrifft nullable Werttypen. Werttypen (wie int, double usw.) können keinen null-Wert zugewiesen bekommen. Indem Sie sie jedoch nullbar machen, können Sie ihnen null zuweisen. Der as-Operator kann verwendet werden, um eine Konvertierung in einen Nullable-Werttyp zu versuchen:

int? nullableInt = 10;
object objInt = nullableInt;
int? resultInt = objInt as int?;
int? nullableInt = 10;
object objInt = nullableInt;
int? resultInt = objInt as int?;
Dim nullableInt? As Integer = 10
Dim objInt As Object = nullableInt
Dim resultInt? As Integer = CType(objInt, Integer?)
$vbLabelText   $csharpLabel

Referenzkonvertierungen und benutzerdefinierte Konvertierungen

Der as-Operator unterstützt sowohl Referenzkonvertierungen (zwischen verwandten Referenztypen) als auch benutzerdefinierte Konvertierungen. Benutzerdefinierte Konvertierungen sind die Konvertierungen, die mit speziellen Konvertierungsmethoden in Ihren Klassen definiert werden.

Betrachten Sie den folgenden Code für eine benutzerdefinierte Konvertierung:

class Sample {
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();
string conversionResult = sampleObject as string;
class Sample {
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();
string conversionResult = sampleObject as string;
Friend Class Sample
	Public Shared Widening Operator CType(ByVal s As Sample) As String
		Return "Converted to String"
	End Operator
End Class

Private sampleObject As New Sample()
Private conversionResult As String = TryCast(sampleObject, String)
$vbLabelText   $csharpLabel

Hier ermöglicht die benutzerdefinierte Konvertierungsmethode, dass ein Objekt vom Typ Sample als string behandelt wird.

Wenn as nicht zutrifft

Denken Sie daran, dass der as-Operator nicht mit Werttypen (es sei denn, es handelt sich um nullable Werttypen) oder mit benutzerdefinierten Konvertierungen, die eine explizite Methode beinhalten, verwendet werden kann.

Erweiterte Szenarien mit dem as-Operator

Boxen und Unboxing mit as

Boxing ist der Prozess der Umwandlung einer Instanz vom Typ Wert in eine Objektreferenz. Dies ist möglich, weil jeder Werttyp implizit von einem object erbt. Wenn Sie einen Werttyp boxen, verpacken Sie ihn in ein object.

Betrachten Sie den folgenden Code für die Umwandlung von Boxen:

int intValue = 42;
object boxedValue = intValue;
int intValue = 42;
object boxedValue = intValue;
Dim intValue As Integer = 42
Dim boxedValue As Object = intValue
$vbLabelText   $csharpLabel

Hier wird der intValue in ein object verpackt.

Unboxing ist der umgekehrte Prozess des Boxens, d. h. das Extrahieren des Wertetyps aus dem object. Der as-Operator kann verwendet werden, um Werte sicher zu entboxen, insbesondere wenn Sie sich nicht sicher sind, ob das object den erwarteten Werttyp enthält. Wenn das Unboxing nicht erfolgreich ist, ist das Ergebnis des Ausdrucks null.

Betrachten Sie das folgende Beispiel für Unboxing-Umwandlungen:

object obj = 42;
int? result = obj as int?;
object obj = 42;
int? result = obj as int?;
Dim obj As Object = 42
Dim result? As Integer = CType(obj, Integer?)
$vbLabelText   $csharpLabel

Arbeiten mit Arrays

Arrays sind in C# Referenztypen. Manchmal müssen Sie feststellen, ob ein object ein bestimmter Array-Typ ist und dann damit arbeiten. Der as-Operator kann hier auch helfen.

Betrachten Sie den folgenden Code:

object[] arrayObject = new string[] { "one", "two", "three" };
string[] stringArray = arrayObject as string[];
object[] arrayObject = new string[] { "one", "two", "three" };
string[] stringArray = arrayObject as string[];
Dim arrayObject() As Object = New String() { "one", "two", "three" }
Dim stringArray() As String = TryCast(arrayObject, String())
$vbLabelText   $csharpLabel

In dem obigen Code ist arrayObject ein Array von Objekten, enthält jedoch tatsächlich Zeichenfolgen. Mit dem as-Operator können Sie sicher versuchen, es als ein Array von Strings zu behandeln.

Kombinieren von as mit LINQ

Language Integrated Query (LINQ - Microsoft Documentation) ist eine leistungsstarke Funktion in C#, die es Ihnen ermöglicht, Sammlungen auf SQL-ähnliche Weise abzufragen. Manchmal kann es vorkommen, dass Sie Objekte gemischter Typen in einer Sammlung abrufen und bestimmte Typen herausfiltern möchten. Hier kann der as-Operator sehr nützlich sein.

Nehmen wir zum Beispiel eine Liste von Objekten, die sowohl Zeichenketten als auch ganze Zahlen enthält. Wenn Sie nur die Strings abrufen möchten, könnten Sie den as-Operator in Verbindung mit LINQ verwenden:

var mixedList = new List<object> { "Hello", 42, "World", 100 };
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();
var mixedList = new List<object> { "Hello", 42, "World", 100 };
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();
Dim mixedList = New List(Of Object) From {"Hello", 42, "World", 100}
Dim stringValues = mixedList.Select(Function(item) TryCast(item, String)).Where(Function(item) item IsNot Nothing).ToList()
$vbLabelText   $csharpLabel

Integration mit Iron Suite

Iron Suite Solutions for C# Developers ist ein Paket hochwertiger Tools, das C#-Entwicklern ermöglicht, Funktionen wie PDF-Manipulation, Excel-Verarbeitung, optische Zeichenerkennung (OCR) und Barcode-Erzeugung und -Lesen nahtlos zu integrieren. Diese Tools, wie unser vorheriges Gespräch über die as und is Operatoren, sind entscheidend, um die Effizienz eines Entwicklers bei der Erstellung robuster Anwendungen zu steigern.

IronPDF

C# AS (Wie es für Entwickler funktioniert) Abbildung 1 - IronPDF for .NET: Die C# PDF-Bibliothek

IronPDF ermöglicht es Entwicklern, PDF-Dateien in ihren C#-Anwendungen zu erzeugen, zu bearbeiten und zu lesen. Nehmen wir einmal an, Sie hätten einen Referenztyp, der Daten enthält, und wollten diese Daten in einen Bericht oder ein Dokument umwandeln. IronPDF kann die Ausgabe Ihrer Anwendung aufnehmen und sie, ähnlich wie bei der Typumwandlung, in ein gut formatiertes PDF-Dokument übersetzen.

IronXL

C# AS (Wie es für Entwickler funktioniert) Abbildung 2 - IronXL for .NET: Die C# Excel-Bibliothek

Der Umgang mit Excel-Dateien ist eine häufige Anforderung in vielen Softwareanwendungen. IronXL for Excel Operations bietet Entwicklern die Möglichkeit, Excel-Tabellen zu lesen, zu bearbeiten und zu erstellen, ohne auf Office Interop angewiesen zu sein. Im Kontext unserer Diskussion über Typkonvertierungen können Sie IronXL als ein Tool betrachten, das es ermöglicht, Datenstrukturen oder Datenbankeinträge in C# nahtlos in Excel-Formate zu konvertieren.

IronOCR

C# AS (Wie es für Entwickler funktioniert) Abbildung 3 - IronOCR for .NET: Die C# OCR-Bibliothek

Optical Character Recognition with IronOCR ist ein Werkzeug zur optischen Zeichenerkennung, das Entwicklern ermöglicht, Text aus Bildern zu lesen und zu interpretieren. Im Zusammenhang mit unserem Tutorial ist es ähnlich wie die Umwandlung eines object (in diesem Fall ein Bild) in einen spezifischeren Typ (string oder Textdaten) unter Verwendung fortschrittlicher Erkennungsfunktionen.

IronBarcode

C# AS (Wie es für Entwickler funktioniert) Abbildung 4 - IronBarcode for .NET: Die C# Barcode Bibliothek

In vielen kommerziellen Anwendungen ist die Handhabung von Barcodes unverzichtbar. IronBarcode Tool for Barcode Processing unterstützt Entwickler beim Erstellen, Lesen und Dekodieren von Barcodes in C#-Anwendungen. Bezüglich unserer Diskussion über Typkonvertierungen kann IronBarcode als ein Werkzeug angesehen werden, das visuelle Barcode-Daten (eine Form von object) in spezifischere, verwendbare Datentypen, wie Zeichenketten oder Produktdetails, übersetzt.

Schlussfolgerung

C# AS (Wie es für Entwickler funktioniert) Abbildung 5 - Iron Suite for .NET

Jedes Produkt innerhalb der Iron Suite Offerings ist ein Zeugnis für die Flexibilität und Leistungsfähigkeit, die C# bietet, insbesondere wenn es in unsere Diskussion über Typkonvertierungen und Typüberprüfungen eingebunden ist. Diese Tools, wie die Operatoren as und is, bieten Entwicklern die Möglichkeit, Daten effizient zu konvertieren und zu verarbeiten.

Wenn Sie in Betracht ziehen, eines dieser Tools in Ihre Projekte zu integrieren, ist es erwähnenswert, dass jede Produktlizenz bei $749 beginnt und jedes Produkt eine kostenlose Testversion der Iron Suite Tools bietet. Für diejenigen, die nach einer umfassenden Lösung suchen, bietet Iron Suite ein verlockendes Angebot: Sie können die Iron Suite Lizenz erwerben zum Preis von nur zwei Produkten.

Chipego
Software-Ingenieur
Chipego hat eine natürliche Fähigkeit zum Zuhören, die ihm hilft, Kundenprobleme zu verstehen und intelligente Lösungen anzubieten. Er trat dem Iron Software-Team 2023 bei, nachdem er einen Bachelor of Science in Informationstechnologie erworben hatte. IronPDF und IronOCR sind die beiden Produkte, auf die sich Chipego konzentriert hat, aber sein Wissen über alle Produkte wächst täglich, da er neue Wege findet, Kunden zu unterstützen. Er genießt die Zusammenarbeit bei Iron Software, da Teammitglieder aus dem gesamten Unternehmen ihre unterschiedlichen Erfahrungen einbringen und so zu effektiven, innovativen Lösungen beitragen. Wenn Chipego nicht an seinem Schreibtisch sitzt, kann man ihn oft bei einem guten Buch oder beim Fußballspielen antreffen.
< PREVIOUS
C# Forms (Wie es für Entwickler funktioniert)
NÄCHSTES >
C# Datentypen (Wie es für Entwickler funktioniert)