Przejdź do treści stopki
POMOC .NET

C# AS (jak to działa dla programistów)

Programowanie w języku C# często wiąże się z pracą z różnymi typami danych. Czasami musimy sprawdzić, czy object jest określonego typu, lub spróbować przekonwertować go na ten typ. W tym miejscu przydaje się słowo kluczowe operatora as. Wraz ze swoim bliskim odpowiednikiem operator is pomaga w sprawdzaniu typów i konwersjach. W tym samouczku omówimy zawiłości tego operatora i jego zastosowania.

Zrozumienie operatora as

Podstawy operatora as

Słowo kluczowe operatora as w języku C# jest operatorem binarnym służącym do wykonywania określonych konwersji między kompatybilnymi typami referencyjnymi lub typami nullable. Poniższy kod przedstawia prostą demonstrację:

// 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

W powyższym kodzie myObj jest obiektem typu object (typ bazowy dla wszystkich typów w języku C#). Nie mamy pewności co do jego typu bazowego w czasie kompilacji. Operator as służy do próby traktowania myObj jako string. W przypadku powodzenia myStr będzie zawierać wartość ciągu znaków. W przeciwnym razie będzie miała wartość null.

Czym różni się od Explicit Cast?

Chociaż zarówno operator as, jak i jawne rzutowanie służą podobnym celom, istnieje między nimi zasadnicza różnica. Jeśli jawne rzutowanie nie powiedzie się, zgłasza wyjątek. Z drugiej strony, jeśli próba konwersji z jednego typu na inny przez operator as zakończy się niepowodzeniem, operator zwraca wartość null zamiast zgłaszać wyjątek. Zrozumiemy to na podstawie poniższego przykładu kodu:

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

Jak widać, użycie operatora as często może być bezpieczniejsze, ponieważ pozwala uniknąć potencjalnych błędów wykonania.

Związek z operatorem is

Często operator as jest używany w połączeniu z operatorem is do sprawdzania typu przed podjęciem próby konwersji. Operator is sprawdza, czy podany obiekt jest typu określonego, i zwraca true, jeśli tak jest, w przeciwnym razie zwraca false.

Poniższy przykład kodu ilustruje to:

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

Wraz z wprowadzeniem dopasowywania wzorców w późniejszych wersjach języka C# operator is może również wykonywać określone działania, jeśli test typu zakończy się powodzeniem. Często zmniejsza to potrzebę używania operatora as.

Głębsza analiza: szczególne przypadki i kwestie do rozważenia

Konwersje typów wartości nullable

Jednym ze szczególnych przypadków, w których operator as jest nieoceniony, są typy wartości, które mogą przyjmować wartość null. Typom wartości (takim jak int, double itp.) nie można przypisać wartości null. Jednak dzięki ustawieniu ich jako nullable można przypisać do nich wartość null. Operator as może służyć do próby konwersji na typ wartości, który może przyjmować wartość null:

// 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

Konwersje referencyjne i konwersje zdefiniowane przez użytkownika

Operator as obsługuje zarówno konwersje referencji (między powiązanymi typami referencji), jak i konwersje zdefiniowane przez użytkownika. Konwersje zdefiniowane przez użytkownika to konwersje zdefiniowane przy użyciu specjalnych metod konwersji w klasach.

Rozważmy następujący kod konwersji zdefiniowanej przez użytkownika:

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

W tym przypadku metoda konwersji zdefiniowana przez użytkownika pozwala na traktowanie obiektu typu Sample jako string.

Kiedy nie ma zastosowania

Należy pamiętać, że operator as nie może być używany z typami wartości (chyba że chodzi o typy wartości, które mogą przyjmować wartość null) ani z konwersjami zdefiniowanymi przez użytkownika, które obejmują metodę jawną.

Zaawansowane scenariusze z operatorem as

Pakowanie i rozpakowywanie za pomocą as

Boxing to proces przekształcania instancji typu wartościowego w odwołanie do obiektu. Jest to możliwe, ponieważ każdy typ wartości dziedziczy niejawnie po object. Kiedy umieszczasz typ wartości w ramce, otaczasz go tagiem object.

Rozważmy następujący kod służący do konwersji typów:

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

W tym przypadku intValue jest umieszczone w ramce object.

Rozpakowywanie jest procesem odwrotnym do pakowania, tj. wyodrębnianiem typu wartości z object. Operator as może być używany do bezpiecznego rozpakowywania wartości, szczególnie gdy nie masz pewności, czy object zawiera typ wartości, którego oczekujesz. Jeśli rozpakowanie nie powiedzie się, wynik wyrażenia będzie wynosił null.

Rozważmy następujący przykład konwersji związanych z rozpakowywaniem:

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

Praca z tablicami

Tablice są typami referencyjnymi w języku C#. Czasami może zaistnieć potrzeba ustalenia, czy object jest konkretnym typem tablicy, a następnie pracy z nią. Operator as może być tutaj pomocny.

Rozważmy następujący kod:

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

W powyższym kodzie arrayObject jest tablicą obiektów, ale w rzeczywistości zawiera ciągi znaków. Używając operatora as, można bezpiecznie potraktować to jako tablicę ciągów znaków.

Łączenie as z LINQ

Language Integrated Query (LINQ — dokumentacja Microsoft) to potężna funkcja języka C#, która umożliwia przeszukiwanie kolekcji w sposób podobny do języka SQL. Czasami może się zdarzyć, że w kolekcji znajdują się obiekty różnych typów i chcesz odfiltrować konkretne typy. W takiej sytuacji bardzo przydatny może być operator as.

Weźmy na przykład listę obiektów zawierającą zarówno ciągi znaków, jak i liczby całkowite. Jeśli chcesz pobrać tylko ciągi znaków, możesz użyć operatora as w połączeniu z LINQ:

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

Integracja z Iron Suite

Iron Suite Solutions for C# Developers to zestaw wysokiej jakości narzędzi, które umożliwiają programistom C# płynną integrację takich funkcji, jak obróbka plików PDF, obsługa arkuszy kalkulacyjnych Excel, optyczne rozpoznawanie znaków (OCR) oraz generowanie i odczytywanie kodów kreskowych (BarCode). Narzędzia te, podobnie jak omówione wcześniej operatory as i is, mają kluczowe znaczenie dla zwiększenia wydajności programistów w tworzeniu solidnych aplikacji.

IronPDF

C# AS (Jak to działa dla programistów) Rysunek 1 — IronPDF for .NET: biblioteka PDF w języku C#

IronPDF pozwala programistom generować, modyfikować i odczytywać pliki PDF w ramach ich aplikacji napisanych w języku C#. Biorąc pod uwagę związek z naszym tematem, załóżmy, że masz typ referencyjny zawierający pewne dane i chcesz przekształcić te dane w raport lub dokument. IronPDF może pobrać dane wyjściowe aplikacji i, w sposób podobny do konwersji typów, przetłumaczyć je na dobrze sformatowany dokument PDF.

IronXL

C# AS (Jak to działa dla programistów) Rysunek 2 — IronXL for .NET: biblioteka C# dla programu Excel

Obsługa plików Excel jest częstym wymaganiem w wielu aplikacjach. IronXL for Excel Operations zapewnia programistom możliwość odczytu, edycji i tworzenia arkuszy kalkulacyjnych Excel bez konieczności korzystania z Office Interop. W kontekście naszej dyskusji na temat konwersji typów, potraktuj IronXL jako narzędzie, które pozwala na płynną konwersję struktur danych lub wpisów baz danych w C# do formatów Excel.

IronOCR

C# AS (Jak to działa dla programistów) Rysunek 3 — IronOCR for .NET: biblioteka IronOCR w języku C#

Optical Character Recognition with IronOCR to narzędzie do optycznego rozpoznawania znaków, które pozwala programistom odczytywać i interpretować tekst z obrazów. W nawiązaniu do naszego samouczka jest to podobne do konwersji object (w tym przypadku obrazu) na bardziej konkretny typ (string lub dane tekstowe) przy użyciu zaawansowanych funkcji rozpoznawania.

IronBarcode

C# AS (Jak to działa dla programistów) Rysunek 4 — IronBarcode for .NET: biblioteka IronBarcode w języku C#

W wielu aplikacjach komercyjnych obsługa BarCodes jest niezbędna. IronBarcode Tool for Barcode Processing pomaga programistom w generowaniu, odczytywaniu i dekodowaniu BARCODE-ów w aplikacjach napisanych w języku C#. W nawiązaniu do naszej dyskusji na temat konwersji typów, IronBarcode można postrzegać jako narzędzie, które przekształca wizualne dane BarCode (formę object) na bardziej konkretne, użyteczne typy danych, takie jak ciągi znaków lub szczegóły produktu.

Wnioski

C# AS (Jak to działa dla programistów) Rysunek 5 — Iron Suite for .NET

Każdy produkt w ramach oferty Iron Suite stanowi świadectwo elastyczności i mocy języka C#, zwłaszcza w kontekście naszej dyskusji na temat konwersji typów i sprawdzania typów. Narzędzia te, podobnie jak operatory as i is, zapewniają programistom możliwość wydajnej konwersji i przetwarzania danych.

Jeśli rozważasz włączenie któregokolwiek z tych narzędzi do swoich projektów, warto zauważyć, że cena licencji każdego produktu zaczyna się od $799, a każdy produkt oferuje bezpłatną wersję próbną pakietu Iron Suite Tools. Dla osób poszukujących kompleksowego rozwiązania Iron Suite ma atrakcyjną ofertę: licencję na pakiet Iron Suite można nabyć za cenę zaledwie dwóch produktów.

Często Zadawane Pytania

Jaka jest rola operatora 'as' w rozwoju C#?

Operator 'as' w C# jest uzywany do bezpiecznych konwersji typow miedzy kompatybilnymi typami referencyjnymi lub typami nulownymi, zwracajac null, jesli konwersja nie powiedzie sie, unikajac w ten sposob wyjatkow.

Jak mozna bezpiecznie obslugiwac konwersje typow w C#?

Mozna uzywac operatora 'as' do bezpiecznych konwersji typow, poniewaz zwraca null zamiast wyrzucac wyjatek, gdy konwersja sie nie powiedzie, co czyni go bezpieczniejszym niz rzutowanie jawne.

Dlaczego operator 'as' jest preferowany nad jawnym rzutowaniem w niektorych scenariuszach?

Operator 'as' jest preferowany, gdy chcesz uniknac wyjatkow spowodowanych nieudanymi konwersjami, poniewaz zwraca null zamiast wyrzucac wyjatek, w odroznieniu od jawnego rzutowania.

Jak dziala operator 'as' z typami nulownymi w C#?

Operator 'as' moze byc uzywany z typami nulownymi, pozwalajac na bezpieczna konwersje, ktora zwraca null, jesli obiektu nie mozna przekonwertowac do okreslonego typu nulownego.

Jak mozna uzywac IronPDF w C# do konwersji dokumentow?

IronPDF umozliwia programistom C# konwersje HTML do PDF, manipulowanie zawartoscia PDF i generowanie plikow PDF programowo, zwiekszajac mozliwosci obslugi dokumentow w aplikacjach.

Jakie sa zalety uzywania Iron Suite dla programistow C#?

Iron Suite oferuje narzedzia takie jak IronPDF, IronXL, IronOCR i IronBarcode, pozwalajac programistom efektywnie obslugiwac konwersje i manipulacje danymi w roznych formatach.

Jak mozna filtrowac konkretne typy z kolekcji w C#?

Mozna uzywac operatora 'as' w polaczeniu z zapytaniami LINQ do filtrowania okreslonych typow z kolekcji, zapewniajac wybor tylko pozadanego typu z mieszanych list obiektow.

Jaki jest powszechny przypadek uzycia laczenia operatorow 'is' i 'as' w C#?

Laczenie operatorow 'is' i 'as' pozwala najpierw sprawdzic typ obiektu za pomoca 'is', zanim bezpiecznie przeksztalcimy go za pomoca 'as', zapewniajac bezpieczenstwo typu i unikajac wyjatkow.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie