Saltar al pie de página
.NET AYUDA

C# AS (Cómo funciona para desarrolladores)

Programar en C# a menudo implica trabajar con diferentes tipos de datos. A veces, necesitamos verificar si un objeto es de un cierto tipo o intentar convertirlo a ese tipo. Ahí es donde la palabra clave del operador as es útil. Junto con su par cercano, el operador is ayuda en pruebas de tipo y conversiones. En este tutorial, exploraremos las complejidades de este operador y sus casos de uso.

Entender el operador as

Básicos del operador as

La palabra clave del operador as en C# es un operador binario usado para realizar ciertas conversiones entre tipos de referencia compatibles o tipos anulables. El siguiente código proporciona una demostración sencilla:

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

En el código anterior, myObj es un objeto del tipo object (el tipo base para todos los tipos en C#). No estamos seguros de su tipo subyacente en tiempo de compilación. El operador as se usa para intentar tratar myObj como un string. Si tiene éxito, myStr contendrá el valor de cadena. De lo contrario, contendrá un valor null.

¿En qué se diferencia de la fundición explícita?

Aunque tanto el operador as como la conversión explícita sirven para propósitos similares, hay una diferencia clave. Si una conversión explícita falla, lanza una excepción. Por otro lado, si el intento del operador as de convertir de un tipo a otro falla, el operador devuelve un valor null en lugar de lanzar una excepción. Entendamos esto con el siguiente ejemplo de código:

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

Como es evidente, usar el operador as puede ser a menudo más seguro ya que se evitan posibles errores en tiempo de ejecución.

La conexión con el operador is

A menudo, el operador as se utiliza junto con el operador is para pruebas de tipo antes de intentar una conversión. El operador is verifica si el objeto proporcionado es del tipo dado y devuelve true si lo es, de lo contrario, devuelve false.

El siguiente ejemplo de código ilustra esto:

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

Con la introducción de las coincidencias de patrones en versiones posteriores de C#, el operador is también puede realizar ciertas acciones si la prueba de tipo pasa. Esto a menudo reduce la necesidad de usar el operador as.

Aprofundizando: Casos especiales y consideraciones

Conversiones de tipos de valores anulables

Uno de los casos especiales donde el operador as es invaluable es con tipos de valor anulables. Los tipos de valor (como int, double, etc.) no pueden tener un valor null asignado. Sin embargo, si los hacemos anulables, se les puede asignar null. El operador as se puede usar para intentar la conversión a un tipo de valor anulable:

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

Conversiones de referencia y conversiones definidas por el usuario

El operador as admite tanto conversiones de referencia (entre tipos de referencia relacionados) como conversiones definidas por el usuario. Las conversiones definidas por el usuario son aquellas conversiones que se definen mediante métodos de conversión especiales en tus clases.

Considere el siguiente código de una conversión definida por el usuario:

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

Aquí, el método de conversión definido por el usuario permite que un objeto del tipo Sample sea tratado como un string.

Cuando como no se aplica

Recuerde que el operador as no se puede usar con tipos de valor (a menos que se trate de tipos de valor anulables) o con conversiones definidas por el usuario que impliquen un método explícito.

Escenarios avanzados con el operador as

Boxing y unboxing con as

El encapsulado es el proceso de convertir una instancia de tipo-valor a una referencia de objeto. Esto es posible porque cada tipo de valor hereda implícitamente de un object. Cuando encapsulas un tipo de valor, lo envuelves dentro de un object.

Considere el siguiente código para conversiones de encapsulado:

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

Aquí, el intValue se encapsula en un object.

El desarrollo es el proceso inverso de encapsulado, es decir, extraer el tipo de valor del object. El operadoras puede usarse para desempaquetar valores de manera segura, particularmente cuando no estás seguro si el object contiene el tipo de valor que esperas. Si el desempaquetado es infructuoso, el resultado de la expresión será null.

Considere el siguiente ejemplo para conversiones de desempaquetado:

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

Trabajar con matrices

Los arreglos son tipos de referencia en C#. A veces, es posible que necesites determinar si un object es un tipo específico de arreglo y luego trabajar con él. El operador as puede ayudar aquí también.

Considere el siguiente código:

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

En el código anterior, arrayObject es un arreglo de objetos, pero de hecho contiene cadenas. Usando el operador as, puedes intentar con seguridad tratarlo como un arreglo de cadenas.

Combinación de as con LINQ

El Lenguaje Integrado de Consultas (LINQ - Documentación de Microsoft) es una característica poderosa en C# que te permite consultar colecciones de una manera similar a SQL. A veces, puedes recuperar objetos de tipos mixtos en una colección y querer filtrar tipos específicos. Aquí, el operador as puede ser muy útil.

Por ejemplo, considera una lista de objetos que contienen tanto cadenas como enteros. Si quisieras recuperar solo las cadenas, podrías usar el operador as junto con 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

Integración con Iron Suite

Soluciones Iron Suite para Desarrolladores de C# es un conjunto de herramientas de alta calidad que permite a los desarrolladores de C# integrar sin problemas funcionalidades como la manipulación de PDF, manejo de Excel, Reconocimiento Óptico de Caracteres (OCR) y generación y lectura de códigos de barras. Estas herramientas, como nuestra discusión anterior sobre los operadores as y is, son fundamentales para ampliar la eficiencia de un desarrollador al crear aplicaciones robustas.

HierroPDF

C# AS (Cómo Funciona para Desarrolladores) Figura 1 - IronPDF para .NET: La Biblioteca C# para PDF

IronPDF permite a los desarrolladores generar, manipular y leer archivos PDF dentro de sus aplicaciones C#. Considerando la relevancia para nuestro tema, supongamos que tenías un tipo de referencia que contenía algunos datos, y querías convertir estos datos en un informe o documento. IronPDF puede tomar la salida de tu aplicación y, de una manera similar a la conversión de tipos, traducirla en un documento PDF bien formateado.

IronXL

C# AS (Cómo Funciona para Desarrolladores) Figura 2 - IronXL para .NET: La Biblioteca C# para Excel

El manejo de archivos Excel es un requisito frecuente en muchas aplicaciones de software. IronXL para Operaciones Excel proporciona a los desarrolladores la capacidad de leer, editar y crear hojas de cálculo Excel sin necesidad de depender de Office Interop. En el contexto de nuestra discusión sobre conversiones de tipo, piensa en IronXL como una herramienta que te permite convertir estructuras de datos o entradas de base de datos en C# en formatos de Excel sin problemas.

IronOCR

C# AS (Cómo Funciona para Desarrolladores) Figura 3 - IronOCR para .NET: La Biblioteca C# para OCR

Reconocimiento Óptico de Caracteres con IronOCR es una herramienta de reconocimiento óptico de caracteres que permite a los desarrolladores leer e interpretar texto de imágenes. Relacionándolo con nuestro tutorial, es similar a convertir un objeto (en este caso, una imagen) a un tipo más específico (string o datos textuales) usando capacidades de reconocimiento avanzadas.

Código de barras de hierro

C# AS (Cómo Funciona para Desarrolladores) Figura 4 - IronBarcode para .NET: La Biblioteca C# para Código de Barras

En muchas aplicaciones comerciales, el manejo de códigos de barras es indispensable. Herramienta IronBarcode para Procesamiento de Códigos de Barras ayuda a los desarrolladores a generar, leer y decodificar códigos de barras en aplicaciones C#. Relacionando con nuestra discusión sobre conversiones de tipo, IronBarcode puede verse como una herramienta que traduce datos de código de barras visuales (una forma de objeto) en tipos de datos más específicos y utilizables, como cadenas o detalles de productos.

Conclusión

C# AS (Cómo Funciona para Desarrolladores) Figura 5 - Iron Suite for .NET

Cada producto dentro de las Ofertas de Iron Suite es un testimonio de la flexibilidad y el poder que ofrece C#, especialmente cuando se vincula a nuestra discusión sobre conversiones de tipo y verificación de tipo. Estas herramientas, como los operadores as y is, proporcionan a los desarrolladores la capacidad de convertir y procesar datos eficientemente.

Si estás considerando integrar alguna de estas herramientas en tus proyectos, vale la pena señalar que cada licencia de producto comienza desde $799 y cada producto ofrece una prueba gratuita de herramientas Iron Suite. Para aquellos que buscan una solución integral, Iron Suite ofrece una oferta atractiva: puedes adquirir la licencia de Iron Suite al precio de solo dos productos.

Preguntas Frecuentes

¿Cuál es el papel del operador 'as' en el desarrollo de C#?

El operador 'as' en C# se utiliza para realizar conversiones de tipo seguras entre tipos de referencia compatibles o tipos anulables, devolviendo null si la conversión no tiene éxito, evitando así excepciones.

¿Cómo puedes manejar conversiones de tipo de manera segura en C#?

Puedes usar el operador 'as' para conversiones de tipo seguras, ya que devuelve null en lugar de lanzar una excepción cuando la conversión falla, haciéndolo más seguro que el casting explícito.

¿Por qué se prefiere el operador 'as' sobre el casting explícito en ciertos escenarios?

Se prefiere el operador 'as' cuando deseas evitar excepciones causadas por conversiones fallidas, ya que devuelve null en lugar de lanzar una excepción, a diferencia del casting explícito.

¿Cómo funciona el operador 'as' con tipos anulables en C#?

El operador 'as' se puede usar con tipos anulables, permitiendo una conversión segura que devuelve null si el objeto no puede ser convertido al tipo anulable especificado.

¿Cómo se puede utilizar IronPDF en C# para la conversión de documentos?

IronPDF permite a los desarrolladores de C# convertir HTML a PDF, manipular contenidos de PDF y generar archivos PDF programáticamente, mejorando las capacidades de manejo de documentos en aplicaciones.

¿Cuáles son las ventajas de usar Iron Suite para desarrolladores de C#?

Iron Suite ofrece herramientas como IronPDF, IronXL, IronOCR, y IronBarcode, permitiendo a los desarrolladores manejar la conversión y manipulación de datos a través de varios formatos de manera eficiente.

¿Cómo puedes filtrar tipos específicos de una colección usando C#?

Puedes usar el operador 'as' junto con consultas LINQ para filtrar tipos específicos de una colección, asegurando que solo el tipo deseado sea seleccionado de listas de objetos mixtos.

¿Cuál es un caso de uso común para combinar los operadores 'is' y 'as' en C#?

Combinar los operadores 'is' y 'as' te permite primero verificar el tipo de un objeto con 'is' antes de convertirlo de manera segura usando 'as', asegurando la seguridad de tipos y evitando excepciones.

Jacob Mellor, Director de Tecnología @ Team Iron
Director de Tecnología

Jacob Mellor es Director de Tecnología en Iron Software y un ingeniero visionario que lidera la tecnología PDF en C#. Como el desarrollador original detrás de la base de código central de Iron Software, ha moldeado la arquitectura de productos de la compañía desde ...

Leer más