Zum Fußzeileninhalt springen
.NET HILFE

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

Programmieren in C# beinhaltet oft die Arbeit mit verschiedenen Datentypen. Manchmal müssen wir überprüfen, ob ein object von einem bestimmten Typ ist oder versuchen, es in diesen Typ zu konvertieren. Hier kommt das as-Operator-Schlüsselwort ins Spiel. Zusammen mit seinem nahen Verwandten unterstützt der is-Operator das Testen und Konvertieren von Typen. In diesem Tutorial werden wir die Feinheiten dieses Operators und seine Anwendungsfälle erkunden.

Verständnis des as-Operators

Grundlagen des as-Operators

Das as-Operator-Schlüsselwort 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:

// Declare an object that holds a string
object myObj = "Hello, World!";

// Use the 'as' operator to attempt to convert 'myObj' to a string
string myStr = myObj as string;

// myStr will hold the string value "Hello, World!" if the conversion is successful;
// otherwise, it will be null.
// Declare an object that holds a string
object myObj = "Hello, World!";

// Use the 'as' operator to attempt to convert 'myObj' to a string
string myStr = myObj as string;

// myStr will hold the string value "Hello, World!" if the conversion is successful;
// otherwise, it will be null.
' Declare an object that holds a string
Dim myObj As Object = "Hello, World!"

' Use the 'as' operator to attempt to convert 'myObj' to a string
Dim myStr As String = TryCast(myObj, String)

' myStr will hold the string value "Hello, World!" if the conversion is successful;
' otherwise, it will be null.
$vbLabelText   $csharpLabel

Im obigen Code ist myObj ein Objekt vom Typ object (der Basistyp für alle Typen in C#). Wir sind uns seines zugrunde liegenden Typs zur Compile-Zeit unsicher. Der as-Operator wird verwendet, um zu versuchen, myObj als string zu behandeln. Wenn erfolgreich, wird myStr den String-Wert halten. Andernfalls wird es einen null-Wert halten.

Unterscheidet sich von Explicit Cast?

Während sowohl der as-Operator als auch der explizite Cast ähnliche Zwecke erfüllen, gibt es einen wesentlichen Unterschied. Wenn ein expliziter Cast fehlschlägt, wird eine Ausnahme ausgelöst. Andererseits, wenn der Versuch des as-Operators, von einem Typ zu einem anderen zu konvertieren, scheitert, gibt der Operator einen null-Wert zurück, anstatt eine Ausnahme auszulösen. Lassen Sie uns das mit dem folgenden Codebeispiel verstehen:

object someValue = 12345;
string castResult;

// Using explicit cast
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null; // The result is set to null if an exception is caught.
}

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

// Using explicit cast
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null; // The result is set to null if an exception is caught.
}

// 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
Dim castResult As String

' Using explicit cast
Try
	castResult = DirectCast(someValue, String) ' This will throw an exception since the cast fails.
Catch ex As Exception
	castResult = Nothing ' The result is set to null if an exception is caught.
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 eine Konvertierung versucht wird. Der is-Operator überprüft, ob das angegebene Objekt vom angegebenen Typ ist und gibt true zurück, wenn es so ist, andernfalls gibt es false zurück.

Das folgende Codebeispiel veranschaulicht dies:

object testObject = "This is a string";

// Check if testObject is of type string
if (testObject is string) {
    // If true, convert testObject to string using 'as'
    string result = testObject as string;
    Console.WriteLine(result); // Outputs: This is a string
} else {
    Console.WriteLine("Not a string");
}
object testObject = "This is a string";

// Check if testObject is of type string
if (testObject is string) {
    // If true, convert testObject to string using 'as'
    string result = testObject as string;
    Console.WriteLine(result); // Outputs: This is a string
} else {
    Console.WriteLine("Not a string");
}
Dim testObject As Object = "This is a string"

' Check if testObject is of type string
If TypeOf testObject Is String Then
	' If true, convert testObject to string using 'as'
	Dim result As String = TryCast(testObject, String)
	Console.WriteLine(result) ' Outputs: This is a string
Else
	Console.WriteLine("Not a string")
End If
$vbLabelText   $csharpLabel

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

Tiefer eintauchen: Sonderfälle und Überlegungen

Nullbare Werttyp-Konvertierungen

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

// Declare a nullable integer
int? nullableInt = 10;

// Box the nullable int
object objInt = nullableInt;

// Attempt to unbox using 'as' to a nullable int type
int? resultInt = objInt as int?;
// Declare a nullable integer
int? nullableInt = 10;

// Box the nullable int
object objInt = nullableInt;

// Attempt to unbox using 'as' to a nullable int type
int? resultInt = objInt as int?;
' Declare a nullable integer
Dim nullableInt? As Integer = 10

' Box the nullable int
Dim objInt As Object = nullableInt

' Attempt to unbox using 'as' to a nullable int type
Dim resultInt? As Integer = CType(objInt, Integer?)
$vbLabelText   $csharpLabel

Referenzkonversionen und benutzerdefinierte Konversionen

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

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

class Sample {
    // Define an implicit conversion from Sample to string
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();

// Use 'as' to convert 'sampleObject' to string
string conversionResult = sampleObject as string;

// conversionResult will hold "Converted to String"
class Sample {
    // Define an implicit conversion from Sample to string
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();

// Use 'as' to convert 'sampleObject' to string
string conversionResult = sampleObject as string;

// conversionResult will hold "Converted to String"
Friend Class Sample
	' Define an implicit conversion from Sample to string
	Public Shared Widening Operator CType(ByVal s As Sample) As String
		Return "Converted to String"
	End Operator
End Class

Private sampleObject As New Sample()

' Use 'as' to convert 'sampleObject' to string
Private conversionResult As String = TryCast(sampleObject, String)

' conversionResult will hold "Converted to String"
$vbLabelText   $csharpLabel

Hier erlaubt die benutzerdefinierte Konvertierungsmethode, ein Objekt vom Typ Sample als string zu behandeln.

Wenn as nicht zutrifft

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

Fortgeschrittene Szenarien mit dem as-Operator

Boxing und Unboxing mit as

Boxing ist der Prozess der Umwandlung einer Werttypinstanz in eine Objekt-Referenz. Dies ist möglich, weil jeder Werttyp implizit von einem object erbt. Wenn Sie einen Wertetyp boxen, binden Sie ihn in ein object.

Betrachten Sie den folgenden Code für Boxing-Konvertierungen:

int intValue = 42;

// Box the value type to an object
object boxedValue = intValue;
int intValue = 42;

// Box the value type to an object
object boxedValue = intValue;
Dim intValue As Integer = 42

' Box the value type to an object
Dim boxedValue As Object = intValue
$vbLabelText   $csharpLabel

Hier wird der intValue in ein object geboxed.

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

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

object obj = 42;

// Attempt to unbox using 'as' to a nullable int type
int? result = obj as int?;
object obj = 42;

// Attempt to unbox using 'as' to a nullable int type
int? result = obj as int?;
Dim obj As Object = 42

' Attempt to unbox using 'as' to a nullable int type
Dim result? As Integer = CType(obj, Integer?)
$vbLabelText   $csharpLabel

Arbeiten mit Arrays

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

Betrachten Sie den folgenden Code:

object[] arrayObject = new string[] { "one", "two", "three" };

// Attempt to cast to a string array using 'as'
string[] stringArray = arrayObject as string[];

// stringArray will hold the array of strings if successful
object[] arrayObject = new string[] { "one", "two", "three" };

// Attempt to cast to a string array using 'as'
string[] stringArray = arrayObject as string[];

// stringArray will hold the array of strings if successful
Dim arrayObject() As Object = New String() { "one", "two", "three" }

' Attempt to cast to a string array using 'as'
Dim stringArray() As String = TryCast(arrayObject, String())

' stringArray will hold the array of strings if successful
$vbLabelText   $csharpLabel

Im obigen Code ist arrayObject ein Array von Objekten, das tatsächlich Strings enthält. 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-Dokumentation) ist eine leistungsstarke Funktion in C#, die es Ihnen ermöglicht, Sammlungen in einer SQL-ähnlichen Weise abzufragen. Manchmal können Sie Objekte gemischter Typen in einer Sammlung abrufen und möchten spezifische Typen filtern. Hier kann der as-Operator sehr praktisch sein.

Zum Beispiel, betrachten Sie eine Liste von Objekten, die sowohl Strings als auch Ganzzahlen enthält. Wenn Sie nur die Strings abrufen wollten, könnten Sie den as-Operator in Verbindung mit LINQ verwenden:

var mixedList = new List<object> { "Hello", 42, "World", 100 };

// Use LINQ to select only strings from mixedList
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();

// stringValues will contain "Hello" and "World"
var mixedList = new List<object> { "Hello", 42, "World", 100 };

// Use LINQ to select only strings from mixedList
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();

// stringValues will contain "Hello" and "World"
Dim mixedList = New List(Of Object) From {"Hello", 42, "World", 100}

' Use LINQ to select only strings from mixedList
Dim stringValues = mixedList.Select(Function(item) TryCast(item, String)).Where(Function(item) item IsNot Nothing).ToList()

' stringValues will contain "Hello" and "World"
$vbLabelText   $csharpLabel

Integration mit Iron Suite

Iron Suite Solutions for C# Developers ist eine Suite von hochwertigen Tools, die C#-Entwickler befähigen, Funktionen wie die PDF-Manipulation, Excel-Bearbeitung, Zeichen-Optische Erkennung (OCR) und Barcode-Erzeugung und -Lesen nahtlos zu integrieren. Diese Tools sind, ebenso wie unsere vorherige Diskussion über die as und is-Operatoren, 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 innerhalb ihrer C#-Anwendungen zu erzeugen, zu manipulieren und zu lesen. In Bezug auf unser Thema, nehmen wir an, Sie hatten einen Referenztyp, der einige Daten enthält, und Sie wollten diese Daten in einen Bericht oder ein Dokument umwandeln. IronPDF kann die Ausgabe Ihrer Anwendung nehmen und, in einer Art und Weise, die der Typkonvertierung ähnelt, sie 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 in vielen Softwareanwendungen eine häufige Anforderung. 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, denken Sie an IronXL als ein Tool, das es Ihnen 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 mit IronOCR ist ein Tool zur optischen Zeichenerkennung, das es Entwicklern ermöglicht, Text aus Bildern zu lesen und zu interpretieren. Um dies mit unserem Tutorial zu verbinden, ist es ähnlich der Konvertierung eines object (in diesem Fall ein Bild) in einen spezifischeren Typ (string oder Textdaten) unter Verwendung fortschrittlicher Erkennungsmöglichkeiten.

IronBarcode

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

In vielen kommerziellen Anwendungen ist der Umgang mit Barcodes unerlässlich. IronBarcode Tool for Barcode Processing hilft Entwicklern bei der Erzeugung, dem Lesen und dem Dekodieren von Barcodes in C#-Anwendungen. In Bezug auf unsere Diskussion über Typkonvertierungen kann IronBarcode als ein Tool angesehen werden, das visuelle Barcode-Daten (eine Form von object) in spezifischere, nutzbare Datentypen, wie Strings oder Produktdetails, übersetzt.

Abschluss

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 Typprüfungen einfließt. Diese Tools bieten Entwicklern die Möglichkeit, Daten effizient zu konvertieren und zu verarbeiten, ähnlich wie die as und is-Operatoren.

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

Häufig gestellte Fragen

Welche Rolle spielt der 'as'-Operator in der C#-Entwicklung?

Der 'as'-Operator in C# wird verwendet, um sichere Typkonvertierungen zwischen kompatiblen Referenztypen oder Nullable Typen durchzuführen. Wenn die Konvertierung fehlschlägt, wird null zurückgegeben, wodurch Ausnahmen vermieden werden.

Wie können Sie Typkonvertierungen in C# sicher handhaben?

Sie können den 'as'-Operator für sichere Typkonvertierungen verwenden, da er null statt einer Ausnahme zurückgibt, wenn die Konvertierung fehlschlägt, was ihn sicherer macht als explizites Casting.

Warum wird der 'as'-Operator in bestimmten Szenarien dem expliziten Casting vorgezogen?

Der 'as'-Operator wird bevorzugt, wenn Sie Ausnahmen vermeiden möchten, die durch fehlgeschlagene Konvertierungen verursacht werden. Er gibt null statt einer Ausnahme zurück, im Gegensatz zum expliziten Casting.

Wie funktioniert der 'as'-Operator mit Nullable Typen in C#?

Der 'as'-Operator kann mit Nullable Typen verwendet werden, wodurch eine sichere Konvertierung ermöglicht wird, die null zurückgibt, wenn das Objekt nicht in den angegebenen Nullable Typ konvertiert werden kann.

Wie kann IronPDF in C# für die Dokumentenkonvertierung verwendet werden?

IronPDF ermöglicht es C#-Entwicklern, HTML in PDF zu konvertieren, PDF-Inhalte zu manipulieren und PDF-Dateien programmgesteuert zu generieren, wodurch die Dokumentenverwaltung in Anwendungen verbessert wird.

Welche Vorteile bietet die IronSuite für C#-Entwickler?

Die IronSuite bietet Werkzeuge wie IronPDF, IronXL, IronOCR und IronBarcode, die es Entwicklern ermöglichen, Datenkonvertierungen und -manipulationen über verschiedene Formate hinweg effizient zu handhaben.

Wie können Sie mit C# spezifische Typen aus einer Sammlung filtern?

Sie können den 'as'-Operator in Verbindung mit LINQ-Abfragen verwenden, um spezifische Typen aus einer Sammlung zu filtern und sicherzustellen, dass nur der gewünschte Typ aus gemischten Objektlisten ausgewählt wird.

Was ist ein häufiger Anwendungsfall für die Kombination der 'is'- und 'as'-Operatoren in C#?

Die Kombination der 'is'- und 'as'-Operatoren ermöglicht es Ihnen, zuerst den Typ eines Objekts mit 'is' zu überprüfen, bevor es sicher mit 'as' konvertiert wird, um Typensicherheit zu gewährleisten und Ausnahmen zu vermeiden.

Jacob Mellor, Chief Technology Officer @ Team Iron
Chief Technology Officer

Jacob Mellor ist Chief Technology Officer bei Iron Software und ein visionärer Ingenieur, der führend in der C# PDF-Technologie ist. Als ursprünglicher Entwickler der Iron Software-Kerncodebasis hat er die Produktarchitektur des Unternehmens seit seiner Gründung gestaltet und zusammen mit CEO Cameron Rimington in ein Unternehmen ...

Weiterlesen